- SQL Injection în modulul de raportare al unei aplicații web enterprise
- Permitea extragerea completă a bazei de date prin parametrul de filtrare a rapoartelor
- Vulnerabilitatea era prezentă în producție de peste 14 luni
- Identificată în ziua 1 a angajamentului, remediată în 24 de ore
Contextul angajamentului
O platformă de management pentru IMM-uri ne-a solicitat un penetration test grey-box cu accent pe modulul de raportare, recent extins cu funcționalități noi. Aplicația gestiona date financiare, contracte și informații despre angajați pentru câteva sute de companii client. Perimetrul: aplicația web principală și API-ul asociat.
Vulnerabilitatea identificată
CVSS 9.8 — CRITICĂÎn prima sesiune de testare, evaluând modulul de filtrare a rapoartelor, am observat că parametrul de filtrare după dată era inclus direct în query-ul SQL fără sanitizare. Un simplu test cu apostroful a returnat un mesaj de eroare SQL detaliat — confirmând imediat prezența vulnerabilității.
GET /reports/filter?date_from=2024-01-01'--&date_to=2024-12-31
# Răspuns: You have an error in your SQL syntax near ''--'
# Server: MySQL 8.0.32
Detalii tehnice
SQL Injection — In-band, Error-based și Union-based. Parametrul date_from era concatenat direct în query fără parametrizare sau escape.
Interogare SQL construită prin concatenare de string-uri: "SELECT * FROM reports WHERE date >= '" + date_from + "'". Codul era dintr-un modul mai vechi care nu fusese refactorizat când restul aplicației migrase la query-uri parametrizate.
Extragerea completă a tabelelor users, companies și financial_data — inclusiv parole hash, date fiscale și informații contractuale pentru toate companiile din platformă.
A03:2021 — Injection
Exploatare și demonstrare impact
După confirmarea inițială, am utilizat un atac UNION-based pentru a enumera structura bazei de date și a extrage date din tabelele sensibile. Întregul proces de identificare și demonstrare a impactului a durat mai puțin de două ore. Vulnerabilitatea nu necesita drepturi speciale — era exploatabilă de orice utilizator autentificat cu acces la modulul de raportare.
# Conceptual — enumerare tabel users prin UNION injection
date_from = "2024-01-01' UNION SELECT username,password_hash,email,NULL FROM users--"
# Rezultat: datele de autentificare ale tuturor utilizatorilor platformei
Am documentat extragerea a 3 rânduri din tabele diferite ca Proof of Concept, suficient pentru a demonstra impactul fără a extrage volume mari de date reale ale clienților.
Raportare și remediere
Vulnerabilitatea a fost raportată în aceeași zi cu recomandarea imediată de a dezactiva temporar modulul de raportare până la remediere, dat fiind riscul critic. Echipa de dezvoltare a înlocuit concatenarea de string-uri cu prepared statements parametrizate și a implementat o validare strictă a formatului de dată. Retestarea completă a confirmat remedierea.
Lecție de reținut
SQL Injection este o vulnerabilitate veche de peste două decenii, dar continuă să apară în aplicații moderne — de obicei în module mai vechi care nu au beneficiat de refactorizări recente sau în cod scris de dezvoltatori fără background de securitate. Folosirea exclusivă a query-urilor parametrizate sau ORM-urilor care abstractizează accesul la baza de date elimină complet această categorie de vulnerabilități. Code review-ul axat pe securitate și testele automate de SAST pot detecta acest pattern înainte de deployment.