宇宙主机交流论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

欧基零壹微头条IP归属甄别会员请立即修改密码
123
返回列表 发新帖
楼主: ReJeCt

[经验] 用DEDECMS的注意了,赶紧修改后台地址

[复制链接]
发表于 2011-8-11 12:32:36 | 显示全部楼层
最好别用开源软件,或者别让别人知道你是什么程序
发表于 2011-8-11 12:50:41 | 显示全部楼层
  去试试我看上的几个站
发表于 2011-8-11 13:25:53 | 显示全部楼层
DeDe垃圾
发表于 2011-8-11 13:27:46 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
发表于 2011-8-11 13:30:19 | 显示全部楼层
原帖由 geyunbing 于 2011-8-11 09:52 发表
靠  又出bug
发表于 2011-8-11 13:36:14 | 显示全部楼层
瞧瞧,对此问题无视。
发表于 2011-8-11 13:44:31 | 显示全部楼层
没开全局变量
发表于 2011-8-11 13:45:50 | 显示全部楼层
会员中心和后台 该删除的删除 该改名改名
 楼主| 发表于 2011-8-11 15:45:33 | 显示全部楼层
dede出fix补丁有点慢的
 楼主| 发表于 2011-8-12 17:49:34 | 显示全部楼层
DEDECMS全局变量覆盖漏洞最早是狼族安全小组09年公布的,官方硬撑到现在没修补漏洞,到现在基本上覆盖了DEDECMS全部的版本。个人猜想是不是官方故意留下的后门。下面稍微科普下这个漏洞,大牛们可以完全无视:



一. 了解PHP超级全局变量

下面是PHP的超级全局变量,可以了解一个特性,全是数组。
$GLOBALS, 所有全局变量数组
$_SERVER, 服务器环境变量数组
$_GET,通过GET方法传递给脚本的变量数组
$_POST, 通过POST方法传递给脚本的变量数组
$_COOKIE,cookie变量数组
$_REQUEST,所有用户输入的变量数组,包括$_GET, $_POST和$_COOKIE所包含的输入内容
$_FILES,与文件上传相关得变量数组
$_ENV,环境变量数组
$_SESSION,会话变量数组

二. 理解$_GET变量

可以写个PHP来看看:
<?php
var_dump($_GET);
?>

访问
http://127.0.0.1/test.php?key=value
得到
array(1) { ["key"]=> string(5) "value" }
OK,看到这里应该明白了,$_GET就是个数组,我们用GET方法可以传一个数组。

再访问
http://127.0.0.1/test.php?key[arr1]=value
得到
array(1) { ["key"]=> array(1) { ["arr1"]=> string(5) "value" } }
我们通过GET方法传入了一个嵌套数组。

到这里其实问题就出来了,很多PHP安全资料都没提过GET传嵌套数组的这个特性,偶尔在几个exploit里看到 - -!

三. 深入跟进DEDECMS全局变量注册漏洞

真正理解了$_GET变量后,我们来深入跟进这个漏洞产生的真正原因,模拟一下漏洞的全过程:

提交一个嵌套数组:
http://127.0.0.1/test.php?_POST[GLOBALS][cfg_dbname]=X

array(1) { ["_POST"]=> array(1) { ["GLOBALS"]=> array(1) { ["cfg_dbname"]=> string(1) "X" } } }

假如数据传入了DEDECMS程序,在第一层过滤,DEDECMS会检查$_REQUEST里有没有全局变量的关键字,但我们的KEY是_POST且是个数组,所以轻松绕过。
foreach($_REQUEST as $_k=>$_v)
{
if( strlen($_k)>0 && eregi('^(cfg_|GLOBALS)',$_k) )
{
        exit('Request var not allow!');
}
}

接着进入真正的注册变量流程,按顺序是先从$_GET变量注册的,我们的KEY是(_POST),第一轮遍历$_GET成功注册了变量$_POST,第二轮遍历$_POST成功注册了变量$GLOBALS !
foreach(Array('_GET','_POST','_COOKIE') as $_request)
{
foreach($$_request as $_k => $_v) ${$_k} = _RunMagicQuotes($_v);
}
到这里漏洞的原因就清楚了,程序通过$_GET注册了$_POST,通过$_POST注册了$GLOBALS!

四. 领悟漏洞后的修补

完全领悟这个漏洞后,就会知道怎么修补了。

1. 可以看看DISCUZ是怎么做的,当发现KEY的第一个字符存在_就不注册变量。

foreach(array('_COOKIE', '_POST', '_GET') as $_request) {
foreach($$_request as $_key => $_value) {
  $_key{0} != '_' && $$_key = daddslashes($_value);
}
}

2. DEDECMS可以用下面的方法临时修补,当遍历$_POST注册变量,发现变量名存在GLOBALS就会阻止注册变量。


foreach(Array('_GET','_POST','_COOKIE') as $_request)
{
         foreach($$_request as $_k => $_v) {
                    if( strlen($_k)>0 && eregi('^(cfg_|GLOBALS)',$_k) ){
                            exit('Request var not allow!');
                   }
                    ${$_k} = _RunMagicQuotes($_v);
    }
}

PS:安全就是基础,必须理解好基础。



详细的
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|兜哪儿主机交流论坛

GMT+8, 2024-9-23 05:24 , Processed in 0.062825 second(s), 6 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表