Lfi — различия между версиями

Материал из InformationSecurity WIKI
Перейти к: навигация, поиск
м
м
Строка 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!
php filter