{"items":[{"id":"NVI-00006410","kind":"vulnerability","title":"FacturaScripts: Authenticated SQL injection in the FacturaScripts REST API filter parameter via parenthesis bypass in `Where::sqlColumn`","revision":2,"unknowns":["Customer inventory, deployment, reachability and exploitation have not been inspected."],"lifecycle":"active","identifiers":["GHSA-5qmh-x653-g8qj","CVE-2026-45262"],"plain_summary":"OSV carries this publisher advisory for facturascripts/facturascripts. This is an aggregated source copy; consult the original publisher and compare update dates.","review_status":"source_listed","control_topics":[],"public_actions":[{"summary":"The original advisory lists fixed boundaries 2026.2 for facturascripts/facturascripts. Confirm the publisher’s latest guidance.","source_ids":["sr-da058dc4135715ccf88cb61ba0be1506"],"action_type":"vendor_patch","limitations":"Confirm current vendor support, compatibility and deployment evidence. This report has not tested a fix in your system.","current_supported_target":null}],"schema_version":"1.1.0","source_metrics":[],"why_it_matters":"Published affected context helps an owner decide what evidence to gather. This report has not examined your application.","related_sources":[{"id":"sr-da058dc4135715ccf88cb61ba0be1506","url":"https://github.com/advisories/GHSA-5qmh-x653-g8qj","basis":"vendor_advisory","notes":"GitHub-origin advisory, CC-BY-4.0; OSV is an aggregate copy, not independent corroboration.","title":"GHSA-5qmh-x653-g8qj","publisher":"GitHub Advisory Database via OSV","observed_at":"2026-11-03T09:58:31.771Z"}],"affected_context":[{"certainty":"source_listed","source_ids":["sr-da058dc4135715ccf88cb61ba0be1506"],"technology":"facturascripts/facturascripts","known_exclusions":[],"conditions_summary":"## Summary\n\n> **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.\n\n`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()` ->","public_affected_ranges":["ECOSYSTEM: introduced 0; fixed 2026.2"]}],"null_published_at":"2026-11-04T02:53:08.397Z","source_updated_at":"2026-11-02T23:15:03.695Z","source_disclosed_at":"2026-07-14T17:11:06.000Z","is_synthetic_fixture":false,"null_last_reviewed_at":null,"public_change_summary":"Source facts changed; compare the preserved prior revision.","null_first_observed_at":"2026-10-31T21:41:59.926Z"},{"id":"NVI-00006410","kind":"vulnerability","title":"FacturaScripts: Authenticated SQL injection in the FacturaScripts REST API filter parameter via parenthesis bypass in `Where::sqlColumn`","revision":1,"unknowns":["Customer inventory, deployment, reachability and exploitation have not been inspected."],"lifecycle":"active","identifiers":["GHSA-5qmh-x653-g8qj","CVE-2026-45262"],"plain_summary":"OSV carries this publisher advisory for facturascripts/facturascripts. This is an aggregated source copy; consult the original publisher and compare update dates.","review_status":"source_listed","control_topics":[],"public_actions":[{"summary":"Identify the exact component and deployed version, examine the linked publisher’s conditions, and retain evidence of any mitigation.","source_ids":["sr-b3b31893c336cecbf27337e62c4098d7"],"action_type":"investigate","limitations":"Confirm current vendor support, compatibility and deployment evidence. This report has not tested a fix in your system.","current_supported_target":null}],"schema_version":"1.1.0","source_metrics":[],"why_it_matters":"Published affected context helps an owner decide what evidence to gather. This report has not examined your application.","related_sources":[{"id":"sr-b3b31893c336cecbf27337e62c4098d7","url":"https://github.com/advisories/GHSA-5qmh-x653-g8qj","basis":"vendor_advisory","notes":"GitHub-origin advisory, CC-BY-4.0; OSV is an aggregate copy, not independent corroboration.","title":"GHSA-5qmh-x653-g8qj","publisher":"GitHub Advisory Database via OSV","observed_at":"2026-10-31T21:41:59.926Z"}],"affected_context":[{"certainty":"source_listed","source_ids":["sr-b3b31893c336cecbf27337e62c4098d7"],"technology":"facturascripts/facturascripts","known_exclusions":[],"conditions_summary":"## Summary\n\n> **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.\n\n`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()` ->","public_affected_ranges":["ECOSYSTEM: introduced 0; last_affected 2026.1"]}],"null_published_at":"2026-10-31T22:13:10.055Z","source_updated_at":"2026-07-14T17:26:44.010Z","source_disclosed_at":"2026-07-14T17:11:06.000Z","is_synthetic_fixture":false,"null_last_reviewed_at":null,"public_change_summary":"First indexed by Null; source disclosure date is shown separately.","null_first_observed_at":"2026-10-31T21:41:59.926Z"}],"next_cursor":null,"snapshot_revision":"42594"}