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修饰符的时候会造成安全问题

exploit

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

突破GLOBALS限制

如上图所示,会判断$_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 && $allowsmiliestrue才能够触发漏洞

反向跟踪discuzcode函数,找到

@viewthread.php #L585

viewthread.php

可以看到,只要$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 可以看到只要存在公告信息即可触发漏洞

announcement.php

利用条件:有”公告“信息

2.4 全局漏洞利用条件

  1. Discuz 6.x 7.x
  2. php<5.5.0,支持preg_replace e修饰符
  3. 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

标签:

 打赏:  如果您觉得该文档有用,可以选择微信扫码打赏,谢谢
微信打赏码