织梦install漏洞

99ANYc3cd6
预计阅读时长 12 分钟
位置: 首页 织梦建站 正文

织梦CMS的install漏洞,通常指的是在网站安装完成后,安装目录没有及时删除,导致攻击者可以通过访问/install/index.php文件,利用其中残留的特定代码,重新执行安装流程,从而获取网站的Webshell(网站后门),完全控制服务器。

织梦install漏洞
(图片来源网络,侵删)

这个漏洞的根源在于“遗留代码”“不安全的安装流程设计”


漏洞成因分析

我们来一步步剖析这个漏洞是如何产生的。

安装流程设计

织梦的安装流程大致如下:

  1. 用户上传程序包到服务器。
  2. 访问http://yourdomain.com/install/index.php
  3. 安装程序会引导用户填写数据库信息、网站管理员账号密码等。
  4. 安装程序根据这些信息,修改配置文件(主要是/data/common.inc.php),并创建数据库表。
  5. 安装成功后,提示用户删除install目录。

核心漏洞代码(以经典版本为例)

在旧版本的install/index.php文件中,存在这样一段关键的代码(通常在文件末尾):

织梦install漏洞
(图片来源网络,侵删)
// ... 其他安装逻辑 ...
// 检查是否已经安装
if(file_exists('../data/common.inc.php'))
{
    // 如果配置文件存在,则直接引入它
    require_once('../data/common.inc.php');
    // 这里是漏洞的核心!
    // 如果安装锁文件(install_lock.txt)不存在,并且设置了特定参数,则允许重新安装
    if(!file_exists('install_lock.txt') && isset($_GET['reinstall']))
    {
        // 执行清空数据库等操作,然后重新开始安装流程
        // ... 重新安装的代码 ...
    }
}
// ... 其他代码 ...

漏洞利用链路

攻击者正是利用了上述代码逻辑:

  1. 前提条件:目标网站的install目录没有被删除。
  2. 访问安装页面:攻击者直接访问http://yourdomain.com/install/index.php
  3. 触发重装:攻击者在URL后加上?reinstall=1(或其他类似参数,具体取决于版本), http://yourdomain.com/install/index.php?reinstall=1
  4. 绕过检查:安装程序发现../data/common.inc.php文件存在(说明网站已经安装过),但由于install_lock.txt文件不存在(这个文件通常只在安装成功时创建一次,且容易被忽略或被删除),并且URL中包含了reinstall参数,所以程序认为这是一个“合法”的重装请求。
  5. 重新安装流程:程序跳过了初始检查,直接进入重新安装的步骤,攻击者可以在此步骤中:
    • 填写新的管理员信息:设置自己想要的admin账号和密码。
    • 修改数据库配置:将数据库连接信息指向一个由攻击者控制的数据库(虽然不常用,但有可能)。
    • 最关键的一步:写入Webshell,在安装过程中,织梦会向某些文件(如/data/config.cache.inc.php/data safe/config.inc.php)写入配置信息,攻击者可以利用这个过程,将恶意的PHP代码伪装成配置信息写入,将$cfg_dbuser的值设置为一小段恶意代码,如eval($_POST['cmd']);,这样,当这个配置文件被网站其他页面包含时,攻击者就可以通过POST提交cmd参数来执行任意PHP代码,这就是Webshell。

漏洞变种与利用方式

随着织梦版本的更新,直接的?reinstall=1可能已经失效,但攻击者会寻找其他利用点。

文件包含漏洞

install/index.php中,为了获取配置信息,可能会使用requireinclude函数,如果参数没有经过严格过滤,就可能造成本地文件包含漏洞。

代码可能这样写:

织梦install漏洞
(图片来源网络,侵删)
$step = isset($_GET['step']) ? $_GET['step'] : '1';
require_once 'install_step_'.$step.'.php';

如果攻击者可以控制step参数,并且magic_quotes_gpcoff状态,他可能可以包含其他文件来执行代码。

SQL注入漏洞

在安装过程中,程序需要向数据库写入数据,这个过程如果使用了用户可控的变量且没有进行过滤,就可能产生SQL注入,虽然直接利用SQL注入获取Webshell比较困难,但攻击者可以利用它获取数据库信息,为进一步攻击做准备。

配置文件写入漏洞

这是最核心的变种,即使重装功能被修复,攻击者如果能找到其他方式向data目录下的PHP文件写入内容,就能达到同样的目的,通过某个存在文件上传漏洞的模块,上传一个图片马,然后利用包含漏洞去执行它。


防御与修复方案

这个漏洞的修复非常简单,核心思想就是“斩草除根”

核心修复:删除install目录

这是最有效、最根本的修复方法。

  • 操作:网站安装完成后,务必通过FTP或服务器的文件管理器,将/install整个目录彻底删除。
  • 重要性:即使目录里没有漏洞代码,保留它也是一个安全隐患,因为它暴露了网站的CMS类型和版本信息。

代码层面修复(适用于开发者)

如果你是织梦的开发者或者二次开发,可以从代码层面加固:

  • 彻底移除重装逻辑:在install/index.php中,找到所有与“重新安装”(reinstall)相关的代码,直接删除,安装就是安装,没有“重装”的概念。
  • 增加安装锁文件:在安装成功时,创建一个名为install.lock的文件,并在install/index.php的最开始就检查这个文件,如果文件存在,则直接显示“已安装,请勿重复操作”并终止脚本。
    // 在install/index.php的最顶部
    if (file_exists('../install.lock')) {
        die('系统已安装,请勿重复操作!如果您需要重新安装,请先删除根目录下的 install.lock 文件。');
    }
  • 严格过滤所有用户输入:对$_GET, $_POST, $_REQUEST等所有外部输入进行严格的过滤和验证,防止SQL注入、XSS和文件包含漏洞。

服务器层面加固

  • 设置目录权限:确保/data目录的执行权限被关闭(在Linux上使用chmod -x /data),这样即使攻击者写入了一个PHP文件,也无法通过Web直接执行。
  • 使用Web应用防火墙:WAF可以识别并拦截对/install/index.php的访问请求,以及一些已知的攻击特征,提供额外的安全防护。

织梦install漏洞是一个典型的“配置错误”类漏洞,其危害性极大,因为它能让攻击者在几秒钟内获得整个网站的控制权。

对于普通用户来说,记住一条黄金法则:

安装完成后,第一时间删除install目录!

对于开发者和安全研究人员来说,这个漏洞提醒我们:

  • 不要留下任何“调试”或“遗留”的生产环境代码。
  • 安装流程应该是单向的、不可逆的。
  • 永远不要信任任何来自外部的输入。

尽管现代的织梦版本已经修复了最明显的?reinstall=1漏洞,但“删除安装目录”这一安全实践依然是所有使用织梦CMS的用户必须遵守的铁律。

-- 展开阅读全文 --
头像
dede上传图片失败不显示怎么办?
« 上一篇 02-12
织梦pagelist乱码怎么办?
下一篇 » 02-13

相关文章

取消
微信二维码
支付宝二维码

目录[+]