四月份知道创宇报出的dedecms本地文件包含漏洞利用

2013-05-13 11:03:55 43 6672


author:唐三
from:奇门遁甲


正文开始之前,先做个广告。我自己搭建了一个博客社区,用于为Hackers提供技术交流的平台,详情请猛戳这里。欢迎有研究精神的Hacers加入,大家以及交流共享:)。想要加入请发送一篇能表现出你拥有研究精神的文章到[email protected],不需首发,并请将你所想要使用的ID和注册邮箱,在邮件中注明。我的站点,请点击这里
一、漏洞原理
      DedeCms是免费的PHP网站内容管理系统。近日,国内某安全人员发布了一个“dedecms本地文件包含漏洞",同时公布了漏洞攻击验证代码。该漏洞影响了DedeCMS V5.7 SP1之前全部版本。
      漏洞出现在include/payment/alipay.php 133:
require_once DEDEDATA.'/payment/'.$_GET['code'].'.php';
和include/payment/yeepay.php 145行:
require_once DEDEDATA.'/payment/'.$_REQUEST['code'].'.php';
攻击者可以利用构造带有目录遍历字符(../)的GET请求,来包含本地任意文件。
二、漏洞利用
       漏洞原因非常简单,在了解到这个问题的时候,我第一个的反应是怎么利用它?所以我用PHP Bug在程序路径里查找调用alipay.php中的respond函数(问题代码存在于该函数中),发现plus/carbuyaction.php文件存在如下代码:
else if ($dopost == 'return')
{
    $write_list = array('alipay', 'bank', 'cod', 'yeepay');
    if (in_array($code, $write_list))
    {
        require_once DEDEINC.'/payment/'.$code.'.php';
        $pay = new $code;
[color=Red]        $msg=$pay->respond();[/color]
        ShowMsg($msg, "javascript:;", 0, 3000);
        exit();  
    } else {
        exit('Error:File Type Can\'t Recognized!');
}
红色代码是调用的问题函数,触发需要满足两个条件,$dopost值为return,和$code值为alipay,bank,code,yeepay中的一个。根据个人对dedecms这套系统的了解,它会将使用GET,POST,COOKIE方法提交的键值,定义为一个变量。也就是说,$dopost和$code的值可以通过GET,POST,COOKIE方法提交。
      那么我下面的利用思路就变得清晰了,在url中添加dopost和code参数,值分别为return和aplipay。这样我就可以成功进入到带有红色代码的代码段中了,即可以跳入到存在文件包含的位置了。
      但是,突然发现原来这句问题代码,我的可控变量居然也是code!!还好这也难不倒我,上面提到通过提交参数定义变量,这个功能的实现代码,我的印象中是用循环写的,顺序是GET,POST,COOKIE。那么,也就是说如果通过GET和COOKIE方法同时传递code参数值,COOKIE的code参数会覆盖掉GET的code参数。为了严谨性,找了下这段代码,在include/common.inc.php文件中79-86行:
foreach(Array('_GET','_POST','_COOKIE') as $_request)
    {
        foreach($$_request as $_k => $_v)
                {
                        if($_k == 'nvarname') ${$_k} = $_v;
                        else ${$_k} = _RunMagicQuotes($_v);
                }
    }
好了,一条顺畅的利用思路出现了。首先,通过设置当前页面的cookie,添加code=alipay键值,然后提交url:http://target/plus/carbuyaction.php?dopost=return&code=文件路径。当然在这之前,我们要能够成功上传一个带有php代码的文件到服务器上,dedecms的会员上传头像功能刚好帮我们达到这个目的。
三、PoC
      使用copy命令将一个gif小图与php文件进行拼接,然后到上传头像处上传刚刚生成的带有php代码的图片(当然要有一个可以上传的账户,对于dedecms来说,这个要求不苛刻)。如下图所示


      图中被圈的部分,为上传图片后的相对路径。下图为使用IE的开发者工具javascript终端设置cookie

     下图为设置cookie后,访问带有dopost和code参数的url(../../为dedecms根目录)

     OK!打完收工!

关于作者

唐门三少17篇文章105篇回复

评论43次

要评论?请先  登录  或  注册
  • 3楼
    2013-5-13 11:27

    我列个去,遇到几个,试试去。。。。

  • 2楼
    2013-5-13 11:18

    截断是永远的痛

  • 1楼
    2013-5-13 11:11

    Nice job 2013-03-29 近日,国内某安全人员发布了一个“dedecms本地文件包含漏洞”,同时公布了漏洞攻击验证代码

    临时安全补丁  修改代码如下  /include/payment/alipay.php 133行的代码: require_once DEDEDATA.'/payment/'.$_GET['code'].'.php';  修改为: $write_list = array('alipay', 'bank', 'cod', 'yeepay'); if (in_array($_GET['code'], $write_list)){ require_once DEDEDATA.'/payment/'.$_GET['code'].'.php'; } else { exit('fix by knownsec.com 2013.03.29'); }  include/payment/yeepay.php 145行的代码:  require_once DEDEDATA.'/payment/'.$_REQUEST['code'].'.php';  修改为:  $write_list = array('alipay', 'bank', 'cod', 'yeepay'); if (in_array($_REQUEST['code'], $write_list)){ require_once DEDEDATA.'/payment/'.$_REQUEST['code'].'.php'; } else { exit('fix by knownsec.com 2013.03.29'); }  在php.ini里设置: display_errors = Off
    表示看完这个公告立马就知道怎么玩了 估计很多人3月左右就补了 围观一下