织梦0day漏洞代码分析&复现

admin 2023年2月27日13:10:49评论201 views字数 2542阅读8分28秒阅读模式

织梦0day漏洞代码分析&复现

参考资料:https://mp.weixin.qq.com/s/bwBc4I9GeY6M_WlEDx83TA

织梦官网:https://www.dedecms.com/download

(一)漏洞复现

首先找到功能点 - 默认模板管理

织梦0day漏洞代码分析&复现

然后点击新建模板,再使用xdebug追踪一下代码,代码进入到tpl这个文件,newfile条件判断

织梦0day漏洞代码分析&复现

织梦0day漏洞代码分析&复现

点击保存,代码进入saveedit的条件判断,第100行限制了文件后缀为htm

织梦0day漏洞代码分析&复现

在模板内容中写入一句话,以htm保存

织梦0day漏洞代码分析&复现

织梦0day漏洞代码分析&复现

来到单页文档管理这个功能点,增加一个页面

织梦0day漏洞代码分析&复现

文件名使用php,模板文件使用我们刚才保存的包含一句话的模板

织梦0day漏洞代码分析&复现

开启调试,程序进入templaets_one_add.php中的save条件,这段代码中没有看到明显的过滤文件格式,但这只是运行中的一部分,并不能证明他真的没有过滤,代码分析在第二部分。

织梦0day漏洞代码分析&复现

成功添加页面。

织梦0day漏洞代码分析&复现

后续再对已添加的页面进行更改就会进入templets_one_edit.php这个文件,同样没有明显过滤,效果是一样的。

织梦0day漏洞代码分析&复现

织梦0day漏洞代码分析&复现

织梦0day漏洞代码分析&复现

织梦0day漏洞代码分析&复现

我们查看新增的页面,默认是/a/xxx,这里我们访问/a/test.php?shell=phpinfo();

发现成功拿到webshell

织梦0day漏洞代码分析&复现

(二)漏洞代码分析

首先看新增页面这个功能点当中代码的逻辑,之前看到那段代码中是没有过滤文件名的,我们跟进$sg->SaveToHtml()这个自定义函数

织梦0day漏洞代码分析&复现

并没有发现针对后缀的过滤,继续跟进$this->dtp->SaveTo($filename);

织梦0day漏洞代码分析&复现

这是写入文件的函数,仍然是没有过滤的,找到$this->GetResult()这个函数,可以判断这是获取文件内容的函数。

织梦0day漏洞代码分析&复现

通过阅读GetResult()的代码可以发现,$SourceString就是获得文件内容的参数,这时候发现走到头了,并没有找到给$SourceString传值的代码或函数,说明在之前代码的执行过程中$SourceString已经被赋值了,我们回头看。

织梦0day漏洞代码分析&复现

在$sg->SaveToHtml();之前,实例化了sgpage这个类,可以确定是在构造函数的执行中$SourceString被赋值的,我们跟进spage($aid)

织梦0day漏洞代码分析&复现

在其中找到了关键性代码$this->dtp->LoadTemplate($tplfile);

查看这个自定义函数

织梦0day漏洞代码分析&复现

在LoadTemplate($filename)这个函数中发现SourceString被用户指定的模板里的内容所赋值,然后再进入ParseTemplet()这个函数解析,但LoadTemplate和ParseTemplet都没有针对恶意文件名进行过滤,显而易见问题就是出在新增页面这一步骤中的。

织梦0day漏洞代码分析&复现

织梦0day漏洞代码分析&复现


(三)历史版本对比

在最新补丁中,织梦对tpl.php文件中增加了过滤机制,也就是添加模板这一步,模板的内容被检测了,我们可以看一下代码对比

这是之前的版本

织梦0day漏洞代码分析&复现

这是最新版本

织梦0day漏洞代码分析&复现

过滤代码如下:

// 不允许这些字符$content = preg_replace("#(/*)[sS]*(*/)#i", '', $content);
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,preg_replace';$cfg_disable_funs = $cfg_disable_funs.',[$]_GET,[$]_POST,[$]_REQUEST,[$]_FILES,[$]_COOKIE,[$]_SERVER,include,create_function,array_map,call_user_func,call_user_func_array,array_filert';foreach (explode(",", $cfg_disable_funs) as $value) { $value = str_replace(" ", "", $value); if(!empty($value) && preg_match("#[^a-z]+['"]*{$value}['"]*
展开收缩
*[([{]#i", " {$content}") == TRUE) {
$content = dede_htmlspecialchars($content); die("DedeCMS提示:当前页面中存在恶意代码!<pre>{$content}</pre>"); }}
if(preg_match("#^[sS]+<?(php|=)?
展开收缩
+#i", " {$content}") == TRUE) {
if(preg_match("#[$][_0-9a-z]+
展开收缩
*[(][sS]*[)]
展开收缩
*[;]#iU", " {$content}") == TRUE) {
$content = dede_htmlspecialchars($content); die("DedeCMS提示:当前页面中存在恶意代码!<pre>{$content}</pre>"); } if(preg_match("#[@][$][_0-9a-z]+
展开收缩
*[(][sS]*[)]#iU", " {$content}") == TRUE) {
$content = dede_htmlspecialchars($content); die("DedeCMS提示:当前页面中存在恶意代码!<pre>{$content}</pre>"); } if(preg_match("#[`][sS]*[`]#i", " {$content}") == TRUE) { $content = dede_htmlspecialchars($content); die("DedeCMS提示:当前页面中存在恶意代码!<pre>{$content}</pre>"); }}


原文始发于微信公众号(靶机狂魔):织梦0day漏洞代码分析&复现

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2023年2月27日13:10:49
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   织梦0day漏洞代码分析&复现https://cn-sec.com/archives/1577078.html

发表评论

匿名网友 填写信息