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 мы меняем ник нами же только что зарегистрированного пользователя.

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

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

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

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

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

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

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

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

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