四月份知道创宇报出的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次
可是,你这个怎么执行?
NO 我说的是楼主说的这个洞 2年前我就发现了 alipay包含用的是GET 但事实上 COOKIES获取比GET早一步 所以第一次包含用COOKIES可以包含ALIPAY 然后再第二个用GET改变 但是因为这个是自定义函数 变量带不进去 所以这个漏洞根本么有用处 或者说用处很微 特定条件才有用
跟2年前是出在同一个位置,但不是同一个洞。2年前那个补了。
先收藏下
支持一个
我只想说这个漏洞已经存在N久了
还是有很多站开放注册的 对自己有信心 - -。
我能说一句吗
速度围观学xi
感谢分享
php是我永远的伤
你测试的时候,只能根据dedecms的代码,不能单独去写代码测试,因为这里他开了全局变量。。这个洞第一时间出来,我就测试了,可以成功。
我知道了。。谢谢。。要想gpc关闭时 %00就用你这个方法是OK的。。。佩服!!其实这个洞老早知道了。。可惜一直 自己只是拿来包含下php的文件没想到 在gpc关闭下还能这样搞。。以前我一直利用yeepay.php这个文件,,这个文件是用的$_REQUEST['code'] 所以按照你的方法是不成功的。但是在alipay.php 是用的 $_GET 按照你的方法可以成功!。。
我也没有测试成功。。。作者说要在5.3以下。。。。 比较为难吖。。。
鸡肋啊、现在没几个站是开放注册的
也不太懂 求科普 绕过%00 、\0
学xi了 羡慕能手动挖洞的
应该不会这个样子呀,我说的这个方法是由于,dede会根据提交内容的key来定义变量。这样的话,如果,cookie和get定义同一个变量的话,cookie的值会成为这个变量的最终值。但是,肯定不会影响到$_GET呀
现在估计没有几个开启注册了的