web-starting-1 (LFI injection)
@d1temndПривет! Сегодня хотел бы рассказать про самую распространённую уязвимость на сайтах — LFI (Local File Inclusion).
Данная статья предназначена исключительно для образовательных и исследовательских целей. Автор рассматривает уязвимость Local File Inclusion (LFI) с целью повышения осведомленности о безопасности веб-приложений и ознакомления читателей с методами защиты от подобных угроз. При этом важно отметить, что нарушение законодательства, включая использование уязвимостей веб-приложений без согласия владельца, может быть квалифицировано как преступление согласно статье 272 Уголовного кодекса Российской Федерации. Эта статья касается несанкционированного доступа к компьютерной информации и может повлечь за собой серьезные юридические последствия, включая штрафы и лишение свободы. Настоятельно призываем всех читателей действовать в рамках закона и уважать права владельцев информационных систем.
Local File Inclusion (LFI) — это уязвимость веб-приложений, позволяющая злоумышленникам просматривать локальные файлы на сервере. При наличии такой уязвимости пользователь может манипулировать параметрами URL или формами ввода, чтобы загружать и отображать содержимое файлов, которые не предназначены для общего доступа. Это может привести к раскрытию конфиденциальной информации, такой как файлы конфигурации, лог-файлы и другие данные, хранящиеся на сервере.©️ Chat GPT

TASK1
NULL
Давайте рассмотрим небольшой пример уязвимого сервиса.

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

Он открыл файл с именем "name". В адресной строке можно увидеть, как передается название файла (через параметр file=название_файла).
Посмотрим, как это выглядит изнутри.
...
def view_file():
# Получаем имя файла из параметра запроса
file_name = request.args.get('file')
# Определяем базовый путь
full_path = os.path.join(base_path, file_name)
print(f'Путь к файлу: {full_path}')
try:
# Читаем файл и возвращаем его содержимое
with open(full_path, 'r') as file:
content = file.read()
return Response(content, mimetype='text/plain')
...
Сделаем запрос и посмотрим, что выведет print.
>Путь к файлу: files\name
Хорошо, давайте вспомним, как перемещаться по директориям, и выйдем из заданной директории. Попробуем ввести .., чтобы выйти из папки и посмотреть файл, который есть почти на любой Linux-машинке: /etc/hosts.
Сейчас мы находимся в директории /app/files. Если мы сделаем это один раз (..), мы окажемся в /app. Повторив данное действие, мы окажемся в корне (/). Давайте попробуем это проверить.
Вставляем в поле ввода файла ../../etc/hosts.

Видим, что нам свободно открылся файл /etc/hosts. Мы успешно проэксплуатировали LFI-инъекцию; таким же образом можно открыть файл /etc/passwd.
Давайте разберем другой пример, где запрещены знаки /.
TASK2
URL ENCODE x2
Попробуем ввести предыдущую инъекцию.

Получаем запрет на использование символов / и \. Хорошо, попробуем это обойти. Видим, что путь кодируется в URL. Попробуем раскрутить это, например, закодировав знаки / в URL. Для этого можно использовать функцию Decoder в Burp Suite. Слеш будет представляться как %2f. Заменяем его в инъекции и получаем ..%2f..%2fetc%2fhosts.

Видим, что при отправке запроса происходит дополнительная кодировка URL. Попробуем раскодировать.

Видим, что на выходе наша изначальная инъекция находится в двойной URL-кодировке.
TASK3
Нулевой байт
Иногда сервис может проверять запрашиваемый файл, например, по его расширению. Допустим, что мы можем читать только файлы с расширением .txt или просматривать фотографии .png. Если мы в таком случае попробуем открыть файл /etc/hosts, то получим ошибку из-за неверного расширения файла.
Пример уязвимого кода на PHP:
<?php $page = $_GET['page']; include($page . '.php'); ?>
Здесь, если мы передадим путь с использованием нулевого байта %00:
../../etc/hosts%00.txt
то сервер отсеет все, что идет после нулевого байта, и получится:
Строка в памяти сервера будет выглядеть как:
../../etc/hosts
../../etc/hosts%00.txt > ../../etc/hosts.
Давайте разберем задачу с PortSwigger на null bytes.

У нас есть сервис, в котором можно посмотреть детали товара, такие как фото и цена.
Давайте зайдем на страницу и посмотрим, какие запросы нам "летят" через Intercept в Burp Suite.

Видим, что есть параметр filename, в котором передается фотография в формате name.jpg. Отправим этот запрос в Repeater и попробуем сделать стандартную LFI-инъекцию, чтобы получить файл /etc/passwd (по заданию). Поскольку я не знаю точное местоположение файлов, сделаю больше возвратов назад с помощью ../.
../../../../../../../../../etc/passwd

В ответе видим, что получаем код ошибки 400 и сообщение "No such file". Попробуем использовать null byte injection, чтобы обойти проверку и отсечь окончание.
Попробуем следующее значение:
../../../../../../../../../etc/passwd%00.jpg
Отправляем запрос и смотрим на ответ.

Вуаля! Мы видим, что файл /etc/passwd успешно открылся.

ИТОГ
Существуют разные методы поиска LFI-инъекций, начиная от ручных, часть из которых мы сейчас разобрали. Этот вид инъекций достаточно часто встречается на сайтах, также как и в последнем примере с показом фотографий. Однако автор не рекомендует и не призывает проверять это на каждом сайте; всё, что было описано в данной статье, сделано в учебных целях.
Теперь дам небольшие рекомендации по защите вашего сервиса от таких атак:
- Не использовать старые версии фреймворков: Регулярно обновляйте фреймворки и библиотеки до последних версий, чтобы защититься от известных уязвимостей и улучшений безопасности.
- Создайте 'белый' список: Составьте список разрешенных для открытия файлов и сверяйте с ним файлы, указанные в пользовательском вводе. Это ограничит доступ только к тем файлам, которые явно одобрены.
- Используйте абсолютные пути: Вместо использования относительных путей для включения файлов, используйте абсолютные пути. Это поможет предотвратить доступ к нежелательным или системным файлам, находящимся вне ожидаемой директории.
ЧИТАТЬ
Local File Inclusion · Курс молодого CTF бойца v 1.5 (cybber.ru)
What is path traversal, and how to prevent it? | Web Security Academy (portswigger.net)
Basic LFI Bypass Techniques (hashnode.dev)
File Inclusion (LFI/RFI) | Exploit Notes (hdks.org)
File Inclusion/Path traversal | HackTricks
РЕШАТЬ
All labs path traversal| Web Security Academy (portswigger.net)