漏洞简介

织梦CMS在1月12日修复几个高危漏洞,之前逛博客看到是Yu22x挖到的这个洞,今天刚好复现下这个漏洞

影响范围

dedecms 5.7.85 https://www.dedecms.com/download

漏洞分析

根据官方补丁,修复了如下两处插件功能的漏洞,下载下来本地对比分析。

图片

plus/ad_js.php

图片2

很明显可以看到,右边补丁新增了对$adbody的内容进行过滤,那么看下这个$adbody接下来有何用处。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

global $cfg_disable_funs;
$cfg_disable_funs = isset($cfg_disable_funs) ? $cfg_disable_funs : 'phpinfo,eval,assert,exec,passthru,shell_exec,system,proc_open,popen,curl_exec,curl_multi_exec,parse_ini_file,show_source,file_put_contents,fsockopen,fopen,fwrite';
foreach (explode(",", $cfg_disable_funs) as $value) {
$value = str_replace(" ", "", $value);
if(!empty($value) && preg_match("#[^a-z]+['\"]*{$value}['\"]*[\s]*[(]#i", " {$adbody}") == TRUE) {
$adbody = dede_htmlspecialchars($adbody);
die("DedeCMS提示:当前页面中存在恶意代码!<pre>{$adbody}</pre>");
}
if(!empty($value) && preg_match("#[^<]+<\?(php|=)#i", " {$adbody}") == TRUE) {
$adbody = dede_htmlspecialchars($adbody);
die("DedeCMS提示:当前页面中存在恶意代码!<pre>{$adbody}</pre>");
}
}

经过简单的对$adbody内容进行换行符编码之后(36-39行),就直接将内容写入$cacheFile中(40-42行),并且在44行直接包含了该缓存文件。

图片

其中$cacheFile的获取可以在21行看到是从数据库中查询出来的(21行)。 $aid是由用户传参获取的,那么插入数据库时,这个$aid是否是随机的呢?我们全局搜索#@__myad这个表(Ctrl+Shift+R)。

image-20220214132534792

只有找到这一个插入功能,并且默认是自增的。

我们在/dede/ad_add.php中尝试新增一个广告

image-20220214133049549

image-20220214133102027

也可以从这能获取到该编号,当我们去访问http://192.168.3.8/plus/ad_js.php?arcID=1时,php代码便成功执行了(它会去检测DEDEDATA.'/cache/myad-'.$aid.'.htm';下文件是否存在,若不存在便进行写入,最终都会去包含这个文件,导致RCE)。