SQL Injection en Pratique: Exploiter, Detecter et Mitiger dans un Lab Controle
Demo technique de SQLi avec sqlmap dans votre propre lab, axee sur la detection defensive et les correctifs parametres qui tiennent vraiment face au trafic de production.
SQL Injection a fete ses 27 ans en 2026 et reste dans le top 3 OWASP. Pas parce que les attaquants sont devenus plus malins, mais parce que les ORMs mal utilises, les requetes dynamiques dans les dashboards internes et les endpoints GraphQL avec resolvers naifs continuent de concatener des strings. Le lab monte ici part dune instance DVWA tournant sous Docker, dun MySQL 8.0 avec binlog active et dun proxy Burp Suite 2025.6 capturant chaque requete. Lobjectif nest pas dexhiber un dump de la table users: cest dentrainer loeil a reperer les signaux dinstrumentation defensive qui stoppent sqlmap avant le deuxieme payload. Si vous navez pas encore monte votre environnement isole, passez par Pentest Web depuis Zero: Construire un Lab Sur avec DVWA, Juice Shop et Burp Suite avant de continuer.
La premiere experience cible lendpoint vulnerable SQLi GET de DVWA en niveau low. On lance sqlmap -u 'http://lab.local/vulnerabilities/sqli/?id=1&Submit=Submit' --cookie='PHPSESSID=...; security=low' --batch --technique=BEUST --level=3 --risk=2. En 4 secondes sqlmap identifie une injection boolean-based blind sur le parametre id, en 11 secondes il enumere la base dvwa et ses 2 tables. Observez les payloads envoyes: 1 AND 4523=4523, 1 AND 1=2 UNION SELECT NULL,NULL. Ces litteraux numeriques repetitifs sont de lor pour les regles de detection WAF et SIEM. Notez le user-agent par defaut sqlmap/1.8.x et labsence de Accept-Encoding, parce quon va transformer ca en signal plus tard.
Avant de monter vers les techniques time-based, on ouvre un second onglet et on active le query logging MySQL avec SET GLOBAL general_log = 'ON'. Chaque payload sqlmap apparait dans /var/log/mysql/general.log avec un timestamp en microsecondes. En comparant 30 secondes de trafic legitime (genere par un locust simulant 50 utilisateurs) a 30 secondes de sqlmap, lentropie des requetes explose: le coefficient de variation de la longueur des requetes passe de 0.12 a 1.8. Ce seul delta nourrit deja une regle Sigma decente. Il se marie bien avec ce quon couvre dans Threat Hunting avec Sigma et Elastic: De l'Indicateur a la Regle de Detection pour le packager en detection reutilisable sur Elastic.
Vient maintenant la partie qui distingue le script kiddie du pentester: exploiter une SQLi second-order. On enregistre via le formulaire dinscription un nom dutilisateur egal a admin'-- avec les quotes echappees par le prepared statement de registration. Le probleme vit dans lendpoint de recherche interne qui reutilise cette valeur dans une requete dynamique sans la reparametrer. Resultat: bypass dauthentification sur une route qui napparaissait meme pas dans le scan initial de sqlmap, parce que le payload ne se declenche que dans un autre contexte. Ce pattern est le meme qui perfore souvent les APIs GraphQL avec resolvers partageant des builders, comme detaille dans Pentest APIs REST et GraphQL : Checklist Technique pour Bug Bounty Legal. sqlmap ne le detecte pas seul, et cest pour cela que la revue manuelle de code continue de payer en bug bounty.
La mitigation reelle commence par des prepared statements parametres, mais elle ne sarrete pas la. Dans notre lab Java/Spring on remplace la string interpolee par NamedParameterJdbcTemplate, on valide linput avec Bean Validation (jakarta.validation 3.1), et on ajoute une allowlist de colonnes autorisees pour ORDER BY (parce que PreparedStatement ne parametre pas les identifiants). En PHP, PDO avec PDO::ATTR_EMULATE_PREPARES=false est obligatoire sous MySQL pour eviter le classique bypass de quote multibyte. Couches suivantes: moindre privilege sur lutilisateur applicatif (GRANT SELECT, INSERT, UPDATE uniquement) plus un WAF comme ModSecurity avec CRS 4.4 en mode blocking pour les parametres numeriques. Le hardening serveur suit le meme principe couvert dans Hardening de Serveur Linux: CIS Benchmark Applique Sans Casser la Prod: reduire la surface avant de faire confiance a la detection.
Pour boucler la boucle defensive on branche general_log sur Filebeat, on lenvoie vers un Elastic 8.16 et on construit trois detections: pic derreurs de syntaxe SQL au-dessus de 5 par minute par IP, requetes contenant UNION SELECT NULL en sequence, et temps dexecution de requete superieur a 3 ecarts-types par rapport au baseline horaire. Lors des tests contre sqlmap avec --random-agent et --delay=2, les trois regles ont declenche en moins de 90 secondes. On a aussi pose des honeytokens: des colonnes factices comme credit_card_test avec des strings traceables. Le jour ou cette valeur apparait sur un paste site, on sait exactement quel endpoint a fuite. Cette boucle de feedback red et blue reflete ce quon defend dans Purple Team en Pratique: Construire une Boucle de Feedback Red vs Blue.
Takeaway pratique: montez le lab, lancez sqlmap une fois pour ressentir le rythme de ses payloads, puis passez 80 pour cent du temps restant a construire detection et correctifs. SQLi nest pas un probleme de creativite de lattaquant, cest une requete dynamique que personne na revue. Bloquez dans votre calendrier une revue trimestrielle de toutes les requetes qui acceptent de linput externe, parametrez tout ce qui est valeur et utilisez une allowlist pour tout ce qui est identifiant. Le jour ou vous pouvez prouver que votre application tue sqlmap en moins de 2 minutes avec blocage automatique, vous avez gagne.