源码下载
淦,找了半天没找到漏洞版本源码,只能用最新版本的进行对比了
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.bak
,bak
后缀不认识,继续向左,PHP
后缀认识,则解析成为PHP
文件,同样可以打出重装payload
参考链接
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
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。