一、版本信息
dedecms V5.8.1
cms安装包地址:https://github.com/dedecms/DedeCMS/releases/tag/v5.8.1
成功安装cms后
来到include/common.func.php****目录下 的ShowMsg()方法下
该方法下如果$gourl参数为-1,就会将Referer参数赋值给$gourl,并且无任何过滤,那么说明$gourl参数我们是可以控制的
这里全局搜索哪里使用了ShowMsg()这个方法-------->/plus/flink.php
这里只需要让$dopost参数等于save即可调用ShowMsg()并且调用时只传入了两个参数,第一个$msg参数不影响,传入第二个参数$gourl=-1那么刚好满足Showmsg()方法中$gourl参数可控的条件
继续来到ShowMsg()的代码块
这里判断$gourl和$onlymsg的值,因为/plugs/flink.php调用ShowMsg()时之传入了两个参数,那么$onlymsg=0 所以条件都不满足,直接执行else下的代码
该正则匹配对$gourl参数没什么影响 然后将$gourl赋值给$tgobj
然后接下来$func .= 的意思为 $func = $func. 后面跟拼接的字符串
$func拼接完成后 此时我们可以echo一下$func
成功了 接下来又将$func赋值给$rmsg 经过下面一系列的拼接操作最后将$rmsg拼接给了$msg那么$msg参数就有我们构造的Referer参数
继续往下看
我们查看LoadString(方法)
这里将$msg参数赋值给了sourceString
然后又将MD5编码后的sourceString赋值给了$hashcode
接着又把$hashcode拼接然后赋值给cacheFile 这里我们可以echo $this->cacheFile 来证明一下
看样子应该是生成了一个文件 那么去该目录查看一下
确实保存在了/data/tplcache目录下面
然后我们跟进之前的Display()方法
这个就直接包含了刚才的那个文件 所以直接在referer参数后加上<?php system(ipconfig)?>
但是提示错误了,应该是做了过滤 那么过滤应该就在WriteCache()这个方法里面 继续跟进
看到了CheakDisabledFunctions() 应该就是过滤函数了 直接跟进
看到过滤的字符串,应该就是这里进行过滤了,这里我查看网上的师傅的文章 payload为<?php “system”('ipconfig')?>可以绕过
但根据这个过滤规则 我尝试了一下文件上传上常有的绕过思路 进行参数变异
<?php $a='syste';$b='m';$c=$a.$b;$c('ipconfig');?>好像也可以绕过该过滤函数
以上就是这次dedecms前台rce复现的全部过程
版权归原作者 挖不到洞啊:O 所有, 如有侵权,请联系我们删除。