Skip to main content

PHP CVE-2026-32813

HIGH
SQL Injection (CWE-89)
2026-03-16 https://github.com/Admidio/admidio GHSA-3x67-4c2c-w45m
8.0
CVSS 3.1 · GitHub Advisory
View

Attack ChainAIDerived

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

  1. Access
    Authenticate to Admidio as user
  2. Delivery
    Create custom list with SQL injection in column name
  3. Exploit
    Save malicious configuration to database
  4. Execution
    Trigger list rendering to execute stored SQL
  5. Impact
    Extract 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.

This Week Schedule remediation this week. Why: HIGH severity (CVSS 7.0-8.9).
Patch available 0.0% exploitation probability (EPSS)

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

Alert me

AnalysisAIv1 – 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

composer admidio/admidio fix: 5.0.7

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

GitHub Advisory PRIMARY 8.0 HIGH
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

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

Lifecycle Timeline

2
Patch released
Mar 31, 2026 - 21:13 nvd
Patch available
CVE Published
Mar 16, 2026 - 21:19 nvd
HIGH 8.0

DescriptionGitHub 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.php lines 89-115
  • D:\bugcrowd\admidio\repo\src\Roles\Entity\ListConfiguration.php lines 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:

  1. Any logged-in user has this permission by default (when groups_roles_edit_lists = 1).
  2. The CSRF token is available in the same session.
  3. 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

Why It Matters

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.

Business Impact: High
Compensating Controls

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

EPSS Score
0.0%
Top 92% exploitable
Data Quality
5 sources
Confidence: Medium

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 HIGH
CISA KEV No
Public POC No
EPSS 0.0%
Patch available Yes
Active threat No
Deciding rule
HIGH severity (CVSS 7.0-8.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
High

Priority Score

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

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

pkg:composer/admidio_admidio

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