TL;DR
  • 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

Tipul vulnerabilității

SQL Injection — In-band, Error-based și Union-based. Parametrul date_from era concatenat direct în query fără parametrizare sau escape.

Cauza principală

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.

Impact demonstrat

Extragerea completă a tabelelor users, companies și financial_data — inclusiv parole hash, date fiscale și informații contractuale pentru toate companiile din platformă.

OWASP Top 10

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.