DedeCMS 5.7通用重装漏洞分析

源码下载

淦,找了半天没找到漏洞版本源码,只能用最新版本的进行对比了

DedeCms v5.7 GBK 下载地址:http://www.dedecms.com/dl/dl.php?action=dl&type=0&lang=gbk

DedeCms v5.7 UTF8 下载地址:http://www.dedecms.com/dl/dl.php?action=dl&type=0&lang=utf-8

复现要求

Apache中间件解析漏洞(方便利用index.php.bak

install文件夹未删除(利用index.php或者index.php.bak

数据库账户密码

本地部署

phpstudy部署

因为是本地,数据库直接弱密码 root/root

安装成功

漏洞分析

安装完成后,在install文件夹下会生成install_lock.txt文件来防止二次安装

这个时候我们访问网址下的install文件夹,可以看到提示:

存在漏洞的源代码为,即/install/index.php.bak

1 $verMsg = ' V5.7 GBKSP1'; 2 $s_lang = 'gb2312'; 3 $dfDbname = 'dedecmsv57gbksp1'; 4 $errmsg = ''; 5 $install_demo_name = 'dedev57demo.txt'; 6 $insLockfile = dirname(__FILE__).'/install_lock.txt'; 7 $moduleCacheFile = dirname(__FILE__).'/modules.tmp.inc'; 8 9 define('DEDEINC',dirname(__FILE__).'/../include'); 10 define('DEDEDATA',dirname(__FILE__).'/../data'); 11 define('DEDEROOT',preg_replace("#[\\\\\/]install#", '', dirname(__FILE__))); 12 header("Content-Type: text/html; charset={$s_lang}"); 13 14 require_once(DEDEROOT.'/install/install.inc.php'); 15 require_once(DEDEINC.'/zip.class.php'); 16 17 foreach(Array('_GET','_POST','_COOKIE') as $_request) 18 { 19 foreach($$_request as $_k => $_v) ${$_k} = RunMagicQuotes($_v); 20 } 21 22 require_once(DEDEINC.'/common.func.php'); 23 24 if(file_exists($insLockfile)) 25 { 26 exit(" 程序已运行安装,如果你确定要重新安装,请先从FTP中删除 install/install_lock.txt!"); 27 } 28 29 if(empty($step)) 30 { 31 $step = 1; 32 }

查看源代码,可以看到判断条件,存在漏洞的源代码这里位于第24行

if(file_exists($insLockfile)) { exit(" 程序已运行安装,如果你确定要重新安装,请先从FTP中删除 install/install_lock.txt!"); }

追踪$insLockfile,位于第六行

$insLockfile = dirname(__FILE__).'/install_lock.txt';

而新版本中修改了这两部分为:

第18行

define('INSLOCKFILE', dirname(__FILE__).'/install_lock.txt');

第37行

if(file_exists(INSLOCKFILE)) { exit(" 程序已运行安装,如果你确定要重新安装,请先从FTP中删除 install/install_lock.txt!"); }

开发人员将变量直接定义成了常量写死,即无法进行变量覆盖,查看变量覆盖代码,位于这两者之间

第17行

foreach(Array('_GET','_POST','_COOKIE') as $_request) { foreach($$_request as $_k => $_v) ${$_k} = RunMagicQuotes($_v); }

很明显存在变量覆盖漏洞

遍历数组 Array('_GET','_POST','_COOKIE')并赋值给$_request变量,遍历$$_request,也就是遍历$_GET,$_POST,$_COOKIE将其获取到的键值数组依次赋给 $_k,$_v,即key => value,接着对$_v进行一个RunMagicQuotes函数的过滤,并将变量${$_k}的值赋成过滤后的$_v

因为在18行定义的时候,相当于是$insLockfile=dirname(__FILE__).'/install_lock.txt'

现在只需要覆盖成一个不可能存在的文件名即可,随便想一个 springbird

整理流程,传入INSLOCKFILE=springbird,这时候$_k=insLockfile,$_v=springbird,${$_k}=$insLockfile,所以最后

$insLockfile=springbird,在判断处就能够进行逃逸进行重装了,但是还需要数据库账户密码,这里使用常用密码爆破即可。

如果是index.php存在该漏洞,则无需用到Apache解析漏洞,但如果是index.php.bak,则需要利用Apache的解析特性,即从右往左解析,若解析到了不认识的,继续向左,直到有一个认识的为止。

index.php.bakbak后缀不认识,继续向左,php后缀认识,则解析成为php文件,同样可以打出重装payload

参考链接

https://bt7k.com/?p=26

https://blog.csdn.net/forest_fire/article/details/50944224

https://www.mi1k7ea.com/2019/06/20/PHP变量覆盖漏洞/#0x07-导致的变量覆盖

https://www.myhack58.com/Article/html/3/62/2013/39131.htm


__EOF__

本文作者春告鳥
本文链接https://www.cnblogs.com/Cl0ud/p/14187118.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   春告鳥  阅读(740)  评论(0编辑  收藏  举报
编辑推荐:
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
点击右上角即可分享
微信分享提示