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.
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--trie les résultats selon la première colonne.
Pas d'Erreur : La colonne spécifiée existe. Continuez avec des valeurs croissantes.
Erreur : La colonne spécifiée n'existe pas. Le nombre de colonnes de la requête d'origine est inférieur à cette valeur.
Teste avec des valeurs 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 :
Oracle :
PostgreSQL :
Liste des Colonnes
MySQL, PostgreSQL :
Oracle :
Extraire nom BDD, tables et colonnes
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 :
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 :
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 :
Avec concaténation (voir cheat sheet pour syntaxe) :
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 :
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 :
Observation : on observe la table
users_lugkan.
Lister les Colonnes de la table :
Observation : Vous trouverez les colonnes de la table, comme
usernameetpassword.
Extraire les Données :
Utilisez la requête suivante pour extraire les données des colonnes :
Observation : On obtient le contenues dans les colonnes
usernameetpasswordde la tableusers_lugkan.
Last updated
