Зайшов я якось на сайт e.polestudio.ru, полазив на ньому, нічого цікавого не знайшов. Але тут я помітив щось знайоме в лінку, що вказує на архів новин. Точно, це ж скрипт під назвою «Новини», який я недавно скачав, і в ньому є одна досить дурна вразливість (хай вибачать мене творці скрипта :)).

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

Пройшовши її, ми вводимо текст новости, який передається файлу script.php параметром data. Найголовніше — у файлі script.php ніякої авторизацією навіть і не пахне 🙂 Цей скрипт записує дані, передані в параметрі data у файл, ім’я якого є поточна дата. Я от і вирішив відкрити e.polestudio.ru/mywindows/admin/script.php?data=Hello. Напис Hello! досить дрібно відбилася в середині сторінки /mywindows/index.php. Всі! Можна було досить красиво отдефейсить. Але мені хотілося більшого 🙂

І тут мені прийшла ідея, а що якщо вписати замість тексту новини, тоді, при вдалому розкладі, можна буде виконувати будь-які команди. Пробую — /mywindows/admin/script.php?data=. Потім відкриваю /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 рядок:

> перед

А в файл script.php додайте після рядка include(«config.php»);

if (!isset($pass)) exit;
$q=strcmp($pass,$password);