|
|
|
|
|
|
|
|
|
|
Уязвимость позволяет злоумышленнику выполнить 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
Работает на DokuWiki |