
Pacchetto di divulgazione CVE-2026-79752 per l'iniezione SQL in CakePHP 5.2.13 tramite FunctionsBuilder::cast, con uno script PoC in Python e un laboratorio Docker per la riproduzione autorizzata.
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · CVE-2026-79752
Write-up: https://abraxaslabs.tech/research/CVE-2026-79752
CakePHP 5.2.13 - cakephp
Sono @abraxas_null. Lab in loopback. Il client è CVE-2026-79752-Abraxas-Labs.py.
CAST AS letterale. FunctionsBuilder::cast (e extract / datePart / dateAdd) inseriscono dataType / part / unit forniti dal chiamante nell'SQL come struttura non sottoposta a escape. Lab GET /?type= in cast('body', $_GET['type']) su sqlite. Non è WordPress. Gemello di CVE-2026-77635 (jsonValue / Postgres). Corretto in 5.2.14, 5.3.7, 5.1.9, 4.6.5, 4.5.12.
| CVE | CVE-2026-79752 · CVE.org |
| CWE | CWE-89 |
| CVSS | Critico: 9.2 CVSS:4.0/AV:N/AC:L/AT:P/PR:N/UI:N/VC:H/VI:H/VA:H/SC:N/SI:N/SA:N |
| Prodotto | CakePHP |
| Affetto | 5.2.x fino alla 5.2.13 (anche 4.5.x < 4.5.12, 4.6.x < 4.6.5, 5.1.x < 5.1.9, 5.3.x < 5.3.7) |
| Corretto | 5.2.14, 5.3.7, 5.1.9, 4.6.5, 4.5.12 |
| Autenticazione | nessuna |
| Licenza | GNU Affero GPL v3.0 |
| Lab | solo 127.0.0.1 |
Un'applicazione che passa dati della richiesta in func()->cast(..., $type) (o negli altri tre metodi) consente al chiamante di chiudere il CAST e fare UNION di ciò che vuole. Il lab espone notes.body. Si tratta di SQL injection nel query builder di CakePHP, non nel jsonpath di Postgres.
Il GHSA indicava quattro metodi. Ho letto cast, poi ho creato un'app sqlite che vi passa i parametri GET.
La GET predefinita su / è CAST(body AS INTEGER) e [{"v":0}]. Questo è il prodotto che funziona. La GET di inject deve inserire un frammento in sql= e restituire POCWitness79752.
Vicoli ciechi: composer 500 perché l'immagine saltava composer install; estrarre il witness con grep dal codice sorgente PHP; sql= ancora solo CAST(body AS INTEGER) dopo la GET di inject.
Porta 8088. cakephp/database 5.2.13. App del lab in lab/lab-www. sqlite notes.body = POCWitness79752.
Bersaglio solo 127.0.0.1:8088 (o il loopback su cui l'hai associato).
cd lab
docker compose up --force-recreate
python3 ../CVE-2026-79752-Abraxas-Labs.py
Witness: POCWitness79752 nel corpo HTTP e sql= mostra il frammento iniettato, non solo CAST(body AS INTEGER).
Modi per perdere senza imparare nulla:
sql=Aggiorna CakePHP alla versione 5.2.14 (o 5.3.7 / 5.1.9 / 4.6.5 / 4.5.12). Riesegui CVE-2026-79752-Abraxas-Labs.py sulla build corretta: il frammento iniettato non deve comparire in sql=.
github.com/cakephp/cakephp/commit/3349584ca3a891afaff2dbc324d6b1c09fb880f0
github.com/cakephp/cakephp/commit/3f4d13ea4280067f3381ecf935a8bef5b7cdcc2e
github.com/cakephp/cakephp/commit/79e1d6bc6f3a50fa01805579076a02c77370c676
github.com/cakephp/cakephp/commit/8699d6f38e25fe46fcc24f2b698809948e71ad7d
github.com/cakephp/cakephp/commit/ab608711674ac662af7315c5cdf1e0fbe2000e45
github.com/cakephp/cakephp/security/advisories/GHSA-vjqc-q4mp-2rvf
github.com/CVEProject/cvelistV5/tree/main/cves/2026/79xxx/CVE-2026-79752.json
Abraxas Labs: abraxaslabs.tech · github.com/abraxas · @abraxas_null
GNU Affero GPL v3.0. Vedi LICENSE.
Il client comunica con il loopback. L'utilizzo contro sistemi di cui non si è proprietari non è autorizzato da Abraxas Labs. Nessuna garanzia.