极品分享

Dedecms include\dialog\select_soft_post.php 变量覆盖漏洞导致任意文件上传漏洞及解决方案

1. 漏洞描述

综合来说,这个漏洞的根源是"register_globals = on",在这个漏洞的前提下,攻击者可以发动这样的攻击向量

1. 当前网站的"register_globals = on"已开启

2. 在代码中没有显式声明、初始化的变量

3. 在用户提交的HTML表单中提交了相同名字的字段

4. 在以上的前提下,黑客可以任意控制代码中变量的值

大体来说,黑客可以有两种利用、及入侵方式


1. 通过注入、覆盖变量$cfg_basedir,导致可以饶过身份认证和系统变量初始化文件,导致可以上传任意文件到指定目录

2. 通过注入、覆盖变量$cfg_not_allowall、$newname等字段,绕过文件扩展名检查防御代码,向目标文件夹直接上传WEBSHELL

这两种攻击向量的最终目的都是向服务端上传WEBSHELL(.PHP、.ASP、.htaccess)等文件


2. 漏洞触发条件

1. register_globals = on: 网站本身的安全设置

2. 攻击者可以通过自定义表单为相关的变量赋值: 伪造HTTP数据包


3. 漏洞影响范围

1. Dedecms 5.5

2. DEDECMS v5.5 Final


4. 解决方案

   4.1. include/common.inc.php

//检查和注册外部提交的变量
function CheckRequest(&$val) 
{
  if (is_array($val)) 
  {
    foreach ($val as $_k=>$_v) 
    {
      CheckRequest($_k);
      CheckRequest($val[$_k]);
    }
  } 
  else
  {
    if( strlen($val)>0 && preg_match('#^(cfg_|GLOBALS)#',$val) )
    {
      exit('Request var not allow!');
    }
  }
}
2. /include/uploadsafe.inc.php
//为了防止用户通过注入的可能性改动了数据库
//这里强制限定的某些文件类型禁止上传
$cfg_not_allowall = "php|pl|cgi|asp|aspx|jsp|php3|shtm|shtml";
...
if(!empty(${$_key.'_name'}) && (eregi("\.(".$cfg_not_allowall.")$",${$_key.'_name'}) || !ereg("\.",${$_key.'_name'})) )
{
  if(!defined('DEDEADMIN'))
  {
    exit('Upload filetype not allow !');
  }
}

   4.2. select_soft_post.php文件的修复方案 

....
if (preg_match('#\.(php|pl|cgi|asp|aspx|jsp|php5|php4|php3|shtm|shtml)$#i', trim($filename))) 
{
  ShowMsg("你指定的文件名被系统禁止!",'javascript:;');
  exit();
}
$fullfilename = $cfg_basedir.$activepath.'/'.$filename;
$fullfileurl = $activepath.'/'.$filename;
....


5.补丁下载:

dedecms_edit.inc.php留言板注入漏洞补丁+pm.php会员中心注入漏洞补丁+mtypes.php会员中心注入漏洞补丁+common.inc.phpSESSION变量覆盖导致SQL注入漏洞补丁+filter.inc.php注入漏洞补丁+select_soft_post.php任意文件上传漏洞补丁.rar




2016-07-18 0 /
PHP学习
/
标签: 

评论回复

回到顶部