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

30.12.2008, 18:09
|
|
Leaders of Antichat - Level 4
Регистрация: 02.06.2005
Сообщений: 1,411
Провел на форуме: 10605912
Репутация:
4693
|
|
Сообщение от ChaaK
Класс zend_file_handle? Не найти что-то
Сейчас сорцы качаю.
Сообщение от SQLHACK
вот проверил несколько функций, как то странно.
require_once - работает
require - работает
include - работает
include_once - работает
file_get_contents - не работает
fopen - не работает
file - не работает
readfile - не работает
почему только функции инклюда подвержены ?
а Virtual и другие не пашут.
Потому что ТОЛЬКО функции инклуда, вызывают функцию getcwd, для вычисления абсолютного пути по относительному  (хех, я был прав, в том что проблема с вычислением пути по текущему, посмотрим прав ли в остальном)
__________________
Я отдал бы немало за пару крыльев,
Я отдал бы немало за третий глаз
За руку на которой четырнадцать пальцев
Мне нужен для дыхания другой газ..
Мой блог: http://qwazar.ru/.
|
|
|

30.12.2008, 18:16
|
|
Познавший АНТИЧАТ
Регистрация: 01.06.2008
Сообщений: 1,047
Провел на форуме: 5321514
Репутация:
3313
|
|
А что если какая-то логическая ошибка => как-бы получается что функция выполняется, но значение параметра становится = '\0', что значит конец строки => обход magic_quotes'ов?
Вот кое-чот интересное! Похоже на переполнение буфера! Возможно длина строки неправильно расчитывается
PHP код:
/* no docref given but function is known (the default) */
if (!docref && is_function) {
int doclen;
if (space[0] == '\0') {
doclen = spprintf(&docref_buf, 0, "function.%s", function);
} else {
doclen = spprintf(&docref_buf, 0, "%s.%s", class_name, function);
}
while((p = strchr(docref_buf, '_')) != NULL) {
*p = '-';
}
docref = php_strtolower(docref_buf, doclen);
}
Последний раз редактировалось ChaaK; 30.12.2008 в 18:19..
|
|
|

30.12.2008, 19:00
|
|
Leaders of Antichat - Level 4
Регистрация: 02.06.2005
Сообщений: 1,411
Провел на форуме: 10605912
Репутация:
4693
|
|
ChaaK, ты в какието дебри полез  Чтото я этот кусок нигде в инклуде не видел.
__________________
Я отдал бы немало за пару крыльев,
Я отдал бы немало за третий глаз
За руку на которой четырнадцать пальцев
Мне нужен для дыхания другой газ..
Мой блог: http://qwazar.ru/.
|
|
|

30.12.2008, 19:24
|
|
Members of Antichat - Level 5
Регистрация: 18.02.2008
Сообщений: 1,136
Провел на форуме: 17621293
Репутация:
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
Провел на форуме: 4646474
Репутация:
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, 19:48
|
|
Пачка маргарина
Регистрация: 14.07.2005
Сообщений: 964
Провел на форуме: 4646474
Репутация:
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:30
|
|
Members of Antichat - Level 5
Регистрация: 25.02.2007
Сообщений: 495
Провел на форуме: 3244717
Репутация:
1980
|
|
FreeBSD 6.3, PHP 5.2.8 - работает без точки, какая у тебя система хоть?
ты писал что папка должна существовать.
это относится к linux, хотя это понятие растяжимое ) на все том же FreeBSD 6.3, PHP 5.2.8 через несуществующую папку не инклудится =\
|
|
|

30.12.2008, 20:31
|
|
Пачка маргарина
Регистрация: 14.07.2005
Сообщений: 964
Провел на форуме: 4646474
Репутация:
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
Провел на форуме: 4646474
Репутация:
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
Провел на форуме: 4646474
Репутация:
1424
|
|
вот на php 4 можно так тогда, да и на пятой тоже соответственно:
existing_dir/..//////////////////////// ... ///////////////////shell.php
окончание если есть обрежет по maxpathlen тогда
|
|
|
|
 |
|
|
Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
|
|
|
|