Local File Inclusion
LFI - это возможность использования и выполнения локальных файлов на серверной стороне. Уязвимость позволяет удаленному пользователю получить доступ с помощью специально сформированного запроса к произвольным файлам на сервере, в том числе содержащую конфиденциальную информацию.
Проще говоря, это уязвимость открытия файлов с сервера + недостаточная фильтрация, что позволяет открывать произвольный файл.
Поиск file inclusion
Вначале разберемся как определить параметры которые отвечают за инклуд файлов.
Поиск параметров Для поиска параметров есть два варианта: автоматический или ручной поиск.
Автоматический поиск Автоматический поиск можно осуществить тем же spider'ом в burpsuite. Вы можете у нас в вики найти статью burpsuite.
Ручной поиск Сейчас я поговорю о ручном поиске. Предположим, что мы нашли GET параметр:
Подставим под параметр строку 'index':
Если у вас открылся какой то из файлов index.(любое расширение), находящихся на сайте, то тут мы уже однозначно можем утверждать, что файл отвечает за подкачку файла.
Именно такие параметры нам и нужны.
Определение фильтров После того, как мы получили список параметров, нужно проверить, есть ли у них фильтрация.
Нулевая фильтрация Попробуем подкачать файлы, которые не рассчитывали показывать=)
Аналогом такого файла в линкусе является файл /etc/passwd
(В данном случае за строку с параметром мы взяли http://site.ru/folder/index.php?file=index.html)
Попробуем его подкачать:
Объясняю что происходит - переход в папку /../ означает поднятие по иерархии вверх (точнее это уязвимость path traversal). Т.к. папка etc лежит в корневой папке, то мы должны ее достичь угадыванием: то есть чем чаще мы поднимаемся вверх, тем выше шанс, что мы окажемся в корневой папке (то мы должны написать несколько раз /../).
Если файл показался. То считайте, что вы нашли LFI. В этом случае фильтр вообще отсутствует.
Нулевой байт В данном случае за строку с параметром мы взяли http://site.ru/folder/index.php?file=index, то есть с отсутствующим окончанием. Но даже при отсутствии фильтра могут быть проблемы. Например в конце параметра может приписываться окончание.
Например с запросом /../../../../../../etc/passwd
может преобразоваться в
Но и на этот раз есть вариант исправить строку.В старых версиях PHP остался такой недостаток, как Null Byte Injection
.
Один из них - это приписывание нулевого байта. Параметры, при передаче по http, зашифровываются в url шифрование. И в этой кодировке нулевой байт выглядит именно в %00.
А т.к. в PHP и многих других языках чтение строки идет именно до нулевого байта, то мы можем приписать его в середину строки, чтобы следующая часть строки отбрасывалась.
В данном случае если мы впишем в параметр /../../../../../../etc/passwd.php%00
, то получим следующую строку:
И строка в памяти сервера будет выглядеть как:
И в итоге мы смогли отбросить окончание и получить нужный файл.
String limit Еще один вариант отбрасывания окончания возможен при String Limit - укорачиванию строки. И какая же от этого польза? А что если мы отбросим часть строки с окончанием, то получится нужная нам строка,но уже без окончания.
Уже на этот раз нам может помочь строка /./
. Объясняю, что происходит:
Если точнее, то в bash эти две строки идентичны. Приведу пример, как это может помочь
php filter По мне самый интересный вариант lfi является lfi с php filter. Сразу привожу пример
В итоге у нас в браузере не запустится php файл, а выведется его base64 исходников. Это в последнее время появляется на соревнованиях все чаще и чаще.
Эксплуатация уязвимости
Если вы читаете этот пункт,то вероятнее всего уже нашли LFI. Тогда разберем, чем она может нам быть полезна.
Получение важных файлов (не скриптов) Ну самое типичное для lfi - скачивание файлов, которые мы, по задумке администратора, не должны были скачивать. Приведу пример задания:
Получение исходников В получении исходников могут быть некоторые проблемы. Например, при эксплуатации исходники не высвечиваются, а запускаются. В этом случае к нам на помощь приходит как раз php filter. Примеры тут достаточно простые, так что не вижу смысла их приводить.
LFI -> RCE Т.к. этот раздел уже переходит в более опасный раздел RCE, то вполне логично перенести дискуссию по этому поводу в нее. Ищите на сайте =)
Множество примеров
SharifCTF 2016 - technews
Описание Can you find the flag?http://ctf.sharif.edu:31455/chal/technews/ca23e03d4c8b9ff6/
Решение
(райтап взят с https://ctftime.org/writeup/2404)
Полезные ссылки
Last updated