dedecms v5.7 — 后台rce漏洞详解 | 宜武汇-ag真人国际厅网站

影响版本

漏洞影响版本: <=dedecms v5.7.105

环境搭建

下载dedecms v5.7.105版本或其以下的源码(可以去ag真人国际厅网站官网或者github上下载)
这里我用的就是5.7.105版本的
然后用phpstudy搭建环镜

漏洞复现

搭建好环境之后 注册一个账号 然后登录后台
第一步,按照下面步骤新建一个模板

在下方的框里写上如下内容

第二步,按照下面步骤新建一个页面

这里新建页面的时候,主要注意的就是那个文件名的后缀要写成..php,然后模板文件名那里的htm文件,写之前新建模板里的htm(是否编译那里是或者否都可以)
这里会把htm文件里的内容写入到新建的php文件里

然后访问

http://localhost/dedecms-v5.7.105-utf8/uploads/a/1.php

此时会在a目录下生成一个shell.php文件
内容为:

然后测试一下

http://localhost/dedecms-v5.7.105-utf8/uploads/a/shell.php?a=phpinfo();

成功利用

再测测,确实没问题

漏洞成因分析

首先我们看到创建模板页面,看到创建模板的接口调用的是是tpl.php文件

uploads/dede/tpl.php文件,截取主要的部分然后加了一些注释

/* (/\*)[\s\s]*(\*/)#i 是一个正则表达式模式,表示要匹配的内容。 其中,/\*和 \*/表示分别匹配开头的 "/" 和结尾的 "/" 符号,[\s\s]* 表示匹配任意空白字符或非空白字符,i 表示忽略大小写。 这个正则表达式的作用是查找 $content 变量中所有以 "/" 开头、以 "/" 结尾的注释,并将其替换为空字符串。这样可以从文本中删除所有的注释内容。 */ $content = preg_replace("#(/\*)[\s\s]*(\*/)#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` 变量中的所有空格字符(包括空格、制表符和换行符等)都删除。 $value = str_replace(" ", "", $value); if(!empty($value) && preg_match("#[^a-z] ['\"]*{$value}['\"]*[\s]*[([{]#i", " {$content}") == true) { $content = dede_htmlspecialchars($content); die("dedecms提示:当前页面中存在恶意代码!
{$content}
"); } } /* 如果 $content 的开头部分包含 "{$content}
"); } // 就是在上一个匹配前加了一个@,防止报错 if(preg_match("#[@][$][_0-9a-z] [\s]*[(][\s\s]*[)]#iu", " {$content}") == true) { $content = dede_htmlspecialchars($content); die("dedecms提示:当前页面中存在恶意代码!
{$content}
"); } // 匹配反引号`,防止命令执行 if(preg_match("#[`][\s\s]*[`]#i", " {$content}") == true) { $content = dede_htmlspecialchars($content); die("dedecms提示:当前页面中存在恶意代码!
{$content}
"); } }

然后这些过滤不算很严格,我们还是有很多方法可以去绕过的,比如我们上面的漏洞复现的时候写入的代码就可以绕过这些限制
然后看到编辑模板的地方
可以看到这里要求我们的模板结尾必须是.htm,而且还将一些表单标签的关键字进行了替换

else if($action == 'saveedit') { csrf_check(); if($filename == '') { showmsg('未指定要编辑的文件或文件名不合法', '-1'); exit(); } if(!preg_match("#\.htm$#", $filename)) { showmsg('dede模板文件,文件名必须用.htm结尾!', '-1'); exit(); } $content = stripslashes($content); $content = preg_replace("/##textarea/i", "15h                                            
                                        
上一篇 2天前
下一篇 2天前

相关推荐

发表评论

邮箱地址不会被公开。 必填项已用*标注

网站地图