Discuz 6.x 7.x cookie GLOBALS变量覆盖远程命令执行漏洞
更新时间:
许可信息: 本文采用 自由转载-非商用-非衍生-保持署名 许可协议,作者alpha1e0,转载请注明作者或出处链接。
本文分析Discuz 6.x 7.x cookie GLOBALS变量覆盖远程命令执行漏洞
1 简介
绕过GLOBALS限制,控制GLOBALS变量,利用preg_replace任意命令执行。该漏洞影响discuz 6.x 7.x,文中分析以7.0为例
PHP <5.50中,preg_replace函数中pattern支持“e“修饰符,当使用e修饰符的时候会造成安全问题
2 漏洞原理
问题的根源:
@include/discuzcode.inc.php #L112
从上面可以看到,只要控制$GLOBALS['_DCACHE']['smilies']['searcharray']
和$GLOBALS['_DCACHE']['smilies']['replacearray']
就可以执行任意命令了
2.1 突破GLOBALS限制
Discuz本身有伪全局机制,因此不需要register_global开启就可以”解压“变量,问题是在php全局文件中对GLOBALS做了限制:
@include/common.inc.php #L29
如上图所示,会判断$_REQUEST变量中是否有GLOBALS,只有突破这里的限制才能继续进行
在PHP中,如果配置request_order = "GP"
,则$_REQUEST
只包含$_GET和$_POST
此时通过cookie提交参数即可突破限制(discuz的伪全局也会”解压“cookie参数)
在PHP 5.3中request_order = “GP” 是默认的
2.2 利用方式1
从@include/discuzcode.inc.php #L112
可以看到,只有!$smileyoff && $allowsmilies
为true
才能够触发漏洞
反向跟踪discuzcode函数,找到
@viewthread.php #L585
可以看到,只要$post['message']=false $forum['allowsmilies']=true
,即可触发漏洞,而前者只要帖子信息中有表情图片就可以,后者需要论坛版块允许发表情(默认设置)
步骤:
1、找一篇有”表情“图片的帖子,如果没有则回帖,其中插入”表情“
2、设置cookie为:
GLOBALS[_DCACHE][smilies][searcharray]=/.*/e; GLOBALS[_DCACHE][smilies][replacearray]=phpinfo();
利用条件:帖子或帖子的回复中插入有“表情”
2.3 利用方式2
从@announcement.php #L23 #L33
可以看到只要存在公告信息即可触发漏洞
利用条件:有”公告“信息
2.4 全局漏洞利用条件
- Discuz 6.x 7.x
- php<5.5.0,支持preg_replace e修饰符
- php.ini request_order = “GP”(php>=5.3默认)
3 参考
- http://www.wooyun.org/bugs/wooyun-2014-080723
- http://www.secpulse.com/archives/2338.html
- http://bobao.360.cn/learning/detail/107.html