CVE-2026-62998
REDAXO: Unwhitelisted ORDER BY Column in rex_list Allows Authenticated Column Enumeration
REDAXO is a PHP-based content management system. Prior to 5.21.2, rex_list::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 rex_user.password. This issue is fixed in version 5.21.2.
Attack profile
How easy it is to exploit
- Attack vector
- Network
- Complexity
- Low
- Privileges needed
- Low
- User interaction
- None
What an attacker can affect
- Confidentiality
- Low
- Integrity
- None
- Availability
- None
Exploit likelihood
What each source reports
CVE List Score used
4.3
REDAXO: Unwhitelisted ORDER BY Column in rex_list Allows Authenticated Column Enumeration
REDAXO is a PHP-based content management system. Prior to 5.21.2, rex_list::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 rex_user.password. This issue is fixed in version 5.21.2.
- Record
CVE-2026-62998- CVSS 3.1
- 4.3 Medium
CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:L/I:N/A:N - Weakness
- CWE-20, CWE-200
- Updated
- 2026-11-02
EUVDEUVD-2026-85332
4.3
REDAXO is a PHP-based content management system. Prior to 5.21.2, rex_list::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 rex_user.password. This issue is fixed in version 5.21.2.
- Record
EUVD-2026-85332- CVSS 3.1
- 4.3 Medium
CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:L/I:N/A:N - Updated
- 2026-11-02
GitHub AdvisoriesGHSA-4f5f-j737-pm58
4.3
REDAXO: Unwhitelisted ORDER BY Column in rex_list Allows Authenticated Column Enumeration
Summary
The rex_list 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 rex_user 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:
public function getSortColumn($default = null)
{
if (rex_request('list', 'string') == $this->getName()) {
return rex_request('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:
protected function prepareQuery($query, array $defaultSort = [])
{
$sortColumn = $this->getSortColumn();
if ('' != $sortColumn) {
$sql = rex_sql::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 rex_user which contains password, previous_passwords, password_change_required — 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=<list_name>&sort=nonexistent_col&sorttype=asc
Response will contain: Unknown column 'nonexistent_col' in 'order clause'
Sort by password hash (data ordering leak):
GET /redaxo/index.php?page=users&list=<list_name>&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:
public function getSortColumn($default = null)
{
if (rex_request('list', 'string') == $this->getName()) {
$requested = rex_request('sort', 'string', $default);
if ($requested !== null && $this->hasColumnOption($requested, REX_LIST_OPT_SORT)) {
return $requested;
}
}
return $default;
}
- Record
GHSA-4f5f-j737-pm58- CVSS 3.1
- 4.3 Medium
CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:L/I:N/A:N - Weakness
- CWE-20, CWE-200
- Updated
- 2026-11-02
NVD
4.3
REDAXO is a PHP-based content management system. Prior to 5.21.2, rex_list::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 rex_user.password. This issue is fixed in version 5.21.2.
- Record
CVE-2026-62998- CVSS 3.1
- 4.3 Medium
CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:L/I:N/A:N - Weakness
- CWE-20, CWE-200
- Updated
- 2026-11-02
OSV
4.3
REDAXO: Unwhitelisted ORDER BY Column in rex_list Allows Authenticated Column Enumeration
REDAXO is a PHP-based content management system. Prior to 5.21.2, rex_list::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 rex_user.password. This issue is fixed in version 5.21.2.
- Record
CVE-2026-62998- CVSS 3.1
- 4.3 Medium
CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:L/I:N/A:N - Weakness
- CWE-20, CWE-200
- Updated
- 2026-11-02
OSVGHSA-4f5f-j737-pm58
4.3
REDAXO: Unwhitelisted ORDER BY Column in rex_list Allows Authenticated Column Enumeration
Summary
The rex_list 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 rex_user 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:
public function getSortColumn($default = null)
{
if (rex_request('list', 'string') == $this->getName()) {
return rex_request('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:
protected function prepareQuery($query, array $defaultSort = [])
{
$sortColumn = $this->getSortColumn();
if ('' != $sortColumn) {
$sql = rex_sql::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 rex_user which contains password, previous_passwords, password_change_required — 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=<list_name>&sort=nonexistent_col&sorttype=asc
Response will contain: Unknown column 'nonexistent_col' in 'order clause'
Sort by password hash (data ordering leak):
GET /redaxo/index.php?page=users&list=<list_name>&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:
public function getSortColumn($default = null)
{
if (rex_request('list', 'string') == $this->getName()) {
$requested = rex_request('sort', 'string', $default);
if ($requested !== null && $this->hasColumnOption($requested, REX_LIST_OPT_SORT)) {
return $requested;
}
}
return $default;
}
- Record
GHSA-4f5f-j737-pm58- CVSS 3.1
- 4.3 Medium
CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:L/I:N/A:N - Weakness
- CWE-20, CWE-200
- Updated
- 2026-11-02
Affected products
Affected packages
| Package | Affected | Fixed |
|---|---|---|
redaxo/sourcePackagist |
through 5.21.1 | 5.21.2 |
redaxo/sourcePackagist |
before 5.21.2, plus listed versions 5.10.05.10.0-beta15.10.0-beta25.10.15.11.0 Show 39 moreShow less5.11.0-beta15.11.15.11.25.12.05.12.0-beta15.12.0-beta25.12.0-beta35.12.15.13.05.13.0-beta15.13.0-beta25.13.15.13.25.13.35.14.05.14.0-beta15.14.0-beta25.14.15.14.25.14.35.15.05.15.0-beta15.15.15.16.05.16.0-beta15.16.15.17.05.17.15.18.05.18.15.18.25.18.35.19.05.20.05.20.15.20.25.21.05.21.0-beta15.21.1 |
5.21.2 |
History
| Recorded | Changed | Sources |
|---|---|---|
| first indexed | CVE List, EUVD, GitHub Advisories, NVD, OSV |
Dates are when Every CVE recorded each change. Upstream dates may differ.
In short
CVE-2026-62998 is a medium vulnerability (CVSS 4.3) in Opnsense Core, published September 23, 2026. No source lists public exploit code. EPSS puts the chance of exploitation in the next 30 days at 0.39%, the 33rd percentile. Fixed in redaxo/source 5.21.2.
References
github.com/redaxo/core/security/advisories/GHSA-4f5f-j737-pm58
github.com/redaxo/core/pull/6580
github.com/redaxo/core/commit/c44ba5206a28427984100c994010f2aaa6703efd
github.com/redaxo/core/releases/tag/5.21.2
nvd.nist.gov/vuln/detail/CVE-2026-62998
github.com/advisories/GHSA-4f5f-j737-pm58
github.com/CVEProject/cvelistV5/tree/main/cves/2026/62xxx/CVE-2026-62998.json
github.com/redaxo/core