Antichat снова доступен.
Форум Antichat (Античат) возвращается и снова открыт для пользователей.
Здесь обсуждаются безопасность, программирование, технологии и многое другое.
Сообщество снова собирается вместе.
Новый адрес: forum.antichat.xyz
[новый способ] замена нулл-байту в инклудах |

29.12.2008, 19:12
|
|
Members of Antichat - Level 5
Регистрация: 25.02.2007
Сообщений: 495
Провел на форуме: 3244717
Репутация:
1980
|
|
[новый способ] замена нулл-байту в инклудах
Просматривая забугорный форум 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 "
- экранируется
- работает в PHP => 5.2.0
- не работает при использовании способа с выходом из текущей директории
0x2E .
- не экранируется
- работает во всех версиях
- работает при использовании способа с выходом из текущей директории
0x3C <
- не экранируется
- работает в PHP => 5.2.0
- не работает при использовании способа с выходом из текущей директории
0x3E >
- не экранируется
- работает в PHP => 5.2.0
- не работает при использовании способа с выходом из текущей директории
0x2f /
- не экранируется
- работает во всех версиях, но в PHP => 5.2.0 только при условии, если отсутствует точка в отбрасываемом значении
- работает при использовании способа с выходом из текущей директории, но лишь в некоторых версиях
0x5c \
- экранируется
- работает во всех версиях, но в PHP => 5.2.0 только при условии, если отсутствует точка в отбрасываемом значении
- работает при использовании способа с выходом из текущей директории, но лишь в некоторых версиях
а также различные вариации с точкой:
./
.\
. (пробел)
.//.//
.\\.\\
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
Последний раз редактировалось [Raz0r]; 02.01.2009 в 16:39..
Причина: поправил
|
|
|
|
TEST QR: []
|
Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
|
|
|
|