CVE-2026-28805
OpenSTAManager: Time-Based Blind SQL Injection via `options[stato]` Parameter
OpenSTAManager is an open source management software for technical assistance and invoicing. Prior to version 2.10.2, multiple AJAX select handlers in OpenSTAManager are vulnerable to Time-Based Blind SQL Injection through the options[stato] GET parameter. The user-supplied value is read from $superselect['stato'] and concatenated directly into SQL WHERE clauses as a bare expression, without any sanitization, parameterization, or allowlist validation. An authenticated attacker can inject arbitrary SQL statements to extract sensitive data from the database, including usernames, password hashes, financial records, and any other information stored in the MySQL database. This issue has been patched in version 2.10.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
- High
- Integrity
- High
- Availability
- High
Exploit likelihood
What each source reports
CVE List Score used
8.8
OpenSTAManager: Time-Based Blind SQL Injection via `options[stato]` Parameter
OpenSTAManager is an open source management software for technical assistance and invoicing. Prior to version 2.10.2, multiple AJAX select handlers in OpenSTAManager are vulnerable to Time-Based Blind SQL Injection through the options[stato] GET parameter. The user-supplied value is read from $superselect['stato'] and concatenated directly into SQL WHERE clauses as a bare expression, without any sanitization, parameterization, or allowlist validation. An authenticated attacker can inject arbitrary SQL statements to extract sensitive data from the database, including usernames, password hashes, financial records, and any other information stored in the MySQL database. This issue has been patched in version 2.10.2.
- Record
CVE-2026-28805- CVSS 3.1
- 8.8 High
CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H - Weakness
- CWE-89
- Updated
- 2026-11-02
EUVDEUVD-2026-18231
8.8
OpenSTAManager is an open source management software for technical assistance and invoicing. Prior to version 2.10.2, multiple AJAX select handlers in OpenSTAManager are vulnerable to Time-Based Blind SQL Injection through the options[stato] GET parameter. The user-supplied value is read from $superselect['stato'] and concatenated directly into SQL WHERE clauses as a bare expression, without any sanitization, parameterization, or allowlist validation. An authenticated attacker can inject arbitrary SQL statements to extract sensitive data from the database, including usernames, password hashes, financial records, and any other information stored in the MySQL database. This issue has been patched in version 2.10.2.
- Record
EUVD-2026-18231- CVSS 3.1
- 8.8 High
CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H - Updated
- 2026-11-02
GitHub AdvisoriesGHSA-3gw8-3mg3-jmpc
8.8
OpenSTAManager has a Time-Based Blind SQL Injection via `options[stato]` Parameter
Description
Multiple AJAX select handlers in OpenSTAManager <= 2.10.1 are vulnerable to Time-Based Blind SQL Injection through the options[stato] GET parameter. The user-supplied value is read from $superselect['stato'] and concatenated directly into SQL WHERE clauses as a bare expression, without any sanitization, parameterization, or allowlist validation.
An authenticated attacker can inject arbitrary SQL statements to extract sensitive data from the database, including usernames, password hashes, financial records, and any other information stored in the MySQL database.
Affected Endpoints
Three modules share the same vulnerability pattern:
1. Preventivi (Quotes) - Primary
- Endpoint:
GET /ajax_select.php?op=preventivi - File:
modules/preventivi/ajax/select.php, line 60 - Required parameters:
options[idanagrafica](any valid ID)
Vulnerable code:
// modules/preventivi/ajax/select.php, lines 59-60
$stato = !empty($superselect['stato']) ? $superselect['stato'] : 'is_pianificabile';
$where[] = '('.$stato.' = 1)';
The $stato variable is inserted as a bare expression inside parentheses. The resulting SQL fragment becomes ({user_input} = 1), allowing an attacker to break out of the expression and inject arbitrary SQL.
2. Ordini (Orders)
- Endpoint:
GET /ajax_select.php?op=ordini-cliente - File:
modules/ordini/ajax/select.php, line 52 - Required parameters:
options[idanagrafica](any valid ID)
Vulnerable code:
// modules/ordini/ajax/select.php, lines 51-52
$stato = !empty($superselect['stato']) ? $superselect['stato'] : 'is_fatturabile';
$where[] = '`or_statiordine`.'.$stato.' = 1';
The $stato variable is inserted as a column name reference. The resulting SQL fragment becomes `or_statiordine`.{user_input} = 1, allowing injection after the table-column reference.
3. Contratti (Contracts)
- Endpoint:
GET /ajax_select.php?op=contratti - File:
modules/contratti/ajax/select.php, line 57 - Required parameters:
options[idanagrafica](any valid ID)
Vulnerable code:
// modules/contratti/ajax/select.php, lines 56-57
$stato = !empty($superselect['stato']) ? $superselect['stato'] : 'is_pianificabile';
$where[] = '`idstato` IN (SELECT `id` FROM `co_staticontratti` WHERE '.$stato.' = 1)';
The $stato variable is inserted inside a subquery. The resulting SQL fragment becomes WHERE {user_input} = 1), allowing an attacker to close the subquery and inject into the outer query.
Root Cause Analysis
Data Flow
- The attacker sends a GET request with
options[stato]=<payload>to/ajax_select.php ajax_select.php(line 30) reads the value viafilter('options'), which applies HTMLPurifier sanitization- HTMLPurifier strips HTML tags and the
>character, but does NOT strip SQL keywords (SELECT,SLEEP,IF,UNION, etc.) or SQL-significant characters ((,),=,', etc.) - The sanitized value is passed to
AJAX::select()insrc/AJAX.php(line 40) AJAX::getSelectResults()assigns$superselect = $options(line 273) andrequires the module'sselect.phpfile (line 275)- The module's
select.phpreads$superselect['stato']and concatenates it directly into the$where[]array AJAX::selectResults()joins all WHERE elements withANDand executes the query viaQuery::executeAndCount()(line 120)
Why HTMLPurifier is Insufficient
HTMLPurifier is an HTML sanitization library designed to prevent XSS attacks. It is not an SQL injection prevention mechanism. Specifically:
- It does not strip SQL keywords:
SELECT,SLEEP,IF,UNION,FROM,WHERE - It does not strip SQL operators:
=,(,),,,+,-,* - It strips the
>character (used in HTML), which can be bypassed using MySQL'sGREATEST()function - It provides zero protection against SQL injection
Proof of Concept
Prerequisites
- A valid user…
- Record
GHSA-3gw8-3mg3-jmpc- CVSS 3.1
- 8.8 High
CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H - Weakness
- CWE-89
- Updated
- 2026-11-02
NVD
8.8
OpenSTAManager is an open source management software for technical assistance and invoicing. Prior to version 2.10.2, multiple AJAX select handlers in OpenSTAManager are vulnerable to Time-Based Blind SQL Injection through the options[stato] GET parameter. The user-supplied value is read from $superselect['stato'] and concatenated directly into SQL WHERE clauses as a bare expression, without any sanitization, parameterization, or allowlist validation. An authenticated attacker can inject arbitrary SQL statements to extract sensitive data from the database, including usernames, password hashes, financial records, and any other information stored in the MySQL database. This issue has been patched in version 2.10.2.
- Record
CVE-2026-28805- CVSS 3.1
- 8.8 High
CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H - Weakness
- CWE-89
- Updated
- 2026-11-02
OSV
8.8
OpenSTAManager: Time-Based Blind SQL Injection via `options[stato]` Parameter
OpenSTAManager is an open source management software for technical assistance and invoicing. Prior to version 2.10.2, multiple AJAX select handlers in OpenSTAManager are vulnerable to Time-Based Blind SQL Injection through the options[stato] GET parameter. The user-supplied value is read from $superselect['stato'] and concatenated directly into SQL WHERE clauses as a bare expression, without any sanitization, parameterization, or allowlist validation. An authenticated attacker can inject arbitrary SQL statements to extract sensitive data from the database, including usernames, password hashes, financial records, and any other information stored in the MySQL database. This issue has been patched in version 2.10.2.
- Record
CVE-2026-28805- CVSS 3.1
- 8.8 High
CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H - Weakness
- CWE-89
- Updated
- 2026-11-02
OSVGHSA-3gw8-3mg3-jmpc
8.8
OpenSTAManager has a Time-Based Blind SQL Injection via `options[stato]` Parameter
Description
Multiple AJAX select handlers in OpenSTAManager <= 2.10.1 are vulnerable to Time-Based Blind SQL Injection through the options[stato] GET parameter. The user-supplied value is read from $superselect['stato'] and concatenated directly into SQL WHERE clauses as a bare expression, without any sanitization, parameterization, or allowlist validation.
An authenticated attacker can inject arbitrary SQL statements to extract sensitive data from the database, including usernames, password hashes, financial records, and any other information stored in the MySQL database.
Affected Endpoints
Three modules share the same vulnerability pattern:
1. Preventivi (Quotes) - Primary
- Endpoint:
GET /ajax_select.php?op=preventivi - File:
modules/preventivi/ajax/select.php, line 60 - Required parameters:
options[idanagrafica](any valid ID)
Vulnerable code:
// modules/preventivi/ajax/select.php, lines 59-60
$stato = !empty($superselect['stato']) ? $superselect['stato'] : 'is_pianificabile';
$where[] = '('.$stato.' = 1)';
The $stato variable is inserted as a bare expression inside parentheses. The resulting SQL fragment becomes ({user_input} = 1), allowing an attacker to break out of the expression and inject arbitrary SQL.
2. Ordini (Orders)
- Endpoint:
GET /ajax_select.php?op=ordini-cliente - File:
modules/ordini/ajax/select.php, line 52 - Required parameters:
options[idanagrafica](any valid ID)
Vulnerable code:
// modules/ordini/ajax/select.php, lines 51-52
$stato = !empty($superselect['stato']) ? $superselect['stato'] : 'is_fatturabile';
$where[] = '`or_statiordine`.'.$stato.' = 1';
The $stato variable is inserted as a column name reference. The resulting SQL fragment becomes `or_statiordine`.{user_input} = 1, allowing injection after the table-column reference.
3. Contratti (Contracts)
- Endpoint:
GET /ajax_select.php?op=contratti - File:
modules/contratti/ajax/select.php, line 57 - Required parameters:
options[idanagrafica](any valid ID)
Vulnerable code:
// modules/contratti/ajax/select.php, lines 56-57
$stato = !empty($superselect['stato']) ? $superselect['stato'] : 'is_pianificabile';
$where[] = '`idstato` IN (SELECT `id` FROM `co_staticontratti` WHERE '.$stato.' = 1)';
The $stato variable is inserted inside a subquery. The resulting SQL fragment becomes WHERE {user_input} = 1), allowing an attacker to close the subquery and inject into the outer query.
Root Cause Analysis
Data Flow
- The attacker sends a GET request with
options[stato]=<payload>to/ajax_select.php ajax_select.php(line 30) reads the value viafilter('options'), which applies HTMLPurifier sanitization- HTMLPurifier strips HTML tags and the
>character, but does NOT strip SQL keywords (SELECT,SLEEP,IF,UNION, etc.) or SQL-significant characters ((,),=,', etc.) - The sanitized value is passed to
AJAX::select()insrc/AJAX.php(line 40) AJAX::getSelectResults()assigns$superselect = $options(line 273) andrequires the module'sselect.phpfile (line 275)- The module's
select.phpreads$superselect['stato']and concatenates it directly into the$where[]array AJAX::selectResults()joins all WHERE elements withANDand executes the query viaQuery::executeAndCount()(line 120)
Why HTMLPurifier is Insufficient
HTMLPurifier is an HTML sanitization library designed to prevent XSS attacks. It is not an SQL injection prevention mechanism. Specifically:
- It does not strip SQL keywords:
SELECT,SLEEP,IF,UNION,FROM,WHERE - It does not strip SQL operators:
=,(,),,,+,-,* - It strips the
>character (used in HTML), which can be bypassed using MySQL'sGREATEST()function - It provides zero protection against SQL injection
Proof of Concept
Prerequisites
- A valid user…
- Record
GHSA-3gw8-3mg3-jmpc- CVSS 3.1
- 8.8 High
CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H - Weakness
- CWE-89
- Updated
- 2026-11-02
Affected products
Affected packages
| Package | Affected | Fixed |
|---|---|---|
devcode-it/openstamanagerPackagist |
through 2.10.1 | 2.10.2 |
devcode-it/openstamanagerPackagist |
before 2.10.2, plus listed versions 2.3.0v2.10-betav2.10.1v2.4v2.4.1 Show 45 moreShow lessv2.4.10v2.4.11v2.4.12v2.4.13v2.4.14v2.4.15v2.4.16v2.4.17v2.4.17.1v2.4.18v2.4.19v2.4.2v2.4.20v2.4.21v2.4.22v2.4.23v2.4.24v2.4.25v2.4.26v2.4.27v2.4.28v2.4.29v2.4.3v2.4.30v2.4.31v2.4.32v2.4.33v2.4.34v2.4.35v2.4.36v2.4.37v2.4.38v2.4.39v2.4.4v2.4.40v2.4.41v2.4.42v2.4.43v2.4.44v2.4.45v2.4.46v2.4.47v2.4.48v2.4.49v2.4.5 |
2.10.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-28805 is a high vulnerability (CVSS 8.8) in Devcode Openstamanager, published April 1, 2026. No source lists public exploit code. EPSS puts the chance of exploitation in the next 30 days at 0.47%, the 40th percentile. Fixed in devcode-it/openstamanager 2.10.2.
References
github.com/devcode-it/openstamanager/security/advisories/GHSA-3gw8-3mg3-jmpc
github.com/devcode-it/openstamanager/commit/50b9089c506ba2ca249afb1dfead2af5d42c10e7
github.com/devcode-it/openstamanager/commit/679c40fa5b3acad4263b537f367c0695ff9666dc
github.com/devcode-it/openstamanager/releases/tag/v2.10.2
nvd.nist.gov/vuln/detail/CVE-2026-28805
github.com/advisories/GHSA-3gw8-3mg3-jmpc
github.com/CVEProject/cvelistV5/tree/main/cves/2026/28xxx/CVE-2026-28805.json
github.com/devcode-it/openstamanager
Left out here: 39 versions and the rest of 2 source descriptions. The JSON record has them.