CVE-2026-62998: REDAXO: Unwhitelisted ORDER BY Column in rex_list Allows Authenticated Column Enumeration

Published Sep 23, 2026
·
Updated

Summary The rexlist component reads the SQL sort column directly from the sort GET parameter without validating it against the set of columns declared sortable via setColumnSortable(). Although the value is wrapped in backticks via escapeIdentifier() (preventing classical SQL injection), this still allows any authenticated backend user to ORDER BY any column in the query's FROM tables, including unselected sensitive columns such as password from the rexuser table, and perform error-based column enumeration.

Details File: redaxo/src/core/lib/list.php:976-982 — getSortColumn() returns the raw request parameter without whitelist check: php public function getSortColumn($default = null) { if (rexrequest('list', 'string') == $this->getName()) { return rexrequest('sort', 'string', $default); // NO validation against sortable columns } return $default; }

File: redaxo/src/core/lib/list.php:899-911 — prepareQuery() uses it directly in the ORDER BY clause: php protected function prepareQuery($query, array $defaultSort = []) { $sortColumn = $this->getSortColumn(); if ('' != $sortColumn) { $sql = rexsql::factory($this->db); $sortColumn = $sql->escapeIdentifier($sortColumn); // backtick-wraps, but no whitelist if ($defaultSort || false === stripos($query, ' ORDER BY ')) { $query .= ' ORDER BY ' . $sortColumn . ' ' . $sortType; } }

The users list queries rexuser which contains password, previouspasswords, passwordchangerequired — not in the SELECT. Specifying a non-existent column name produces a MySQL Unknown column exception whose message is propagated to the user, confirming or denying column existence.

PoC Column enumeration (error-based): GET /redaxo/index.php?page=users&list=<listname>&sort=nonexistentcol&sorttype=asc Response will contain: Unknown column 'nonexistentcol' in 'order clause'

Sort by password hash (data ordering leak): GET /redaxo/index.php?page=users&list=<listname>&sort=password&sorttype=asc Users are silently reordered by their Argon2 password hash.

Impact Authenticated backend users (non-admin) can enumerate database column names of internal tables via error messages and manipulate query ordering to include sensitive unselected columns. While this does not allow arbitrary SQL execution due to backtick escaping, it constitutes an information disclosure vulnerability enabling targeted further attacks.

Fix Validate the sort request parameter against the whitelist of columns registered with setColumnSortable() before use in the query: php public function getSortColumn($default = null) { if (rexrequest('list', 'string') == $this->getName()) { $requested = rexrequest('sort', 'string', $default); if ($requested !== null && $this->hasColumnOption($requested, REXLISTOPTSORT)) { return $requested; } } return $default; }

Other sources

REDAXO is a PHP-based content management system. Prior to 5.21.2, rexlist::getSortColumn() in redaxo/src/core/lib/list.php accepts the sort request parameter without checking whether setColumnSortable() registered the requested column. An authenticated backend user can make prepareQuery() add an escaped but unauthorized ORDER BY identifier, allowing error-based enumeration of columns in joined tables and ordering by unselected sensitive fields such as rexuser.password. This issue is fixed in version 5.21.2.

— NVD

Affected Software

2 affected componentsFixes available
REDAXO REDAXO<5.21.2
composer/redaxo/source<=5.21.1
5.21.2

Remediation

Recommended actions to resolve this vulnerability, in priority order.

  1. Upgrade

    Upgrade composer/redaxo/source to a version that resolves this vulnerability.

    Fixed in 5.21.2
  2. Upgrade

    Upgrade REDAXO to a version that resolves this vulnerability.

    Fixed in 5.21.2

Event History

Sep 23, 2026
CVE Published
via MITRE·02:07 PM
Data Sourced
via MITRE·02:07 PM
DescriptionSeverityWeakness
Data Sourced
via NVD·03:17 PM
DescriptionSeverityWeakness
Sep 24, 2026
Advisory Published
via GitHub·02:57 PM
Data Sourced
via GitHub·02:57 PM
DescriptionSeverityWeaknessAffected Software

Frequently Asked Questions

1

Who can exploit this issue?

An authenticated REDAXO backend user can exploit it. No user interaction is required, and the attack can be performed over the network.

2

Which deployments are affected?

REDAXO versions prior to 5.21.2 are affected where rex_list::getSortColumn() processes the sort request parameter. Version 5.21.2 contains the fix.

3

What can an attacker obtain or do?

An attacker can use error-based behavior to enumerate columns in joined tables and can order results using unselected sensitive fields, including rex_user.password. The provided severity vector indicates low confidentiality impact, with no integrity or availability impact.

4

How can I mitigate the issue if I cannot upgrade immediately?

The provided data does not identify a workaround. Restricting access to authenticated backend accounts can reduce exposure because exploitation requires a backend user account.

Contact

SecAlerts Pty Ltd.
132 Wickham Terrace
Fortitude Valley,
QLD 4006, Australia
info@secalerts.co
By using SecAlerts services, you agree to our services end-user license agreement. This website is safeguarded by reCAPTCHA and governed by the Google Privacy Policy and Terms of Service. All names, logos, and brands of products are owned by their respective owners, and any usage of these names, logos, and brands for identification purposes only does not imply endorsement. If you possess any content that requires removal, please get in touch with us.
© 2026 SecAlerts Pty Ltd.
ABN: 70 645 966 203, ACN: 645 966 203