Drupal Core PostgreSQL SQL 注入漏洞分析(CVE-2026-9082)
摘要
2026年5月20日,Drupal 官方发布安全公告 SA-CORE-2026-004,披露了 Core 中一处未授权 SQL 注入漏洞(CVE-2026-9082,CVSSv3 6.5)。漏洞存在于 PostgreSQL 特定的实体查询条件处理逻辑中,攻击者可利用 JSON:API 模块的过滤参数构造恶意数组键,操纵 PDO 命名占位符解析过程,在未认证条件下对 PostgreSQL 数据库执行任意 SQL 命令。本分析从漏洞原理、影响范围、复现验证及修复方案四个维度展开讨论。
关键词:Drupal;SQL 注入;PostgreSQL;JSON:API;PDO 占位符;CVE-2026-9082
1. 引言
Drupal 是一个开源内容管理框架(CMF),广泛用于构建企业级网站与 Web 应用。JSON:API 模块是 Drupal Core 的标准组件,提供基于 RESTful 规范的数据交互接口,允许客户端通过标准化查询参数对实体数据进行过滤、排序与分页。
近期 披露的 CVE-2026-9082 涉及 JSON:API 模块中过滤器参数处理与 PostgreSQL 数据库层之间的交互缺陷。该漏洞的利用无需身份验证,且 PoC 与 EXP 均已公开,对部署 PostgreSQL 后端的 Drupal 站点构成实际威胁。
2. 漏洞原理
2.1 根因定位
漏洞的根源位于 Drupal Core 中 PostgreSQL 数据库驱动特有的实体查询条件类。该类中的 translateCondition() 方法在处理数组类型过滤条件时存在逻辑缺陷。
在 Drupal 的数据库抽象层中,SQL 查询使用 PDO(PHP Data Objects)的命名占位符机制来防止 SQL 注入。translateCondition() 方法遍历 $condition['value'] 数组,并直接将数组键(key)嵌入为 PDO 占位符名称的组成部分。由于 JSON:API 允许客户端通过 URL 参数 filter[x][condition][value][USER_CONTROLLED_KEY]=val 形式传入任意数组键,攻击者可控制占位符名称的具体内容。
2.2 PDO 占位符注入
PDO 命名占位符解析规则限定有效字符集为 [a-zA-Z0-9_]。当攻击者构造的数组键中包含特殊字符(如右括号 ))时,PDO 解析器会停止占位符名称的识别,该字符及后续内容将被视为字面 SQL 文本,直接拼接到查询语句中。
以 IN() 子句为例,正常情况下生成的查询形式为:
WHERE field IN (:placeholder_0, :placeholder_1)
攻击者通过构造恶意键 ) OR 1=1 -- 作为数组键,可导致占位符解析提前终止,形成:
WHERE field IN (:placeholder_0, :placeholder_) OR 1=1 --)
后续 SQL 载荷被直接注入执行,从而实现任意 SQL 命令执行。
2.3 利用条件
利用该漏洞需满足以下条件 :
- 目标 Drupal 站点使用 PostgreSQL 作为后端数据库;
- 目标站点启用了 JSON:API 模块(Core 标准组件)。
MySQL 及 SQLite 等其他数据库后端不受该漏洞影响。
3. 影响范围
3.1 受影响版本
以下版本的 Drupal Core 受该漏洞影响:
8.9.0 ≤ Drupal < 10.4.1010.5.0 ≤ Drupal < 10.5.1010.6.0 ≤ Drupal < 10.6.911.0.0 ≤ Drupal < 11.1.1011.2.0 ≤ Drupal < 11.2.1211.3.0 ≤ Drupal < 11.3.10
3.2 影响评估
由于 JSON:API 是 Drupal Core 的标准模块,大量站点默认启用了该功能。结合 PostgreSQL 在 Drupal 企业级部署中的较高市场占有率,该漏洞的实际影响面较为广泛。攻击者可利用漏洞执行时间盲注数据提取、权限枚举或进一步的后渗透操作。