PHP
CVE-2026-32813
HIGH
Attack ChainAIDerived
Hypothetical attack flow derived from CVE metadata – not a confirmed exploit chain
-
AccessAuthenticate to Admidio as user
-
DeliveryCreate custom list with SQL injection in column name
-
ExploitSave malicious configuration to database
-
ExecutionTrigger list rendering to execute stored SQL
-
ImpactExtract sensitive data or modify records
Vulnerability Assessment
| Weakness |
CWE
OWASP Top 10:2025
A05:2025 - Injection
ASVS 5.0
V1 - Encoding and Sanitization Parameterized queries, prepared statements
MITRE ATT&CK
2 techniques across 2 tactics: Initial Access, Persistence The technique list with ATT&CK links and the kill-chain view is part of the Basic plan and up. |
| Exploitation Conditions | Authenticated user account required on Admidio instance with MyList configuration feature enabled. User must have permissions to create or edit custom list column layouts. The stored malicious SQL payload executes when any user (including the attacker) renders the affected list view. |
| Impact | This vulnerability presents high real-world risk despite requiring authentication. The CVSS 8.0 score accurately reflects the severe impact (confidentiality, integrity, availability all HIGH) with low attack complexity and only requiring low privileges. While user interaction is needed (UI:R), the attack persists in the database and triggers for all subsequent viewers. The detailed PoC availability significantly increases exploitation likelihood. The vulnerability is not in KEV and EPSS data is not available, suggesting no active exploitation yet, but the low barrier to exploit (any authenticated user by default) and severe impact make this a priority for patching. |
| Exploit ScenarioDerived | An attacker with basic authenticated access (default for all logged-in users) crafts a malicious MyList configuration containing SQL injection payloads in column names or sort parameters, which bypasses minimal validation checks. When any user views the compromised list, the injected SQL executes, allowing data extraction or modification. The provided proof-of-concept demonstrates both column-based and sort-based injection techniques requiring only HTTP POST requests with valid session cookies. |
Get an e-mail when this CVE is exploited, patched or re-scored. Free account.
Alert meAnalysisAIv1 – Mar 17, 2026
A second-order SQL injection vulnerability exists in Admidio's MyList configuration feature, allowing authenticated users to inject arbitrary SQL commands through list column configurations that are safely stored but unsafely read back. The vulnerability enables attackers to read sensitive data including password hashes, modify database contents, or achieve full database compromise. A detailed proof-of-concept is available demonstrating exploitation requiring only standard user privileges.
RemediationAI
Admidio users should immediately update to the latest patched version once available (check the vendor advisory at https://github.com/Admidio/admidio/security/advisories/GHSA-3x67-4c2c-w45m). Until a patch is available, administrators should disable the groups_roles_edit_lists permission for non-administrative users to prevent exploitation. The vendor should implement strict allowlists for column names, validate sort parameters to only accept ASC/DESC values, add defense-in-depth validation in getSql(), and use parameterized queries in ConditionParser.
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
The vulnerability affects Admidio (CPE: pkg:composer/admidio_admidio), an open-source membership management system written in PHP. The issue is a classic CWE-89 SQL Injection vulnerability with a second-order execution pattern - user input is safely stored via prepared statements in the adm_list_columns table, but when retrieved and used to construct dynamic SQL queries in ListConfiguration::getSql(), the values are directly interpolated without sanitization. Four injection points exist: column names in SELECT clauses, sort directions in ORDER BY clauses, column names in WHERE conditions, and filter values processed by ConditionParser.
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:L/PR:L/UI:R/S:U/C:H/I:H/A:H
Primary rating from GitHub Advisory · only source for this CVE.
CVSS VectorGitHub Advisory
Lifecycle Timeline
2DescriptionGitHub Advisory
Summary
The MyList configuration feature in Admidio allows authenticated users to define custom list column layouts. User-supplied column names, sort directions, and filter conditions are stored in the adm_list_columns table via prepared statements (safe storage), but are later read back and interpolated directly into dynamically constructed SQL queries without sanitization or parameterization. This is a classic second-order SQL injection: safe write, unsafe read.
An attacker can inject arbitrary SQL through these stored values to read, modify, or delete any data in the database, potentially achieving full database compromise.
Details
Step 1: Storing the Payload (Safe Write)
In modules/groups-roles/mylist_function.php (lines 89-115), user-supplied POST array values for column names, sort directions, and filter conditions are accepted. The only validation on column values is a prefix check (must start with usr_ or mem_). Sort and condition values have no validation at all. These values are stored in the database via ListConfiguration::addColumn() which calls Entity::save() using prepared statements -- so the INSERT/UPDATE is safe.
Key source file references:
D:\bugcrowd\admidio\repo\modules\groups-roles\mylist_function.phplines 89-115D:\bugcrowd\admidio\repo\src\Roles\Entity\ListConfiguration.phplines 106-116
Step 2: Triggering the Payload (Unsafe Read)
When the list is viewed (via lists_show.php), ListConfiguration::getSql() reads the stored values and interpolates them directly into SQL in four locations:
Injection Point 1 -- lsc_special_field in SELECT clause: File D:\bugcrowd\admidio\repo\src\Roles\Entity\ListConfiguration.php lines 739-770. The lsc_special_field value is read from the database and used as a column name in the SELECT clause. Only three values (mem_duration, mem_begin, mem_end) get special handling; all others fall through to the default case where the raw value is used directly as both $dbColumnName and $sqlColumnName, then interpolated into the SQL as $dbColumnName AS $sqlColumnName.
Injection Point 2 -- lsc_sort in ORDER BY clause: File D:\bugcrowd\admidio\repo\src\Roles\Entity\ListConfiguration.php lines 790-792. The lsc_sort value is appended directly after the column name in the ORDER BY clause.
Injection Point 3 -- lsc_special_field in search conditions: File D:\bugcrowd\admidio\repo\src\Roles\Entity\ListConfiguration.php lines 611-621. The lsc_special_field value is interpolated into COALESCE() expressions used in search WHERE conditions.
Injection Point 4 -- lsc_filter via ConditionParser: File D:\bugcrowd\admidio\repo\src\Roles\ValueObject\ConditionParser.php line 347. The ConditionParser appends raw characters from the stored filter value to the SQL string. A single quote can break out of the SQL string context.
Root Cause
The addColumn() method and mylist_function.php accept arbitrary strings for column names, sort directions, and filter conditions. The only gate for column names is a prefix check (usr_ or mem_), which is trivially satisfied by an attacker (e.g., usr_id) UNION SELECT ...). No allowlist of valid column names exists. No server-side validation of sort values exists (should only allow ASC/DESC/empty). The frontend <select> element only offers ASC/DESC, but this is trivially bypassed by POSTing arbitrary values.
PoC
Prerequisites: Logged-in user with list edit permission (default: all logged-in users).
Step 1: Save a list config with SQL injection in lsc_special_field
curl -X POST "https://TARGET/adm_program/modules/groups-roles/mylist_function.php?mode=save_temporary" \
-H "Cookie: ADMIDIO_SESSION_ID=<session>" \
-d "adm_csrf_token=<csrf_token>" \
-d "column[]=usr_login_name" \
-d "column[]=usr_id FROM adm_users)--" \
-d "sort[]=" \
-d "sort[]=" \
-d "condition[]=" \
-d "condition[]=" \
-d "sel_roles[]=<valid_role_uuid>"The second column value usr_id FROM adm_users)-- starts with usr_ so it passes the prefix check. When read back in getSql(), it is interpolated directly as a column expression in the SQL SELECT clause.
Step 2: Sort-based injection (simpler, no prefix check needed)
curl -X POST "https://TARGET/adm_program/modules/groups-roles/mylist_function.php?mode=save_temporary" \
-H "Cookie: ADMIDIO_SESSION_ID=<session>" \
-d "adm_csrf_token=<csrf_token>" \
-d "column[]=usr_login_name" \
-d "sort[]=ASC,(SELECT+CASE+WHEN+(1=1)+THEN+1+ELSE+1/0+END)" \
-d "condition[]=" \
-d "sel_roles[]=<valid_role_uuid>"This injects into the ORDER BY clause. The sort value has zero server-side validation.
Step 3: The save_temporary mode automatically redirects to lists_show.php which calls ListConfiguration::getSql(), executing the injected SQL.
Impact
- Data Exfiltration: An attacker can extract any data from the database including password hashes, email addresses, personal data of all members, and application configuration.
- Data Modification: With stacked queries (supported by MySQL with PDO), the attacker can modify or delete data.
- Privilege Escalation: Password hashes can be extracted and cracked, or admin accounts can be directly modified.
- Full Database Compromise: The entire database is accessible through this vulnerability.
The attack requires authentication and CSRF token, but:
- Any logged-in user has this permission by default (when
groups_roles_edit_lists = 1). - The CSRF token is available in the same session.
- The injected payload persists in the database and triggers every time anyone views the list.
Recommended Fix
Fix 1: Allowlist for lsc_special_field
Add a strict allowlist of valid special field names before calling addColumn() in mylist_function.php. The list should match exactly the field names supported in getSql() and the JavaScript on mylist.php.
Fix 2: Validate lsc_sort values
In ListConfiguration::addColumn(), validate that the sort parameter is one of ASC, DESC, or empty string before storing it.
Fix 3: Defense-in-depth validation in ListConfiguration::getSql()
Also validate the lsc_special_field value against an allowlist in getSql() before interpolating it into the SQL string. This protects against payloads already stored in the database.
Fix 4: Escape filter values in ConditionParser
Use parameterized queries or at minimum escape single quotes in ConditionParser::makeSqlStatement().
Executive ViewAI
Organizations using MyList configuration feature in Admidio face notable risk from CVE-2026-32813, a SQL injection vulnerability rated CVSS 8.0. Successful exploitation could allow attackers to execute arbitrary code or commands on affected systems, potentially leading to full system compromise. Organizations should apply vendor updates when available and consider compensating controls in the interim.
Apply vendor patch. If immediate patching is not feasible: (1) Deploy WAF rules to block injection patterns; (2) Restrict network access to affected components; (3) Enable enhanced logging for suspicious activity.
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
SQL injection exploits the way applications construct database queries by mixing user input directly into SQL statements.
Cross-Site Request Forgery exploits the automatic credential inclusion behavior of web browsers.
Privilege escalation occurs when an attacker leverages flaws in access control mechanisms to gain permissions beyond what they were originally granted.
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-3x67-4c2c-w45m
NVD
CVE.org
EPSS
VulDB
Exploit-DB