mosaique by arthur gerkis @ax330d
DESCRIPTION
PHP image conversion filters bypassTRANSCRIPT
http://0x416d73.namehttp://0x416d73.name v 0.6
Crime on the wire
Безопасность «Мозаика атак из загрузки картинок» 18 June, 11
При аудите веб-приложений, нередко в функционале присутствует загрузка картинок в профиль. Сегодня, казалось бы, никого не удивишь правиламихорошего тона безопасной загрузки и обработки картинок. Тем не менее, не всегда проверки оказываются достаточными, тем самым оставляя лазейкидля злоумышленников. А недавно я наткнулся на не то, чтобы новую, но интересную комбинацию возможностей вкупе с разного рода ограничениями.
Наиболее существенным ограничением в исследуемом приложении оказалось изменение размера картинок. Даже если картинка соответствует требуемымширине и высоте, то всё-равно она насильно прогоняетя через PHP функцию, тем самым сильно изменяя порядок и сами байты файла. В общем, ситуациятакова:
допускаются картинки определённого размера;только в определённую папку;в приложении есть проверка картинки при помощи PHP-функции - действительно ли пользователь грузит картинку, а не что-либо другое;в итоге изменение ширины и высоты картинки;
Через веб-интерфйес всё выглядит пуленепробиваемо, однако, бронежилет отказался не надетым на голову. Я набросал перловый скрипт, который делаетзапросы напрямую к приложению, и тут выяснилось, что картинки можно загружать с произвольным расширением. Думал, припишу PHP-расширение идело в шляпе, но не тут-то было. Сервер настроен так, что в папке картинок *.php и еже с ним, всё отдавалось клиенту, как файл.
Что можно сделать в такой ситуации? Первое, что мне пришло в голову, это хранимая XSS. Сохранив картинку, как html-файл, можно получитьжелаемое. Нам необходимо hex-редактором вставить свой вектор таким образом, чтобы его не покорёжили PHP-функции. Немного ограниченный, ноработоспособный вариант "обхода" ресайза картинок, это повторная загрузка уже обработанной картинки. Таким образом будет видно, какие байты точносидят на месте, а какие подвергаются изменениям и тогда можно соорудить нужный вектор. На картинке показан вектор, написанный в качестве PoC.Единственное ограничение, это длина вектора, но не шибко существенное. То есть, атака тут выглядит так:
http://127.0.0.1/test.html#alert('xss');
Главная Контакты Работы
Но это ещё не всё. Не забываем про SSI. Тут тоже всё просто - hex-редактором вставляем что хотим и загружаем картинку с расширением shtml. Самоезаветное это, конечно, выполнение системных команд, типа
<!--#exec cmd="ls -la"-->
Но если не работает по каким-то причинам (допустим, nginx не поддерживает), то можно попробовать и локальный инлкуд файлов.
<!--#include file="qwerty.php"-->
d0znpp предложил идею, что можно организовать брутфорс файлов, если запрашивать файл динамически:
<!--#include file="$QUERY_STRING"-->
Тогда запрос будет выглядеть как-то так:
http://127.0.0.1/test.shtml?/file_to_include.php
Стоит напомнить, какая разница между file и virtual - первый параметр включает сам файл, второй делает запрос.
Вот таким образом, всего лишь при возможности определить своё расширение картинке, можно получить целый букет уязвимостей (или возможностей) -XSS, выполнение системных команд, LFI или произвольного PHP-кода.
PS: также следует обратить внимание на то, как сконфигурирован nginx: https://nealpoole.com/blog/2011/04/setting-up-php-fastcgi-and-nginx-dont-trust-the-tutorials-check-your-configuration/
теги: XSS, LFI, SSI, PHP | показов: 887