Как стать автором
Обновить

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! Если ты прочтешь этот топик, пожалуйста, не переводи меня в тестеры! Это мне временно так везет… Надеюсь.

* «Есть только две бесконечные вещи: вселенная и человеческая глупость. Правда, насчет вселенной я не уверен»
Теги:
Хабы:
Всего голосов 9: ↑8 и ↓1 +7
Просмотры 321
Комментарии Комментарии 8