dedecms文件上传getshell分析(CVE-2018-20129)

前言

前两天看到dede的这个预警,然后看了一下详情,有的分析文章其实有点毛病。比如安全客这篇,他说“在这里可以明显的看到逻辑错误,这里针对文件名中的异常符号进行了替换为”的操作,并且随后的正则过滤条件限定宽松”,这个是明显的逻辑错误吗?前半段的异常符号的过滤应该没什么问题吧,问题主要在于后面的正则少了个$,但是再具体下去的话,其实也不是这样的,如果真的只是正则问题,那么上传1.jpg.php也是可以的,但并不是这样,估计是有多个过滤和判定的,那就稍微分析一下。

不过这个真的很鸡肋,表面上说是前台,实际上还是得要后台管理员才行。

写着写着,我终于意识到这个漏洞似曾相识,感觉在哪见过,当时没仔细看,就此停笔吧。

问题定位

先用admin账号复现一下,先把会员功能给开了,然后在这里上传一下

拿到直接处理代码了,位于/include/dialog/select_images_post.php,在这里断下调试一下

这里和他们分析的一样。我把文件名改成1.jpg.php传过去试一下

给我提示了Not Admin Upload filetype not allow !,而且没有进入断点,也就是说有另一处判断,全局搜一下,发现了这里,位于include/uploadsafe.inc.php

1
2
3
4
5
6
7
8
9
$cfg_not_allowall = "php|pl|cgi|asp|aspx|jsp|php3|shtm|shtml";
# 省略数行
if(!empty(${$_key.'_name'}) && (preg_match("#\.(".$cfg_not_allowall.")$#i",${$_key.'_name'}) || !preg_match("#\.#", ${$_key.'_name'})) ) // 黑名单匹配
{
if(!defined('DEDEADMIN')) // 后台才能上传黑名单文件
{
exit('Not Admin Upload filetype not allow !');
}
}

我们再看一下相关调用栈

这样逻辑就很清楚了,对于上传的文件过滤,这边先是走了一遍系统公用的include/uploadsafe.inc.php安全防护,而这里用的是黑名单机制,然后再走一遍include/dialog/select_images_post.php的过滤和白名单机制。

如果说整个系统在不同地方的功能不太一样,公用安全粒度粗分,然后具体功能进行细分,其实无可厚非,而且先过滤后判断最后决定执行这个顺序也没有问题,主要的问题是后面那个白名单正则写错了。

此外,又看了看,同一个正则写出问题的也不止这一个地方,还有俩呢

1
2
include/dialog/select_templets_post.php
include/dialog/select_soft_post.php

打开http://localhost/include/dialog/select_templets.phphttp://localhost/include/dialog/select_soft.php

而且还有重命名和路径设置,通过重命名直接就能传php文件了,甚至不需要啥特殊字符过滤,然后还可以跨路径。

文章作者: 倒数第一
文章链接: https://hundan.org/2018-12-22-dedecms%E6%96%87%E4%BB%B6%E4%B8%8A%E4%BC%A0getshell%E5%88%86%E6%9E%90(CVE-2018-20129).html
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 期末日记