Поднимаем железный занавес Александр Любимов aka Sashiks Хакер, номер #081, стр. 081-054-1 (real_sshx@mail.ru) Методы обхода ограничений PHP safe mode Ты, наверное, уже наизусть выучил несколько стандартных схем проникновения на неприятельские сайты. Ядовитый ноль, php-include, sql-injection - это понятно и давно уже известно всем постоянным посетителям детского сада. Получив на удаленном сервере возможность выполнять команды, ты спешить залить удобный php-шелл, которых сейчас развелось огромное множество - один красивее и ярче другого. Не спорю, использование web-оболочек упрощает дальнейшее продвижение. Но иногда случается довольно печальное явление, когда php_shell не выполняет команды, инклудить файлы на сервере не получается, и возникает море ошибок. Это и есть он - ужасный PHP_SAFE_MODE. Многие в таких случаях просто опускают руки, ссылаясь на плохую погоду в Японии, но мы ведь не пальцем деланы, верно? Сегодня я расскажу тебе про основные способы обхода безопасного режима в PHP. [курс молодого бойца] Итак, во-первых, что же такое PHP SAFE MODE? Как написано в мануале - это «попытка решить проблему безопасности». Говоря же простым языком, это указание некоторых важных директив php интерпретатора в файле настроек, которые должны помешать взломщику проникнуть в систему, либо отпугнуть его. Таких директив довольно много. Давай ознакомимся с некоторыми из них: * safe_mode_gid=1|0. Эта строка включает сравнение gid'ов владельца файла и владельца выполняемого скрипта, и, в случае несовпадения, запрещает доступ скрипта к файлу. Например, если ты попробуешь прочитать файл паролей readfile('/etc/passwd'), а он принадлежит руту, то увидишь сообщение об ошибке. * open_basedir=/имя/директории. Довольно подлая директива :). Если твой скрипт пытается прочесть файл вне указанной директории (например, с помощью fopen() или file()), то появляется ошибка, вроде open_basedir restriction in effect. Хотя можно попытаться прочесть файл на каталог выше - возможно, из этой затеи что-то выйдет. * safe_mode_exec_dir=/имя/директории. Скрипт напрочь отказывается выполнять системные программы, которые находятся за пределами этой папки. Следовательно, если сценарий лежит в /usr/home/deep/ass, то выполнить system(/bin/ls) не будет никакой возможности. * disable_functions="имя функции". Это очень жесткая директива, которая позволяет администратору отключить определенные функции. Как ты догадался, обычно в черный список попадают потенциально опасные system(), exec(), passthru() и popen(). Хотя есть маленькая хитрость, которая все-таки позволяет исполнять команды в операционке, но это мы еще обсудим чуть ниже. Следует отметить, что disable_functions решила проблему, которую не дорешала предыдущая директива: взломщик теперь напрочь лишен возможности выполнять системные команды. Как ты понимаешь, web-шелл в таких условиях функционировать не будет и выполнять команды привычным system($_GET['cmd') не получится. Вот основные проблемы, c которыми тебе придется встретиться при работе с машинкой, где PHP крутится в защищенном режиме. Чтобы получить больше информации о директивах и настройках PHP, тебе следует обратиться к официальной документации, интересные выдержки из которой ты найдешь на нашем диске, а целиком ее почитать тебе удастся на сайте www.php.net. |