web-starting-1 (LFI injection)

web-starting-1 (LFI injection)

@d1temnd


Привет! Сегодня хотел бы рассказать про самую распространённую уязвимость на сайтах — LFI (Local File Inclusion).


Данная статья предназначена исключительно для образовательных и исследовательских целей. Автор рассматривает уязвимость Local File Inclusion (LFI) с целью повышения осведомленности о безопасности веб-приложений и ознакомления читателей с методами защиты от подобных угроз. При этом важно отметить, что нарушение законодательства, включая использование уязвимостей веб-приложений без согласия владельца, может быть квалифицировано как преступление согласно статье 272 Уголовного кодекса Российской Федерации. Эта статья касается несанкционированного доступа к компьютерной информации и может повлечь за собой серьезные юридические последствия, включая штрафы и лишение свободы. Настоятельно призываем всех читателей действовать в рамках закона и уважать права владельцев информационных систем.


Local File Inclusion (LFI) — это уязвимость веб-приложений, позволяющая злоумышленникам просматривать локальные файлы на сервере. При наличии такой уязвимости пользователь может манипулировать параметрами URL или формами ввода, чтобы загружать и отображать содержимое файлов, которые не предназначены для общего доступа. Это может привести к раскрытию конфиденциальной информации, такой как файлы конфигурации, лог-файлы и другие данные, хранящиеся на сервере.©️ Chat GPT
пикча с portswigger

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-инъекций, начиная от ручных, часть из которых мы сейчас разобрали. Этот вид инъекций достаточно часто встречается на сайтах, также как и в последнем примере с показом фотографий. Однако автор не рекомендует и не призывает проверять это на каждом сайте; всё, что было описано в данной статье, сделано в учебных целях.

Теперь дам небольшие рекомендации по защите вашего сервиса от таких атак:

  1. Не использовать старые версии фреймворков: Регулярно обновляйте фреймворки и библиотеки до последних версий, чтобы защититься от известных уязвимостей и улучшений безопасности.
  2. Создайте 'белый' список: Составьте список разрешенных для открытия файлов и сверяйте с ним файлы, указанные в пользовательском вводе. Это ограничит доступ только к тем файлам, которые явно одобрены.
  3. Используйте абсолютные пути: Вместо использования относительных путей для включения файлов, используйте абсолютные пути. Это поможет предотвратить доступ к нежелательным или системным файлам, находящимся вне ожидаемой директории.

ЧИТАТЬ

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)

первые 2 примера


Report Page