Idiots in my internets.

    «Zwei Dinge sind unendlich: Das Universum und die menschliche Dummheit. Aber beim Universum bin ich mir nicht ganz sicher.»* — Albert Einstein


    Дело было вечером, и делать, как водится, было много чего, но лень.
    По случайной ссылке пришел на один сайт, адрес которого я не привожу из очевидных соображений этического характера. Флешевая поделка; суть ее в следующем: тыкаем по свободному месту, и нам предлагают загрузить на это самое место свою картинку и приписать к ней ник. Моей фантазии оказалось недостаточно, чтобы представить, сколько радости способен доставить человеку простой советский флешер.

    Захотелось посмотреть, как сделана, если сделана вообще, защита от автоматического ввода информации; может быть, написать тривиального бота и занять пару десятков мест своими картинками.
    Загрузил картинку, написал ник…

    Однако, то, что я увидел в Fiddler'е, оказалось куда занимательнее любого бота.

    Итак, что мы видим? Обыкновенный HTTP Post-запрос, в контенте какой-то бинарный мусор и — глазам своим верить? — что это? — SQL-запрос?!

    Да, граждане, мы с вами многое видели. Видели переполнения буферов на C. Видели SQL-инъекции в плохом PHP-шном коде. Этим всем нас не удивишь. Но Альберт Германович был чертовски прав, и за мыслью отдельных индивидов нам, людям средним и заурядным не угнаться: вам бы пришло в голову формировать SQL-запрос на клиенте и передавать его на сервер для исполнения? Бедна, бедна наша фантазия.

    Про то, что никакой санитизации ввода нет, я даже и упоминать не стану, думаю, это уже очевидно. Так что, вбив в поле ввода текст с кавычкой, мы получаем еще один повод для тихого веселья: сервер прямо и открыто, как подобает приличной программе отдает ошибку MySQL.


    Да, действительно, с синтаксисом стало не все в порядке.

    Справедливости ради надо сказать, что просто подменить SQL в теле Post-запроса не выйдет — не сойдется контрольная сумма где-то в бинарной части. Не много полезного выйдет и из инъекции через поле текстового ввода: есть ограничение на длину вводимого текста, да и несколько команд, разделенных точкой с запятой серверная часть принимать благоразумно отказывается.

    Эта элементарная мера предосторожности, конечно, никак не влияет на главную проблему — исполнение формируемого на клиентской стороне SQL-запроса. При определенном желании подменить сам запрос вполне возможно, что и было проделано путем легкой модификации флешовой части. О подробностях я снова умолчу по этическим соображениям. А если бы мы еще и Flash знали…

    В качестве proof of concept мы меняем ник нами же только что зарегистрированного пользователя, выполняя SQL-запрос
    update `peoples` set name='новый ник' where name='старый ник'

    Я думаю, не нужно говорить, что чьи-то еще намерения могут быть совсем не такими мирными.

    Разумеется, администрация сайта об уязвимости извещена. По крайней мере, я сделал все возможное, поскольку адресов ни веб-мастера, ни администратора на сайте нет.

    Мораль: используйте мозг, люди. Пожалуйста.

    P.S. В процессе написания данной статьи много кто чуть не пострадал, поскольку хабр никак не желал загружать картинки при редактировании сохраненной версии, упорно вываливась на ошибке Javascript'а «uncaught exception: Permission denied to get property HTMLDocument.getElementById»
    Возникает эта ошибка при попытке вызова sts_put_opener() из дочернего ифрейма. Связано это с тем, что родительский ифрейм на поддомене (paul7.habrahabr.ru), а дочерний — на основном, так что POST-запрос проходил успешно, но результатов я не получал. Пришлось ссылки выцеплять с помощью того же верного Fiddler'а. Безобразие, откровенно говоря.

    P.P.S. Дорогой CTO! Если ты прочтешь этот топик, пожалуйста, не переводи меня в тестеры! Это мне временно так везет… Надеюсь.

    * «Есть только две бесконечные вещи: вселенная и человеческая глупость. Правда, насчет вселенной я не уверен»

    Комментарии 8

      0
      да, защита дерьмовая. сначала забиваем на качество, плодим быдлокодеров.
      кстати, эта фишка с формированием запроса на клиенте по-моему не дает им чего-то выиграть и в скоростти. почему так сделали?)
        0
        Я сомневаюсь, что они думали не только о скорости, но и о чем бы то ни было вообще.
        Они прямо из флеша вызывают функцию, работающую с сервером БД. Получается, разумеется, RPC. Модно ;)
        А RPC сам по себе не виноват, он же не знает, что по нему захотят передавать плейнтекстом.
          0
          а это так нереально)
        +2
        Не устаю поражаться, на какую только херню человек не способен потратить свою единственную жизнь. Отрыть на каком то левом сайте, какой-то придурочный пэхапэшный код, трахаться с какими-то sts_put_opener() из дочернего ифрейма... сообщать их администраторам и ещё писать всю это поебень на хабр, делая слепки экранов, дабы отнять бесценное время уважаемых хабравчан.

        Как будто вокруг нет мудрых книг и красивых женщин. :-)
          0
          Вы предлагаете писать сюда про красивых женщин?
            +1
            Поймите правильно. Есть некоторая разница между анализом чужих ошибок и препарированием глупостей, которые делают новички. Ошибки это то, что делают квалифицированные люди, в силу того, что некий вопрос плохо освещён или часто встречается его неправильное понимание. Анализ их ошибок нас учит.
            С другой стороны, есть просто абсолютно неквалифицированные люди, делающие первые шаги или просто неумные. Если вы занимаетесь их обучением, вы им можете указать на ошибки. Просто же тщательно знакомить всех с абсолютно дилетанской работой совершенно непонятно кого (ну не обучался чел, ну не прочёл вообще никакой книги... да мало ли причин) это банальная трата своего и чужого времени. Таких левых сайтов полинтернета. Никакой жизни не хватит.
            +2
            это-таки наука для кодеров, делающих первые шаги. Нехай читают. С картинками.
            0
            Учимся на чужих ошибках!

            Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

            Самое читаемое