四月份知道创宇报出的dedecms本地文件包含漏洞利用
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';
require_once DEDEDATA.'/payment/'.$_REQUEST['code'].'.php';
二、漏洞利用
漏洞原因非常简单,在了解到这个问题的时候,我第一个的反应是怎么利用它?所以我用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!');
}
那么我下面的利用思路就变得清晰了,在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);
}
}
三、PoC
使用copy命令将一个gif小图与php文件进行拼接,然后到上传头像处上传刚刚生成的带有php代码的图片(当然要有一个可以上传的账户,对于dedecms来说,这个要求不苛刻)。如下图所示
图中被圈的部分,为上传图片后的相对路径。下图为使用IE的开发者工具javascript终端设置cookie
下图为设置cookie后,访问带有dopost和code参数的url(../../为dedecms根目录)
OK!打完收工!
评论43次
我列个去,遇到几个,试试去。。。。
截断是永远的痛
Nice job 2013-03-29 近日,国内某安全人员发布了一个“dedecms本地文件包含漏洞”,同时公布了漏洞攻击验证代码