Sécurité Web : Guide OWASP
Sécurité Web : Guide OWASP
Vulnérabilité et
Sécurité des
Applications Web
Version 1
YACINE CHALLAL
20/09/2015
Table des matières
B. Submit.........................................................................................22
C. Livre d'Or......................................................................................23
3
Vulnérabilité et
I-
I
Sécurité des
Applications Web
OWASP : Open Web Application Security Project 5
1. A1 Injection
Définition
Une faille d'injection, telle l'injection SQL et OS, se produit quand une donnée non
fiable est envoyée à un interpréteur en tant qu'élément d'une commande ou d'une
requête.
Les données hostiles de l'attaquant peuvent duper l'interpréteur afin de l'amener à
exécuter des commandes fortuites ou accéder à des données non autorisées.
5
Vulnérabilité et Sécurité des Applications Web
Exemple
Une application utilise des données non fiables dans la construction de l'appel SQL
vulnérable suivant:
String query = "SELECT * FROM accounts WHERE custID='" +
request.getParameter("id") +"'";
l'attaquant modifie le paramètre ‘id' dans son navigateur et envoie: ' or '1'='1. Par
exemple:
http://example.com/app/accountView?id=' or '1'='1
Le sens de la requête est modifié pour retourner toutes les lignes de la table
accounts.
Les pires attaques peuvent altérer des données, voire invoquer des procédures
stockées.
Risque d'Injection
a) Contre-mesures
Conseil : Option 1 : Utilisation de Requêtes Paramétrées
Les requêtes paramétrées forcent le développeur à définir d'abord tout le code SQL,
et ensuite seulement passer chaque paramètre à la requête.
Ce style de codage permet aux SGBD de distinguer le code des données. Une
requête paramétrée garantie qu'un attaquant ne puisse pas changer l'intention
d'une requête, même s'il injecte des commandes SQL.
Par exemple, s'il soumet ‘ or ‘1'=‘1' comme valeur du ID, la requête cherchera dans
la base la valeur litérale du ID: ‘or 1=1'
Voici un exemple d'un code Java vulnérable car utilisant une requête dynamique
sans validation de paramètres :
6
Vulnérabilité et Sécurité des Applications Web
Code Java utilisant une procédure stockée pour se prémunir contre l'injection
Code Java sécurisé échappant les entrées utilisateurs, pour interroger Oracle
7
Vulnérabilité et Sécurité des Applications Web
8
Vulnérabilité et Sécurité des Applications Web
Définition : Authentification
L'authentification est le processus de vérification qu'un individu ou entité est ce qu'il
prétend être.
L'authentification est généralement réalisée en soumettant un identifiant et une ou
plusieurs informations privées que seul l'individu devrait connaître (mdp, biométrie,
puce, ...)
9
Vulnérabilité et Sécurité des Applications Web
Attention
Les fonctions applicatives relatives à l'authentification et la gestion de session ne
sont souvent pas mises en œuvreoeuvre correctement
Ceci permet aux attaquants de compromettre les mots de passe, clés, jetons de
session, ou d'exploiter d'autres failles d'implémentation pour s'approprier les
identités d'autres utilisateurs.
Exemple : Scénario 1
Une application expose les identifiants de session dans l'URL:
http://example.com/sale/saleitems;jsessionid= 2P0OC2JSNDLPSKHCJUN2JV?
dest=Hawaii
Un utilisateur authentifié sur le site envoie le lien à ses amis. En cliquant sur le lien,
ils utiliseront sa session et sa carte de crédit.
Exemple : Scénario 2
Les timeouts de l'application ne sont pas définies correctement. Un utilisateur
accède au site via un ordinateur public. Au lieu de faire "déconnexion", l'utilisateur
ferme le navigateur et s'en va. Un attaquant utilise le même navigateur une heure
plus tard, et ce navigateur est encore authentifié.
Exemple : Scénario 3
Un attaquant obtient un accès à la base des mots de passe du système. Les mots
de passe ne sont pas correctement chiffrés, exposant les mots de passe de tous les
utilisateurs à l'attaquant.
10
Vulnérabilité et Sécurité des Applications Web
11
Vulnérabilité et Sécurité des Applications Web
Exemple
Une application utilise une valeur non vérifiée dans une requête SQL
accédant à des informations d'un compte :
String query = "SELECT * FROM accts WHERE account = ?";
PreparedStatement pstmt = connection.prepareStatement(query , ... );
pstmt.setString( 1, request.getParameter("acct"));
ResultSet results = pstmt.executeQuery( );
L'attaquant modifie le paramètre « acct » dans son navigateur afin
d'envoyer le numéro de compte qu'il souhaite.
http://example.com/app/accountInfo?acct=notmyacct
Si le paramètre n'est pas correctement vérifié, l'attaquant peut accéder à
n'importe quel compte, au lieu d'être limité au sien.
12
Vulnérabilité et Sécurité des Applications Web
Conseil : Contre-mesures
Un processus de durcissement reproductible qui permet un déploiement
rapide et facile d'un nouvel environnement correctement verrouillé.
13
Vulnérabilité et Sécurité des Applications Web
Exemple
Un site public ne requiert pas SSL lors de la navigation dans la section authentifiée.
Un acteur malveillant se connecte à un réseau sans-fil en libre accès et collecte le
trafic d'un utilisateur.
Il récupère le jeton d'une session authentifiée et accède ainsi aux données et
privilèges de l'utilisateur dans l'application.
Conseil : Contre-mesures
Identifier les menaces contre lesquelles l'on souhaite se protéger (ex.:
menace interne, utilisateurs externes) et s'assurer que les données sensibles
sont chiffrées correctement lors de leur stockage et de leur transport..
Ne conserver que les données sensibles nécessaires. Les données que l'on
ne possède pas ne peuvent être volées!
Choisir des algorithmes éprouvés et générer des clés robustes.
- S'assurer qu'une gestion des clés est en place.
- Privilégier des modules cryptographiques certifiés.
Stocker les mots de passe au moyen d'un algorithme adapté à cet usage, tel
que bcrypt, PBKDF2, or scrypt.
14
Vulnérabilité et Sécurité des Applications Web
Exemple : Scenario 1
L'attaquant se contente de visiter les URLs ciblées. Les URLs suivantes nécessitent
d'être authentifié et les droits d'administration sont requis pour
“admin_getappInfo”:
http://exemple.com/app/getappInfo
http://exemple.com/app/admin_getappInfo
Une vulnérabilité existe si un utilisateur non authentifié peut accéder à une de ces
pages ou si un utilisateur authentifié mais non privilégié peut accéder à
“admin_getappInfo”.
Dans ce dernier cas, cela peut permettre à l'attaquant d'identifier d'autres
fonctionnalités d'administration non protégées.
Exemple : Scenario 2
Une page utilise un paramètre “action” pour spécifier la fonctionnalité à invoquer, et
les différentes actions requièrent des privilèges différents.
Une vulnérabilité existe si ces privilèges ne sont pas vérifiés.
15
Vulnérabilité et Sécurité des Applications Web
Conseil : Contre-mesures
Votre application devrait utiliser un module de gestion des autorisations consistant,
facilement analysable et appelé depuis les fonctionnalités métier
Exemple
Une application permet à un utilisateur de soumettre une requête de
transfert d'argent, qui ne requiert aucun secret:
http://example.com/app/transferFunds?amount=1500
&destinationAccount=4673243243
L'attaquant peut donc forger une requête pour transférer de l'argent du
compte de la victime sur son propre compte, et la cacher dans une balise
image, ou dans une balise iframe, stockée sur un site sous son contrôle :
<img src="http://example.com/app/transferFunds?
amount=1500&destinationAccount=attackersAcct#“ width="0"
height="0" />
Si la victime visite l'un des sites de l'attaquant, alors qu'elle est toujours
authentifiée sur le site example.com, son navigateur inclura les données de
session utilisateur dans la requête forgée et cette dernière aboutira.
16
Vulnérabilité et Sécurité des Applications Web
Conseil : Contre-mesures
Inclure un jeton unique dans un champ caché. Ce jeton, envoyé dans le
corps de la requête HTTP, et non inséré dans l'URL, sera ainsi
potentiellement moins exposé.
Le projet CSRF Guard de l'OWASP fournit des bibliothèques pour insérer de
tels jetons dans les applications Java EE, .NET, ou PHP. Et le projet ESAPI de
l'OWASP fournit des interfaces de programmation que les développeurs
peuvent utiliser pour empêcher les attaques CSRF.
Demander à l'utilisateur de se ré-authentifier ou, vérifier que la demande
n'est pas automatisée (par ex., avec un test CAPTCHA) peut aussi vous
protéger contre ces attaques.
17
Vulnérabilité et Sécurité des Applications Web
Exemple
Apache CXF Authentification Bypass – En ne fournissant pas de jeton
d'authentification, les attaquants pouvaient faire appel à n'importe quels web
services avec l'ensemble des privilèges.
Conseil : Contre-mesures
Identifier tous les composants et les versions utilisées, ainsi que les
dépendances
Surveiller les bases de données publiques, les listes de diffusion des projets
et les listes de diffusion de sécurité afin de s'assurer de la sécurité de ces
composants afin de les maintenir à jour.
Établir des politiques de sécurité pour l'utilisation des composants, telles que
la mise en place de pratiques de développement sécurisé, le passage avec
succès des recettes sécurité et l'utilisation de composants sous License.
Si possible, essayer d'ajouter des filtres de sécurités autour des composants
afin de désactiver des fonctionnalités et/ou des parties comprenant des
faiblesses ou des fonctions vulnérables.
18
Vulnérabilité et Sécurité des Applications Web
Exemple : Scénario #1
Une application possède une page “redirect.jsp” disposant d'un seul
paramètre nommé “url”.
Un attaquant forge une URL permettant de rediriger les utilisateurs vers un
site malveillant (tentative de phishing ou installation de malwares) :
http://www.example.com/redirect.jsp?url=evil.com
Exemple : Scénario #2
Une application effectue des renvois pour rediriger les utilisateurs sur
certaines pages internes.
Pour simplifier le renvoi, certaines pages utilisent un paramètre contenant la
page où doit être renvoyer l'utilisateur.
Dans ce cas, un attaquant crée une URL satisfaisant les contrôles d'accès de
l'application et le redirigeant ensuite vers une fonction d'administration à
laquelle il ne devrait pas avoir accès.
http://www.example.com/boring.jsp?fwd=admin.jsp
Conseil : Contre-mesures
Eviter l'utilisation des redirections et des renvois.
En cas d'utilisation, ne pas utiliser de valeur de destination dans les
paramètres utilisateur. Ceci est généralement réalisable.
Si une valeur de destination doit être spécifiée, vérifier que la valeur est
valide et autorisée pour l'utilisateur.
Il est recommandé de ne pas utiliser d'URL dans les paramètres, mais plutôt
une valeur abstraite qui sera traduite côté serveur par une URL cible.
19
Séries d'exercices
II -
II
IV : Vulnérabilités
et Sécurité du Web
(OWASP)
Vulnérabilité des scripts CGI 21
Submit 22
Livre d'Or 23
Simulation d'attaques et contre-mesures (DVWA) 25
21
Séries d'exercices IV : Vulnérabilités et Sécurité du Web (OWASP)
Voici enfin le programme CGI écrit en perl qui traite les données :
# !/usr/bin/perl
use CGI ;
my $d=new CGI ;
my $address=$q->param("mail") ;
open MAIL, "| /usr/lib/sendmail $address" ;
print MAIL "To : $address \n" ;
print MAIL "From : ATM and Co\n\n" ;
print MAIL "We have received your request, thank you very
much.\n" ;
print MAIL "You will recieve our documentation by mail
shortly.\n" ;
close(MAIL) ;
print "Content-type : text/html/\n\n"
print "<HTML>" ;
print "<BODY bgcolor=\"#FAF0E6\">" ;
print "<P align=\"center\"><A href=\"/index.html\">Back to
the summary</A></P>" ;
print "</BODY>" ;
print "</HTML>" ;
Question 1
Quel est l'objectif du programme CGI tel qu'il a été prévu par le concepteur du site
web ?
Question 2
Les possibilités d'action d'un pirate sont restreintes puisqu'il ne peut que remplir le
champ du formulaire. Intuitivement que peut-il tenter ?
Question 3
Comment peut-il se faire envoyer par courrier électronique le fichier des mots de
passe (/etc/passwd) du serveur HTTP ?
B. Submit
Soit un formulaire permettant la saisie d'un identifiant et qui lance l'exécution du
script php suivant quand l'utilisateur clique sur le bouton « submit » :
22
Séries d'exercices IV : Vulnérabilités et Sécurité du Web (OWASP)
Sublit
PHP Submit
Question 1
A quel type d'attaque est vulnérable ce code ?
Question 2
Donner un exemple d'attaque exploitant cette vulnérabilité
Question 3
Donner deux niveaux de protection qui permettent de se prémunir de ce type
d'attaque. Expliquer chacune de ces mesures.
C. Livre d'Or
Un livre d'or permet aux visiteurs d'un site web de poster des messages qui seront
stockés dans une base et réaffichés après chaque connexion sur le site.
23
Séries d'exercices IV : Vulnérabilités et Sécurité du Web (OWASP)
Livre d'or
Quand un utilisateur clique sur le bouton « Sign Guestbook » le code suivant est
exécuté.
Question 1
Expliquer le rôle de l'appel « mysql_real_escape_string($name) » et citer le type
d'attaque contrarié grâce à cet appel.
Question 2
A quel type d'attaque ce code est toujours vulnérable ? Expliquer.
Question 3
Donner un scénario d'attaque exploitant cette vulnérabilité.
Afin de palier cette vulnérabilité, le développeur du site corrige le code avec cette
nouvelle version :
24
Séries d'exercices IV : Vulnérabilités et Sécurité du Web (OWASP)
Question 4
Expliquer le rôle de la fonction « str_replace(‘<script>', ‘', $name) »
Question 5
Donner un exemple d'attaque sur ce code qui contourne ce contrôle.
Question 6
Donner une version du code qui permet d'éviter ce contournement (vous pouvez ne
pas réécrire tout le code)
Question 1
Lancez DVWA (http://127.0.0.1/dvwa/) et réalisez des exploits (attaques).
Pour mener l'attaque il est nécessaire d'analyser le code source des scripts
vulnérable afin de comprendre la source de la faille.
Expliquez pour chaque attaque réussie la source de vulnérabilité de l'application
Question 2
25
Séries d'exercices IV : Vulnérabilités et Sécurité du Web (OWASP)
Une fois l'exploit réalisé, comparer le code vulnérable aux versions améliorées pour
comprendre les contre mesures.
Expliquez ce qui a été amélioré et comment ça permet de se prémunir des
attaques.
Question 3
Vous pouvez basculer le niveau de sécurité de DVWA à "medium" et "high" et
essayer de mener l'attaque de nouveau et voir si ça marche toujours.
26