Веб-уязвимости | Уязвимость LFI

Веб-уязвимости | Уязвимость LFI

fir3wall1 & Сергей Зыбнев


Что такое HTTP параметр?

Давайте для начала разберемся что такое HTTP параметр, вы наверно когда нибудь видели в адресной строке такое index.php?param1=kek&param2=lol это и есть параметры или же query string.

Они нужны для того, чтобы передавать в скрипт(к примеру php) введенные вами данные с html формы, далее скрипт решает что делать дальше с вашими данными, передать в базу данных или просто отобразить введенные данные.

Также параметры позволяют подгружать файлы с сервера или указывать что отображается на веб-сайте: index.php?file=kek.html что позволяет создавать динамические веб-страницы, уменьшает общий размер скрипта и упрощает код.


Что же такое уязвимость LFI?

Local File Inclusion

Переводится как: Включение локального файла. Что такое локальный файл? Это файл, которые лежит на сервере.

Так вот, уязвимость LFI - это возможность использовать и выполнять файлы, которые лежат на сервере(локальные файлы).

Уязвимость позволяет нам получить доступ к файлам на сервере, в том числе содержащую конфиденциальную информацию(пароли, ключи, куки и т.д.).

В поисках LFI

Вначале разберемся как определить параметры, которые отвечают за включение локальных файлов. Предположим что мы нашли вот такой параметр на сайте:

www.site.com/index.php?file=photo

Данный параметр просто подгружает файл под названием photo со своего сервера. Попробуем ввести вместо photo, к примеру index:

www.site.com/index.php?file=index

Если у вас включился файл index с любым расширением или написало что Файл не найден, то поздравляю, мы нашли параметр отвечающий за подгрузку файлов с сервера.

Название параметров может быть разное, к примеру может попасться сайт, где есть возможность смены языка, и вид url такой:

www.site.com/index.php?lang=en 

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

Поэтому смотрим сначала на вид url, пробуем гулять по сайту, если во время гулянки в параметре меняется значение на название которые похоже на название файла, то возможно это параметр подгрузки, либо менять значение руками.

Как эксплуатировать если нашли такой параметр?

Для эксплуатации уязвимости сначала нужно проверить на какой ОС стоит сайт, если это линукс, то пишем в значение параметра такую штуку: ../../../../../../etc/passwd

Давайте разберем что это значит

../ - Это значит перейти на один каталог назад, все равно что cd .. и таким образом мы переходим на несколько каталогов назад ровно до главного каталога "/" оттуда мы читаем файл passwd.

Если на сайте винда, то пишем ..\..\..\..\..\..\ и нужный нам файл.

Linux - www.site.com/index.php?file=../../../../../../etc/passwd
Windows www.site.com/index.php?file=..\..\..\..\..\..\boot.ini

[Эксплуатация] | Обход защиты

Что делать если на сервере стоит защита и LFI не срабатывает. Уязвимость может не срабатывать когда на сервере стоит либо WAF(Web Application Firewall) либо в коде скрипта стоит фильтр.

$language = str_replace('../', '', $_GET['file']);
  • str_replace() - это функция в языке php которая отвечает за то, чтобы просто удалять "../../../" Однако этот фильтр не безопасен, так как он не удаляет рекурсивно подстроку ../, поскольку он выполняется один раз для входной строки и не применяет фильтр к выходной строке. Например, если мы используем ....// в качестве нашей полезной нагрузки, то фильтр удалит ../, а выходная строка будет ../, что означает, что мы все еще можем выполнять LFI
  • Encoding - некоторые фильтры могут блокировать такие символы, как точку и косую черту. Однако некоторые из этих фильтров можно обойти, нужно закодировать наш пэйлоад "../../../etc/passwd" URL кодировкой, в результате это будет выглядеть так:
%2e%2e%2f%2e%2e%2f%2e%2e%2f%65%74%63%2f%70%61%73%73%77%64 
  • Итог: наш пэйлоад больше не будет содержать запрещенные символы. Таким образом мы прошли мимо фильтра и добрались до уязвимой функции. Основные фильтры PHP в версиях 5.3.4 и более ранних были особенно уязвимы для этого обхода, но даже в более новых версиях мы можем найти пользовательские фильтры, которые можно обойти с помощью кодировки URL.


Из-за чего возникает уязвимость?

Разберем php код:

$lol = $_GET['file']; 
include('directory/' . $lol); 

$lol = $_GET['file']; - Вначале мы создаем переменную lol, в переменной хранится суперглобальная переменная GET которая помещает в переменную lol все данные, которые приходят с HTTP параметра file.

include('directory/' . $lol); - Вот тут и возникает уязвимость. Функция include() нужна для того, чтобы включать и выполнять локальные файлы. Она ищет и выполняет тот файл, которые пришел с HTTP параметра file в папке directory.

Если мы подставим туда выражение: ../../../../../etc/passwd то мы можем выйти из папки directory и найти любые файлы, которые мы пожелаем. Вначале у нас путь такой: /var/www/html/directory - ../ шаг назад, попадаем в /var/www/html, ../ еще шаг назад - попадаем в /var/www/, еще шаг назад - попадаем в /var/, и еще шаг и попадаем в директорию рута / оттуда мы попадаем в /etc/ и уже в /etc/ ищем файл passwd.


Заключение

Надеюсь, данная статья вам была полезна. Чтобы получить практику по уязвимости LFI советую эти сайты

https://www.root-me.org/

https://hackxpert.com/labs/LFI/

Увидимся =)


Report Page