![]() |
[новый способ] замена нулл-байту в инклудах
Просматривая забугорный форум sla.ckers.org, обнаружил новый способ, позволяющий отбросить любое значение, в частности расширение файла, в инклудах без использования нулл-байта. Как известно, нулл-байт экранируется при magic_quotes_gpc=on, поэтому это зачастую создает трудности при эксплуатировании LFI.
Способ заключается в том, что расширение можно отбросить, если до него предшествует последовательность символов, при чем длина этой последовательности может различаться в зависимости от OS. Где в коде PHP находится уязвимость пока сказать сложно, но вполне ясно, что она связана с теми же особенностями, которые ведут к проблемам с нулл-байтом, т.е. все исходит из C, на котором написан PHP. К сожалению, уязвимость не позволяет выбраться из текущей папки просто дописав перед значением ../, но мной был найден способ обхода (также зависит от OS). 1. *nix Символы, составляющие последовательность: 0x2F / (не экранируется) Длина полного пути *: *getcwd() + DIRECTORY_SEPARATOR + имя файла + последовательность символов 4095 Linux 1023 FreeBSD Пример: http://localhost/test.php?lol=inc.php//////////////////////[...] Выход за пределы текущей папки: http://localhost/test.php?lol=existing_dir/../../inc.php//////////////////////[...] где existing_dir имя существующей папки в некоторых версиях PHP (e.g. 5.1.2) на linux имя папки может быть любым 2. windows В windows имеются значительные отличия в зависимости от версии PHP. Почти в каждой версии имеются свои особенности. Символы, составляющие последовательность: 0x20 пробел
0x22 "
0x2E .
0x3C <
0x3E >
0x2f /
0x5c \
а также различные вариации с точкой: ./ .\ . (пробел) .//.// .\\.\\ etc Длина полного пути *: *getcwd() + DIRECTORY_SEPARATOR + имя файла + последовательность символов PHP 4.4.2, 5.1.2, 5.2.6 265 если присутствует точка в отбрасываемом значении 266 если отсутствует PHP 4.4.4, 4.4.9, 5.2.0 258 если присутствует точка в отбрасываемом значении 259 если отсутствует точка в отбрасываемом значении Пример: http://localhost/test.php?lol=inc.php.......................[...] http://localhost/test.php?lol=inc.php<<<<<<<<<<<[...] Выход за пределы текущей папки: http://localhost/test.php?lol=exsiting_dir/../../inc.php............................[...] http://localhost/test.php?lol=nonexsiting_dir/../../inc.php............................[...] где nonexsiting_dir имя любой папки, даже несуществующей Вывод исследования: для windows универсальный символ для последовательности в векторе атаки это точка (.); минимальная универсальная длина этой последовательности - 266 символов в *nix единственным и универсальным символом является слэш (/); минимальная универсальная длина последовательности - 4095 символов; Для эксплуатации LFI в реальных условиях необходимо рассчитывать длину последовательности с учетом максимальной длины URL, которую способен принять веб-сервер. Если, например, сервер имеет ограничение URL < 4096 байт, а система работает на linux, то реализовать уязвимость не удастся Информация конечно не совсем приватная, но пока что распространение она не получила. Оригинальный топик: http://sla.ckers.org/forum/read.php?16,25706 |
Цитата:
Цитата:
|
Длина максимального URL зависит от конфигурации веб-сервера. Апач по умолчанию держит 4096 байт, как раз достаточно дле реализации уязвимости
http://paradigm.ru/2007/12/19/url-max-length/ |
Значит нормально
P.S на локалхосте стоит ограничение 512 по-умолчанию |
в смысле на локалхосте? я про веб-сервер, апач он и на локалхосте апач )
з.ы. у меня на локалхосте ограничение 4096 байт ) |
интересно конечно, у кого нибудь сработало?
|
ShAnKaR, проверь сам и убедись ) все работает
|
да, интерсно
*пошёл копать дедокрученые инклуды |
B вправду)
Цитата:
PHP код:
|
Напишите у кого какие версии всего софта, ось, пхп, апач, способ подключения пхп к апачу.
Что то у меня не работает данная конструкция, если у кого то это работает то отпишите на каких настройках. PHP код:
|
пашет отлично, но не везде. респект однозначно :)
|
Цитата:
UP проверил побольше диапазон в общем оказалась магической цифра 4075, хз почему, тоесть имя файла вмесле со слешами имеет длину 4075 символа-> увеличиваю имя файла , уменшаю количесво сдешей соответственно, система linux PHP 5.2.6 еще кстати фигня: PHP код:
из корневой папки без спуска ../ не хочет работать тоже, пашет при спуске через типа: zzzzzzzzz/../../../ и тп папке zzzzzzzzzz существовать не обязательно. |
PHP Version 4.4.0
System Windows NT 5.1 Код: PHP код:
magic_quotes=Off Аналогично, на: PHP Version 4.4.9 System Linux 2.6.24.2 #1 SMP i686 magic_quotes=On Apache/1.3.34 (Debian) Не работает никак. Отпишитесь, пожалуйста, кто пробовал на 2ке апача и на 5ке php |
php 5, apache 2, windows vista, не работает
|
php 5.2.8
apache 2.2.11 windows xp работает PHP код:
PHP код:
|
хм
система линукс PHP 5.2.6 апач 2.2.8 <? include($_GET['page'].'.php'); ?> итак incl.php?page=omg.txt - 4062 символа/ incl.php?page=om.txt 4064 символа / incl.php?page=o.txt 4065 символов / incl.php?page=omfg.txt - 4062 символа / incl.php?page=xekxekekxek.txt - 4056 симвлов / может тут кто то видит порядок, я нет =) PS в каждом случае указано минимально кол-во символов /, если ставить больше то всё работает, к примеру 4070 символов будут работать в любом примере |
А на ngnix/light httpd работает? Может бага апача? Нет возможности проверить. У кого есть возможность отпишитесь
|
PHP код:
Здесь, как и в моих примерах выше - Apache/1.3.33 |
апач тут не причем, из командной строки норм пашет, strace:
Цитата:
|
PHP 4.4.2 WinXP 32 bit - работает
PHP 4.4.4 WinXP 32 bit - работает PHP 5.1.2 WinXP 32 bit - работает PHP 5.2.0 WinXP 32 bit - работает PHP 4.4.4 Vista 32 bit - работает PHP 5.2.0 Vista 32 bit - работает PHP 5.2.6 Vista 32 bit - работает PHP 5.2.8 FreeBSD 6.3 - работает В общем везде, где проверял у меня работало. Возможная проблема у тех, у кого не работало - вы указывали абсолютный путь, с ним уязвимость не работает. Цитата:
Цитата:
Предлагаю заняться ииследованием сорцов для выяснения причин баги. Возможно удастся понять от чего зависит длина необходимой последовательности. @1ten0.0net1 на твоем живом примере не работает, потому что доставляется ./: Цитата:
|
вот еще цифра зависит от getcwd, в общем в сумме имя файла со слешами и с getcwd 4094, те перемещаем скрипт в другое место и соответственно кол-во слешей изменяется.
|
Вообщем написал скрипт для быстрой проверки.
Складываем в папку z:/home/localhost/www/testinc/ Скрипт становится доступным по адресу http://www.localhost/testinc/test.php Скрипт который запускаем (test.php) PHP код:
PHP код:
PHP код:
Получаю в ответ, что бага работает 216 символов и более. Версии PHP Version => 5.2.4 Windows NT XHOME 5.1 build 2600 Build Date хр короче Apache 2.2.4 но стоит прописать абсолютный путь в любом варианте, и больше ни чё не пашет. PHP код:
У кого есть идеи ? то есть я не вижу объективных причин не работать с абсолютным путём. |
Скрипт SQLHACK переделаный под себя не работает. Имхо - с 4.4.0 не работает
|
копать сорцы пшп?
|
вот проверил несколько функций, как то странно.
require_once - работает require - работает include - работает include_once - работает file_get_contents - не работает fopen - не работает file - не работает readfile - не работает почему только функции инклюда подвержены ? а Virtual и другие не пашут. |
Цитата:
P.S. php-5.2.6-Win32 пример от SQLHACK работает, выдаёт "Bug working with 219 added chars". P.P.S. С абсолютным путём кстати и может неработать, если переписывается имено указатель на текущую директорию, относительно которой относительный путь конвертится в абсолютный. А в случае абсолютного пути, нет необходимости в вычеслении действительного пути. |
есил бы бы был оверфлов то пхп бы падал ,имхо , а тут всё корректно обрабатывается при любом количестве символов в пути
|
Цитата:
А вот ещё один признак того, что скорее всего переписывается результат функции getcwd (получение текущего каталога), ну и причина того, что абсолютные пути не пашут: Цитата:
Вот тут: http://bugs.php.net/bug.php?id=41822 написано, что include с относительным путём вызывает getcwd. |
По ходу уязвимость где-то в этих функциях:
PHP код:
php_stream_open_wrapper(); - предпологаю, что уязвимость где-то в ней |
Цитата:
З.Ы. Второй файл что ты выложил - не в тему, он для GZIP. |
Цитата:
Цитата:
|
А что если какая-то логическая ошибка => как-бы получается что функция выполняется, но значение параметра становится = '\0', что значит конец строки => обход magic_quotes'ов?
Вот кое-чот интересное! Похоже на переполнение буфера! Возможно длина строки неправильно расчитывается PHP код:
|
ChaaK, ты в какието дебри полез :) Чтото я этот кусок нигде в инклуде не видел.
|
Тоже потестил, вот результат :
Конфигурация: WinXP 32 bit, PHP 5.2.4, Апач 2.2.4 Работает Цифра это минимальное кол-во символов "."-218 " "пробел - никакой реакции "<"-218 ">"-218 С абсолютным путём не пашет Пока тестил только в include И обнаружился ещё один символ, с которым работает: "+"-218 |
кароч:
файл plain_wrappers.c функция _php_stream_fopen_with_path: Цитата:
Цитата:
дальше файл fopen-wrappers.c функция expand_filepath: Цитата:
ну что видно из этого идет везде сначала xxx.php/////////..../////////////.txt потом по MAXPATHLEN обрезается до xxx.php/////////..../////////////. дальше обрабатывается видимо функцией virtual_file_ex , она возвращает false и изменяет new_state. |
Цитата:
PHP код:
без точки не работает. Цитата:
Цитата:
|
Цитата:
Цитата:
|
потом файл tsrm_virtual_cwd.c
функция virtual_file_ex: Цитата:
файл tsrm_strtok_r.c Цитата:
функция virtual_file_ex: и тут наверно и идет бага: Цитата:
остается конечно не понятно почему без точки в конце не пашет |
в винде по идее еще должно проходить с нормальным слешем и обратным:
Цитата:
файл streams.c функция _php_stream_fopen_with_path Цитата:
|
вот на php 4 можно так тогда, да и на пятой тоже соответственно:
existing_dir/..//////////////////////// ... ///////////////////shell.php окончание если есть обрежет по maxpathlen тогда |
| Время: 02:45 |