Продолжаем решать задачки по информационной безопасности web-серверов. Сегодня задачка с портала root-me.org, называется "File upload - Double extensions". За решение задачки дают 20 баллов, сложнее начального уровня.
В качестве задания предлагается взломать фотогалерею, загрузив код PHP. Флаг следует искать в корневом файле .passwd.
Нам предлагают воспользоваться уязвимостью при загрузке файлов, связанной с двойным расширением файла. На самом деле понятия "двойное расширение" не существует, расширение только одно, то что идёт за последней точкой. Просто так удобнее озвучивать проблему.
Ссылки
Решение
Переходим на страницу задания:
http://challenge01.root-me.org/web-serveur/ch20/
Мы видим фотогалерею. Интересен раздел upload. Здесь можно загрузить свой файл.
Естественно, загрузить файл с расширением PHP не удастся. Разрешены расширения GIF, JPEG и PNG.
Пробую загрузить первый попавшийся bx_loader.gif.
Файл загружен, его можно посмотреть.
А теперь создадим файл с двойным расширением "internet_lab_was_here.php.png".
Внутри файла разместим 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>";
?>
Я вставил оба кода, какой-нибудь да сработает.
Пробуем загрузить файл в фотогалерею.
И файл успешно загружен, открываем его в отдельной вкладке.
Оба PHP скрипта отработали и вывели содержимое файла .passwd.
Флаг: Gg9LRz-hWSxqqUKd77-_q-6G8
Валидируем.
Флаг подходит, зарабатываем 20 очков.
Безопасность
Разрешать пользователям загружать файлы, означает, подвергать риску web сервер. Злоумышленники и автоматические боты обязательно проверят ваш сайт на наличие уязвимостей. А таких возможных уязвимостей, связанных с загрузкой файлов, достаточно много. Главная цель злоумышленника — загрузить на ваш web сервер исполняемый файл, а ваша задача помешать этому. Если вы не понимаете тонкостей работы web сервера, то стоит их изучить.
В данной задаче рассматривается проблема двойных расширений. К примеру, при определённых настройках сервер Apache выполнит файл с названием "foobar.php.123" с помощью PHP интерпретатора. В nginx тоже есть определённые настройки, которые приведут к подобному результату.
Почитать можно здесь:
https://www.acunetix.com/websitesecurity/upload-forms-threat/
http://symcbean.blogspot.com/2016/06/local-file-inclusion-why-everything-you.html
- Правильно настраивайте web-сервер.
- Старайтесь не разрешать пользователям загружать контент.
- Валидируйте контент.
Двойные расширения используются злоумышленниками не только для взлома web серверов. Например, вам на почту могут прислать письмо с файлом "Отчёт.doc.vbs". Крайне не рекомендуется такой файл открывать.
Меня больше бесит, что Windows по умолчанию скрывает расширения известных типов файлов. Если файл "Отчёт.doc.vbs" сохранить из письма на диск (а это многие делают при получении письма с большим количеством файлов внутри), то он отобразится как "Отчёт.doc". Это провал!
Обязательно в настройках Explorer снимайте галку "Скрывать расширения для зарегистрированных типов файлов".