DedeCMS V5.7后台过滤不当导致Getshell(每周一洞)

0x01 前言

前两天看到七月火表哥再先知发的一篇审计文章,感觉不错,是dedecms的getshell。就分析了一下,顺便写一篇文章学习。

0x02 环境

环境和之前的一篇文章一样可以作为参考:
https://getpass.cn/2018/03/10/DedeCMS%20V5.7%20SP2%20Background%20Getshell%20Code%20Execution%20Vulnerability/

0x03 复现漏洞

  1. 进入后台添加广告的地方:http://sb.com/dede/ad_main.php
  2. 在添加页面加上我们的代码:--><?php phpinfo();?><!--
  3. 然后点击查看代码
  4. 访问执行代码

0x04 漏洞分析

dede\ad_add.php,代码可以读一遍,插入数据库的时候并没有对危险函数进行处理。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
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查询数据库内容,可以看到把expbodynormbody的内容加入到$adbody的数组里面,但是这里内容是在注释符中间的,我们可以用注释闭合的方式。
最后面的几行是写入文件,然后最后包含文件,这里就成功执行了我们的代码。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
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

https://xz.aliyun.com/t/2470

当前网速较慢或者你使用的浏览器不支持博客特定功能,请尝试刷新或换用Chrome、Firefox等现代浏览器