[12.01.2005] Межсайтовый скриптинг в обработке вложенных BB тегов

Уязвимость позволяет злоумышленнику выполнить XSS атаку и получить доступ к важным данным пользователей.

Уязвимость существует из-за некорректной обработки параметров «спаренных тегов» в теле сообщения. Злоумышленник может выполнить произвольный javascript сценарий в браузере целевого пользователя и потенциально получить административный доступ к системе.

Уязвимость проявляется при вставке одного BB тега, в качестве аргумента другого BB тега (спаренные теги). При этом, оба тега парсятся в соответствующие HTML теги, но поскольку один из них оказывается внутри атрибутов другого, то структура HTML нарушается. Нарушение структуры может быть использовано для вставки произвольного скрипта.

Пример/эксплоит:

[COLOR=[IMG]http://aaa.aa/=`aaa.jpg[/IMG]]` style=background:url(javascript:alert()) [/COLOR]

Исправление:

Открыть файл ./sources/lib/post_parser.php, найти:

while ( preg_match( "#\[size=([^\]]+)\](.+?)\[/size\]#ies", $txt ) )
{
$txt = preg_replace( "#\[size=([^\]]+)\](.+?)\[/size\]#ies"    , "\$this->regex_font_attr(array('s'=>'size','1'=>'\\1','2'=>'\\2'))", $txt );
}
 
while ( preg_match( "#\[font=([^\]]+)\](.*?)\[/font\]#ies", $txt ) )
{
$txt = preg_replace( "#\[font=([^\]]+)\](.*?)\[/font\]#ies"    , "\$this->regex_font_attr(array('s'=>'font','1'=>'\\1','2'=>'\\2'))", $txt );
}
 
while( preg_match( "#\[color=([^\]]+)\](.+?)\[/color\]#ies", $txt ) )
{
$txt = preg_replace( "#\[color=([^\]]+)\](.+?)\[/color\]#ies"  , "\$this->regex_font_attr(array('s'=>'col' ,'1'=>'\\1','2'=>'\\2'))", $txt );
}

Заменить на:

while ( preg_match( "#\[size=([0-9]+)\](.+?)\[/size\]#is", $txt ) )
{
$txt = preg_replace( "#\[size=([0-9]+)\](.+?)\[/size\]#ies"    , "\$this->regex_font_attr(array('s'=>'size','1'=>'\\1','2'=>'\\2'))", $txt );
}
 
while ( preg_match( "#\[font=([a-zA-Z]+)\](.*?)\[/font\]#is", $txt ) )
{
$txt = preg_replace( "#\[font=([a-zA-Z]+)\](.*?)\[/font\]#ies"    , "\$this->regex_font_attr(array('s'=>'font','1'=>'\\1','2'=>'\\2'))", $txt );
}
 
while( preg_match( "#\[color=([a-zA-Z]+)\](.+?)\[/color\]#is", $txt ) )
{
$txt = preg_replace( "#\[color=([a-zA-Z]+)\](.+?)\[/color\]#ies"  , "\$this->regex_font_attr(array('s'=>'col' ,'1'=>'\\1','2'=>'\\2'))", $txt );
}

Найти:

  $IN['1'] = preg_replace( "/[&\(\)\.\%]/", "", $IN['1'] );

Заменить на:

  $IN['1'] = preg_replace( "/[&\(\)\.\%\[\]<>]/", "", $IN['1'] );

Найти:

   $IN['1'] = $IN['1'] + 7;

Заменить на:

   $IN['1'] = intval($IN['1']) + 7;

Найти:

  else if ($IN['s'] == 'col')
  {
   return "<span style='color:".$IN['1']."'>".$IN['2']."</span>";
  }
  else if ($IN['s'] == 'font')
  {
   return "<span style='font-family:".$IN['1']."'>".$IN['2']."</span>";
  }

Заменить на:

  else if ($IN['s'] == 'col')
  {
   $IN[1] = preg_replace( "/[^\d\w\#\s]/s", "", $IN[1] );
   return "<span style='color:".$IN[1]."'>".$IN['2']."</span>";
  }
  else if ($IN['s'] == 'font')
  {
   $IN['1'] = preg_replace( "/[^\d\w\#\-\_\s]/s", "", $IN['1'] );
   return "<span style='font-family:".$IN['1']."'>".$IN['2']."</span>";
  }

Ссылки по теме:
Поодробное описание уязвимости от Angol

 

security/2.0.x/medium/12.01.2005.txt · Последние изменения: 2007/08/14 12:01 (внешнее изменение)

Работает на DokuWiki
© 2002—2006 ibresource
e-mail: wikiteam@iblink.ru