基础
dedecms对于输入是首先全局进行过滤的,在/common.inc.php中注册(赋值变量)并过滤外部提交的参数,下图可以看到对输入参数进行addslashes
漏洞分析
首先在 dede\sys_verifies.php的152行
159-160行创建配置文件modifytmp.inc
161-162行给其中写入一些php的头和内容
166行中refiles参数是我们可控的,看起来默认是数组格式,对于refiles里面每一个值从168-180行进行一些操作,注意最重要的是180行,前面都无所谓,这里将传入的refiles数组每一个值拼接了一些字符串写入到了modifytmp.inc中。
如果这里的$filename=";phpinfo();die();#,那么写入到modifytmp.inc中的就是$files[‘1’] = “”;phpinfo();die();#,这样如果有文件包含这个文件就可以执行其中的phpinfo了。
关键是如何让$filename=";phpinfo();die();#,dedecms会提前用addslashes过滤输入的参数,如果我们输入?refiles[]=";phpinfo();die();%23,会被变为\";phpinfo();die();#,这样就不能闭合前面的双引号了。
注意168行,这里有个诡异的操作,会首先舍弃掉$filename的前三个字符
$filename = substr($filename,3,strlen($filename)-3);
如果我们输入为?refiles[]=\";phpinfo();die();%23,进入后端首先会被变为\\\";phpinfo();die();#,然后在168行被截掉前三个字符后$filename=";phpinfo();die();#,然后在第180行成功拼接为$files[‘1’] = “”;phpinfo();die();#,最终写入到modifytmp.inc.
现在已经成功将内容写入到了modifytmp.inc中,接下来继续往下走,在第198行浏览器会去访问sys_verifies.php?action=down&curfile=0
当浏览器访问sys_verifies.php?action=down&curfile=0,可以看到刚好包含了这个配置文件,从而执行了phpinfo()
复现
dede/sys_verifies.php?action=getfiles&refiles[]=123&refiles[]=%22;phpinfo();%23
修复建议
对于输入参数进行严格过滤