Атакуем веб-приложения. Уязвимость LFI. Часть 1 - Теория

Атакуем веб-приложения. Уязвимость LFI. Часть 1 - Теория

Life-Hack [Жизнь-Взлом]/Хакинг

#Обучение

Данный пост будет носить теоретический характер. В нём будет разобрана теория, касающаяся уязвимости LFI.

Что такое LFI?

Local File Include (LFI) — уязвимость, которая позволяет удаленному пользователю получить доступ к нужной информации с помощью специально сформированного запроса к произвольным файлам. Грубо говоря, LFI представляет собой подключение любого файла на сервере к вызываемому файлу. Что делит LFI на две ветки: выполнение содержимого подключаемого файла и чтение содержимого подключаемого файла. Уязвимости класса LFI чаще всего встречается в различных менеджерах файлов.

Как найти LFI?

LFI эта уязвимость, которая встречается чаще всего в параметрах скрипта (например, когда скрипт отвечает за подкачку какого-либо файла, или осуществляет просмотр локального файла)

Для поиска параметров есть два варианта: автоматический или ручной поиск.

Автоматический поиск

Автоматический поиск можно осуществить тем же spider'ом в burpsuite. Крактое руководство по burpsuite было на канале (ссылка)

Ручной поиск

Предположим, что мы нашли GET параметр:

http://site.ru/folder/index.php?file=somefile

Подставим под параметр строку 'index':

http://site.ru/folder/index.php?file=index

Если у вас открылся какой-то из файлов index.(любое расширение), находящихся на сайте, то тут мы уже однозначно можем утверждать, что параметр "file" отвечает за подкачку файла.

Именно такие параметры нам и нужны.

Определение фильтров.

После того, как мы получили список параметров, нужно проверить, есть ли у них фильтрация.

Нулевая фильтрация

Попробуем подкачать файлы, которые, по замыслу разработчиков не должны быть отображены, например файл с именами пользователей системы - /etc/passwd.

(В данном случае за строку с параметром мы взяли http://site.ru/folder/index.php?file=index.html)

Попробуем его подкачать:

http://site.ru/folder/index.php?file=/../../../../../../etc/passwd

Переход в папку /../ означает поднятие по иерархии вверх (точнее это уязвимость path traversal). Т.к. папка etc лежит в корневой папке, то мы должны ее достичь угадыванием: то есть чем чаще мы поднимаемся вверх, тем выше шанс, что мы окажемся в корневой папке (поэтому пшится несколько раз /../).

Если файл показался. То считайте, что вы нашли LFI. В этом случае фильтр вообще отсутствует.

Нулевой байт

В данном случае за строку с параметром мы взяли http://site.ru/folder/index.php?file=index, то есть с отсутствующим окончанием.

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

Например с запросом /../../../../../../etc/passwd может преобразоваться в

/../../../../../../etc/passwd.php

Но и на этот раз есть вариант исправить строку. В старых версиях PHP остался такой недостаток, как Null Byte Injection.

Параметры, при передаче по http, зашифровываются в url шифрование. И в этой кодировке нулевой байт выглядит именно в %00.

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

В данном случае если мы впишем в параметр /../../../../../../etc/passwd.php%00, то получим следующую строку:

http://site.ru/folder/index.php?file=/../../../../../../etc/passwd%00

И строка в памяти сервера будет выглядеть как:

/../../../../../../etc/passwd%00.php ==> /../../../../../../etc/passwd

И в итоге мы смогли отбросить окончание и получить нужный файл.

Что можно получить с помощью LFI?

Чтение файлов на сервер, например можно попробовать считать /etc/shadow (в данном файле хранятся хеши от паролей пользователей), так-же можно читать файлы с исходными кодами веб-приложения и искать в них уязвимости.

В некоторых реализациях LFI позволяет выполнять файлы. То есть если мы можем влиять на содержимое каких либо файлов на сервер, то существует шанс записи в них код и выполнения данного кода с помощью LFI. 

Источник


Report Page