PHP – Include, и немного удачи.

Сегодня мы рассмотрим к каким последствиям может привести локальный PHP – Include, скажу сразу в более удачных ситуациях, последствия могут быть еще более плачебны.

Собираем Баги.

Все началось с найденной на сайте БГУ уязвимости, в другой день и при других обстоятельствах, я, скорее всего не обратил бы на нее внимания, но этому сайту повезло (или не повезло, смотря, как посмотреть).

http://www.brgu.ru/index.php?openpage=/etc/passwd

Итак, мы имеем локальный PHP – Include.

//..................................

if (@$_GET['openpage'])
$file=$_GET['openpage'];

if(file_exists($file))
include($file);

else
print ('file not found');

//..............................

Он был порожден примерно таким кодом, функция file_exists, проверяет, существует ли такой файл на сервере, а затем, если существует инклудит его, таким образом, мы можем читать файлы на сервере, но нужно иметь полный путь к файлу и соответствующие права (например, файл /etc/shadow, мы не прочтем — прав не хватит).

Проверим параметры на уязвимость к sql инъекции.

http://www.brgu.ru/index.php?openpage=r … t+1,2,user(),database(),version(),6,7+limit+1,1--

Версия БД - 4.1.20 значит служебной таблицы information_schema, в которой хранятся название всех таблиц и колонок не существует, прийдется гадать, но это оказалось не сложно:

http://www.brgu.ru/index.php?openpage=r … d,database(),name,6,7+from+users+limit+1,1--

Получили доступ к таблице, в которой хранятся аккаунты пользователей форума, нашли админский. Теперь нам не придется регистрироваться, заходим под любым аккаунтом, ищем баги дальше. Форум выглядит не очень безопасным.cмотрим на копирайты, понятно форум самописный, ну что, могу спорить он весь в дырах.

Снова php – include:

http://www.forum.brgu.ru/index.php?page=/etc/passwd

Пробуем оставить сообщение на форуме:

[sсriрt]аlеrt('хss')[/sсriрt]

Выдим выскочило окно с надписью xss, да и межсайтовый скриптинг при нас.

Получаем Вебшелл.

Уязвимостей тут хоть отбавляй, казалось бы при таком смертельно опасном наборе дыр, взломать сайт не составит проблем, но на самом деле мы не так уж и много имеем sql – иньекция исчерпала свой потенциал, когда отдала нам аккаунты пользователей форма, тем самым сделав бесполезным использование xss, остался только php-include, тоесть мы можем проинклудить вредоносный php скрипт, да но нужно для начала залить этот скрипт на сервер, посмотрев форум мы убедились, что залить свою аватару или вообще заливать свои файлы — возможности нет.

Уже от безнадежности сканируя порты я заметил, что тут стоит фтп сервер и есть анонимный доступ, причем папка:

ftp://www.brgu.ru/pub_rw//

Доступна для записи!

А что если проинклудить файл с фтп? нужно попробывать!

Допустим, существует фтп сервер, но он не предоставляет всю файловую систему в наше распоряжение (если только админ не постарался этого настроить) а только отдельную директорию (такая директория называется домашней директорией фтп сервера), то есть к файлам на фтп теоретически можно обратиться и из http, только нужно знать «домашний» каталог фтп сервера, путь к нему. Примерно так я представлял себе структуру файлов на сервере (на самом деле она оказалась другой, но это не важно, главное принцип)

http://www.brgu.ru/index.php?openpage=../

Означает подняться на один каталог вверх, то есть мне не нужно искать полный путь к домашней папке фтп сервера, а достаточно, знать только название папки (если, конечно, сайт и домашняя директория фтп, находятся в одном дереве каталогов), и просто попытаться угадать

http://www.brgu.ru/index.php?openpage=../ftphome
http://www.brgu.ru/index.php?openpage=../../ftphome
http://www.brgu.ru/index.php?openpage=../../../ftphome

И так пока не пропадет ошибка, если она пропадет, то значит, такой каталог существует, кстати, всегда, можно автоматизировать процесс...

Мне не пришлось этого делать, ибо мне улыбнулась удача!

http://www.brgu.ru/index.php?openpage=../../ftp/

После я зашел на фтп сервер и залил на него скрипт вебшелла, а затем проинклудил его

http://www.brgu.ru/index.php?openpage=../../ftp/pub_rw//shell.php

Теперь вернемся к /etc/passwd, здесь мы можем видеть аккаунты всех пользователей сервера, у r57, есть замечательная возможность, мы можем попробывать сбрутить более привилегированные аккаунты к фтп серверу опираясь на /etc/passwd, получаем:

ftp:ftp
aspirantura1:aspirantura1
profcom11:profcom11

Теперь закачаем наш шелл в другой каталог, и удалим с фтп сервера файлы, что мы заливали ранее (чтоб не палится).

Защита.

Я расскажу только о защите от php – include, поскольку, все остальные уязвимости, найденные в скриптах, не сыграли почти ни какой роли.

Самый надежный способ защититься, это создать массив, в котором будут храниться все возможные значения переменной, и проверять — если в массиве не встречается такого значения переменной, то, например, редикет на главную страницу сайта.

//..................................

$module = $_GET['module'];
$arr = array('main', 'about', 'links', 'forum');
if (!in_array($module,$arr)) $module = $arr[0];
include $module . '.php';

//..............................

Вывод.