By Null Ventures MCP platform
Menu

vulnerability / NVI-00006410 / Revision 2

FacturaScripts: Authenticated SQL injection in the FacturaScripts REST API filter parameter via parenthesis bypass in `Where::sqlColumn`

OSV carries this publisher advisory for facturascripts/facturascripts. This is an aggregated source copy; consult the original publisher and compare update dates.

source listedactiveGHSA-5qmh-x653-g8qjCVE-2026-45262

This report has not inspected your inventory, configuration, deployed build, reachability or evidence. A catalog listing and a severity score do not establish exposure or compromise.

01 / Meaning

Why it matters

Published affected context helps an owner decide what evidence to gather. This report has not examined your application.

02 / Applicability

The affected context

Affected versions, configuration prerequisites and known exclusions are public. Confirm each one against the deployed service.

facturascripts/facturascripts

source listed
  • ECOSYSTEM: introduced 0; fixed 2026.2

## Summary > **Live PoC verified 2026-04-30** against a stock FacturaScripts master at `127.0.0.1:8081`. A scoped `ApiKey` with `fullaccess=0` and an `ApiAccess` row granting `allowget=1` on the `clientes` resource only (no other rights, no UI session, no admin) issued one `GET /api/3/clientes?filter[(0)UNION%20SELECT%20...]=` request and the response body contained the raw bcrypt hash of the admin user's password (`$2y$12$sLfA/XCqnjqLmYJwK.2V7eUHrHTHcQfkTYYfs1.lxX3OHrsmmkMGO`) and the admin's `logkey` cookie value. The leaked `logkey` was injected into a fresh cookie jar and `GET /AdminPlugins` returned 200 with the admin plugin management UI. End-to-end account takeover from a read-only token with no CSRF, no second factor, no rate-limit interaction beyond the default 5-incident IP throttle. `Core/Where.php::sqlColumn()` exempts any field name that contains both `(` and `)` from identifier escaping. The two API filter builders (`APIModel::getWhereValues` and `ApiAttachedFiles::getWhereValues`) feed the raw request key (`$_GET['filter'][$key]`) straight into `new DataBaseWhere($key, $value, '=', ...)`. When the model's `all()` reaches `Where::multiSqlLegacy` -> `Where::sql()` ->

GitHub Advisory Database via OSV

03 / Response

What to do next

  1. vendor patch

    The original advisory lists fixed boundaries 2026.2 for facturascripts/facturascripts. Confirm the publisher’s latest guidance.

    Confirm current vendor support, compatibility and deployment evidence. This report has not tested a fix in your system. GitHub Advisory Database via OSV

A fixed release is not deployment evidence.

Check current vendor support and compatibility. After making a change, verify the deployed build and relevant runtime conditions. Keep the evidence, owner and time. An updated lockfile alone does not prove what is running.

04 / Limits

What this report cannot establish

  • Customer inventory, deployment, reachability and exploitation have not been inspected.
Read the collection and interpretation limits ↗

05 / Provenance

Sources you can inspect

Each assertion retains its source. Mirrored records may repeat one underlying publisher; additional links are not independent corroboration.

  1. GHSA-5qmh-x653-g8qj ↗

    GitHub Advisory Database via OSV · vendor advisory

    Observed . GitHub-origin advisory, CC-BY-4.0; OSV is an aggregate copy, not independent corroboration.

Public revision history

Only published revisions appear here. Routine fetches do not create a material-change event.

  1. Revision 2 ·

    Source facts changed; compare the preserved prior revision.

  2. Revision 1 ·

    First indexed by Null; source disclosure date is shown separately.

Read the public revision data ↗

The next step is private

Bring the question into your environment.

The connected workflow is a development preview for inventory, contextual matching, owner decisions and evidence-based verification. No system-specific result is generated by this page.

See the synthetic workflow preview ↗