mosaique by arthur gerkis @ax330d

2

Click here to load reader

Upload: ivan-novikov

Post on 09-Jun-2015

849 views

Category:

Documents


0 download

DESCRIPTION

PHP image conversion filters bypass

TRANSCRIPT

Page 1: Mosaique by Arthur Gerkis @ax330d

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');

Главная Контакты Работы

Page 2: Mosaique by Arthur Gerkis @ax330d

Но это ещё не всё. Не забываем про 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