Lfi — различия между версиями
Drakylar (обсуждение | вклад) м |
Drakylar (обсуждение | вклад) м |
||
| Строка 45: | Строка 45: | ||
Аналогом такого файла в линкусе является файл /etc/passwd | Аналогом такого файла в линкусе является файл /etc/passwd | ||
| + | |||
| + | (В данном случае за строку с параметром мы взяли http://site.ru/folder/index.php?file=index.html) | ||
Попробуем его подкачать: | Попробуем его подкачать: | ||
http://site.ru/folder/index.php?file=/../../../../../../etc/passwd | http://site.ru/folder/index.php?file=/../../../../../../etc/passwd | ||
| + | |||
| + | Объясняю что происходит - переход в папку /../ означает поднятие по иерархии вверх. Т.к. папка etc лежит в корневой папке, то мы должны ее достичь угадыванием: то есть чем чаще мы поднимаемся вверх, тем выше шанс, что мы окажемся в корневой папке (то мы должны написать несколько раз /../). | ||
| + | |||
| + | '''Если файл показался. То считайте, что вы нашли LFI.''' | ||
| + | В этом случае фильтр вообще отсутствует. | ||
| + | |||
| + | =====Нулевой байт===== | ||
| + | |||
| + | В данном случае за строку с параметром мы взяли http://site.ru/folder/index.php?file=index, то есть с отсутствующим окончанием. | ||
| + | |||
| + | Но даже при отсутствии фильтра могут быть проблемы. Например в конце параметра может приписываться окончание. | ||
| + | |||
| + | Например с запросом /../../../../../../etc/passwd может преобразоваться в | ||
| + | |||
| + | /../../../../../../etc/passwd.php | ||
| + | |||
| + | Но и на этот раз есть вариант исправить строку. | ||
| + | |||
| + | Один из них - это приписывание нулевого байта. Параметры, при передаче по http, зашифровываются в url шифрование. И в этой кодировке нулевой байт выглядит именно в %00. | ||
| + | |||
| + | А т.к. в PHP и многих других языках чтение строки идет именно до нулевого байта, то мы можем приписать его в середину строки, чтобы следующая часть строки отбрасывалась. | ||
| + | |||
| + | В данном случае если мы впишем в параметр /../../../../../../etc/passwd.php%00, то получим следующую строку: | ||
| + | |||
| + | http://site.ru/folder/index.php?file=/../../../../../../etc/passwd%00 | ||
| + | |||
| + | И строка в памяти сервера будет выглядеть как: | ||
| + | |||
| + | /../../../../../../etc/passwd%00.php ==> /../../../../../../etc/passwd | ||
| + | |||
| + | И в итоге мы смогли отбросить окончание и получить нужный файл. | ||
| + | |||
| + | =====String limit===== | ||
| + | |||
| + | Еще один вариант отбрасывания окончания возможен при String Limit - укорачиванию строки. | ||
| + | |||
| + | И какая же от этого польза? А что если мы отбросим часть строки с окончанием, то получится нужная нам строка,но уже без окончания. | ||
| + | |||
| + | Уже на этот раз нам может помочь строка /./ . Объясняю, что происходит: | ||
| + | |||
| + | /./././././index === index | ||
| + | |||
| + | Если точнее, то в bash эти две строки идентичны. Приведу пример, как это может помочь | ||
| + | |||
| + | 1) У нас есть параметр, строка которого укорачивается до 100 символов | ||
| + | 2) Попробуем вывести файл index.txt, при условии, что приписывается окончание .php | ||
| + | 3) Попробуем ввести index.txt - в итоге выводится index.txt.php | ||
| + | 4) Чтобы обойти защиту, нужно ввести index.txt/././././../...<<(100-10)/2 раз>>.../././ | ||
| + | 5) В итоге получается, что к этой длинной строке приписывается .php, которое в последствии отбрасывается | ||
| + | 6) Profit! | ||
| + | |||
| + | =====php filter===== | ||
Версия 17:08, 18 октября 2015
LFI - это возможность использования и выполнения локальных файлов на серверной стороне. Уязвимость позволяет удаленному пользователю получить доступ с помощью специально сформированного запроса к произвольным файлам на сервере, в том числе содержащую конфиденциальную информацию.
Если быть точнее, то это уязвимость инклуда файлов с компьютера + недостаточная фильтрация, что позволяет инклудить произвольный файл.
Содержание
Поиск file inclusion
Вначале разберемся как определить параметры которые отвечают за инклуд файлов.
Поиск параметров
Для поиска параметров есть два варианта: автоматический или ручной поиск.
Автоматический поиск
Автоматический поиск можно осуществить тем же spider'ом в burpsuite. Вы можете у нас в вики найти статью burpsuite.
Ручной поиск
Сейчас я поговорю о ручном поиске.
Предположим, что мы нашли GET параметр:
http://site.ru/folder/index.php?file=gallery
Подставим под параметр строку 'index':
http://site.ru/folder/index.php?file=index
Если у вас открылся какой то из файлов index.(любое расширение), находящихся на сайте, то тут мы уже однозначно можем утверждать, что файл отвечает за подкачку файла.
Именно такие параметры нам и нужны.
Определение фильтров
После того, как мы получили список параметров, нужно проверить, есть ли у них фильтрация.
Нулевая фильтрация
Попробуем подкачать файлы, которые не рассчитывали показывать=)
Аналогом такого файла в линкусе является файл /etc/passwd
(В данном случае за строку с параметром мы взяли http://site.ru/folder/index.php?file=index.html)
Попробуем его подкачать:
http://site.ru/folder/index.php?file=/../../../../../../etc/passwd
Объясняю что происходит - переход в папку /../ означает поднятие по иерархии вверх. Т.к. папка etc лежит в корневой папке, то мы должны ее достичь угадыванием: то есть чем чаще мы поднимаемся вверх, тем выше шанс, что мы окажемся в корневой папке (то мы должны написать несколько раз /../).
Если файл показался. То считайте, что вы нашли LFI. В этом случае фильтр вообще отсутствует.
Нулевой байт
В данном случае за строку с параметром мы взяли http://site.ru/folder/index.php?file=index, то есть с отсутствующим окончанием.
Но даже при отсутствии фильтра могут быть проблемы. Например в конце параметра может приписываться окончание.
Например с запросом /../../../../../../etc/passwd может преобразоваться в
/../../../../../../etc/passwd.php
Но и на этот раз есть вариант исправить строку.
Один из них - это приписывание нулевого байта. Параметры, при передаче по http, зашифровываются в url шифрование. И в этой кодировке нулевой байт выглядит именно в %00.
А т.к. в PHP и многих других языках чтение строки идет именно до нулевого байта, то мы можем приписать его в середину строки, чтобы следующая часть строки отбрасывалась.
В данном случае если мы впишем в параметр /../../../../../../etc/passwd.php%00, то получим следующую строку:
http://site.ru/folder/index.php?file=/../../../../../../etc/passwd%00
И строка в памяти сервера будет выглядеть как:
/../../../../../../etc/passwd%00.php ==> /../../../../../../etc/passwd
И в итоге мы смогли отбросить окончание и получить нужный файл.
String limit
Еще один вариант отбрасывания окончания возможен при String Limit - укорачиванию строки.
И какая же от этого польза? А что если мы отбросим часть строки с окончанием, то получится нужная нам строка,но уже без окончания.
Уже на этот раз нам может помочь строка /./ . Объясняю, что происходит:
/./././././index === index
Если точнее, то в bash эти две строки идентичны. Приведу пример, как это может помочь
1) У нас есть параметр, строка которого укорачивается до 100 символов
2) Попробуем вывести файл index.txt, при условии, что приписывается окончание .php
3) Попробуем ввести index.txt - в итоге выводится index.txt.php
4) Чтобы обойти защиту, нужно ввести index.txt/././././../...<<(100-10)/2 раз>>.../././
5) В итоге получается, что к этой длинной строке приписывается .php, которое в последствии отбрасывается
6) Profit!