四月份知道创宇报出的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次
dede现在基本没开放注册过
我刚去看了下, ,发现为什么我说的那个语句无法%00 就算没开gpc也会成 \0 是因为在 include\common.inc.php function _RunMagicQuotes(&$svar) { if(!get_magic_quotes_gpc()) { if( is_array($svar) ) { foreach($svar as $_k => $_v) $svar[$_k] = _RunMagicQuotes($_v); } else { if( strlen($svar)>0 && preg_match('#^(cfg_|GLOBALS|_GET|_POST|_COOKIE)#',$svar) ) { exit('Request var not allow!'); } $svar = addslashes($svar); } } return $svar; } 但是我用你说的方法好象还是不行。。cookie code 为 alipay get的code也会等于alipay..
现在想找开放会员的站 基本少之又少。大站都关了的,鸡肋啊。。
木有注册功能的难啊
前年的时候大家都开始关闭dede的注册功能了···
这个是因为开启了gpc
%00 会被过滤成\0 吧。。。
顶起
额。不错又一种利用方式。。这个漏洞在出来的时候,我就看过了,漏洞分析很精妙。。但是就研究了,只是这个漏洞早就被补了。。而且不能注册也就传不了图片了。。基本鸡肋。。
截断是硬伤……
在gif中包含php代码,然后在访问时用%00截断掉后面的php,这样确实可以包含呀。 提交的这个方法,是我狭隘了,学xi了
手上有几个,拿去试试
支持一个
兄弟,,,你传的图是.gif 这个包含漏洞是 .php 你怎么包含。。 还有。根本不需要用cookie. 直接访问:www.xx.com/plus/carbuyaction.php?dopost=return&code=yeepay&_REQUEST[code]=../../index 就包含了/index.php
学xi了
我晕,2年前就发现这个漏洞,现在才有人公布出来…
速度围观下!
你的头像 真猥琐啊