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

这个漏洞的根源在于“遗留代码”和“不安全的安装流程设计”。
漏洞成因分析
我们来一步步剖析这个漏洞是如何产生的。
安装流程设计
织梦的安装流程大致如下:
- 用户上传程序包到服务器。
- 访问
http://yourdomain.com/install/index.php。 - 安装程序会引导用户填写数据库信息、网站管理员账号密码等。
- 安装程序根据这些信息,修改配置文件(主要是
/data/common.inc.php),并创建数据库表。 - 安装成功后,提示用户删除
install目录。
核心漏洞代码(以经典版本为例)
在旧版本的install/index.php文件中,存在这样一段关键的代码(通常在文件末尾):

// ... 其他安装逻辑 ...
// 检查是否已经安装
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']))
{
// 执行清空数据库等操作,然后重新开始安装流程
// ... 重新安装的代码 ...
}
}
// ... 其他代码 ...
漏洞利用链路
攻击者正是利用了上述代码逻辑:
- 前提条件:目标网站的
install目录没有被删除。 - 访问安装页面:攻击者直接访问
http://yourdomain.com/install/index.php。 - 触发重装:攻击者在URL后加上
?reinstall=1(或其他类似参数,具体取决于版本),http://yourdomain.com/install/index.php?reinstall=1 - 绕过检查:安装程序发现
../data/common.inc.php文件存在(说明网站已经安装过),但由于install_lock.txt文件不存在(这个文件通常只在安装成功时创建一次,且容易被忽略或被删除),并且URL中包含了reinstall参数,所以程序认为这是一个“合法”的重装请求。 - 重新安装流程:程序跳过了初始检查,直接进入重新安装的步骤,攻击者可以在此步骤中:
- 填写新的管理员信息:设置自己想要的
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中,为了获取配置信息,可能会使用require或include函数,如果参数没有经过严格过滤,就可能造成本地文件包含漏洞。
代码可能这样写:

$step = isset($_GET['step']) ? $_GET['step'] : '1'; require_once 'install_step_'.$step.'.php';
如果攻击者可以控制step参数,并且magic_quotes_gpc是off状态,他可能可以包含其他文件来执行代码。
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的用户必须遵守的铁律。
