348 lines
7.4 KiB
Markdown
348 lines
7.4 KiB
Markdown
<style>pre, table { font-size: 0.6em !important; }</style>
|
|
|
|
# Sécurité des applications Web
|
|
## William Petit - S.C.O.P. Cadoles
|
|
|
|
---
|
|
<!-- page_number: true -->
|
|
|
|
## La fondation OWASP
|
|
|
|
> Open Web Application Security Project
|
|
|
|
- Fondé en 2001
|
|
- Organisation internationale à but non lucratif
|
|
|
|
---
|
|
|
|
## Quelques projets en particulier
|
|
|
|
- [OWASP Top Ten](https://www.owasp.org/index.php/Category:OWASP_Top_Ten_Project) - Top 10 des failles impactant les applications Web
|
|
- [OWASP Code Review Guide](https://www.owasp.org/index.php/Category:OWASP_Code_Review_Project) - Guide de la revue de code appliquée à la sécurité
|
|
- [OWASP ASVS](https://www.owasp.org/index.php/Category:OWASP_Application_Security_Verification_Standard_Project) - Standard des vérifications de sécurité des applications Web
|
|
- [OWASP Webgoat](https://www.owasp.org/index.php/Category:OWASP_WebGoat_Project) - Application(s) volontairement faillible(s) illustrant les principales failles de sécurité actuelles.
|
|
|
|
---
|
|
|
|
## Les principales failles
|
|
|
|
---
|
|
|
|
## Epicfaild
|
|
|
|
https://forge.cadoles.com/wpetit/epicfaild
|
|
|
|
### Lancer avec Docker
|
|
```
|
|
docker run -it --rm -p 8888:8080 bornholm/epicfaild
|
|
|
|
# Puis ouvrir l'URL http://localhost:8888/
|
|
# dans votre navigateur
|
|
```
|
|
---
|
|
|
|
## OWASP WebGoat
|
|
|
|
https://github.com/WebGoat/WebGoat
|
|
|
|
### Lancer avec Docker
|
|
```
|
|
docker run -p 8080:8080 -it --rm webgoat/webgoat-8.0 /home/webgoat/start.sh
|
|
|
|
# Puis ouvrir l'URL http://localhost:8080/WebGoat/
|
|
# dans votre navigateur
|
|
```
|
|
---
|
|
|
|
## Injections SQL (SQLI)
|
|
|
|
### Pratique
|
|
|
|
> Epicfaild: Gate 3 et 4
|
|
> WebGoat: Injection Flaws (- XEE)
|
|
|
|
---
|
|
|
|
## Risques
|
|
|
|
- Vol de données
|
|
- Altération de données
|
|
- Prise de contrôle du serveur
|
|
|
|
---
|
|
|
|
## Mitigation
|
|
|
|
- Exécuter le moteur de base de données avec un utilisateur dédié.
|
|
- Valider TOUTES les entrées utilisateur.
|
|
- Utiliser des requêtes préparées.
|
|
- Installer un NIDS au niveau du serveur HTTP
|
|
|
|
---
|
|
|
|
## Contournement de la session
|
|
|
|
### Pratique
|
|
|
|
> Epicfaild: Gate 3
|
|
> WebGoat: Authentication Bypass
|
|
|
|
---
|
|
|
|
## Risques
|
|
|
|
- Vol de session
|
|
- Vol de données
|
|
- Prise de contrôle de l'application
|
|
|
|
---
|
|
|
|
## Mitigation
|
|
|
|
- Valider TOUTES les entrées utilisateurs
|
|
- Journaliser les origines des connexions
|
|
|
|
---
|
|
|
|
## Cross Site Scripting (XSS)
|
|
|
|
### Pratique
|
|
|
|
> Epicfaild: Gate 1
|
|
> WebGoat: Cross Site Scripting
|
|
|
|
---
|
|
|
|
## Risques
|
|
|
|
- Vol de sessions
|
|
- Hameçonnage
|
|
|
|
---
|
|
|
|
## Mitigation
|
|
|
|
- Valider TOUTES les entrées utilisateurs
|
|
- Assainir les données avant de faire leur rendu
|
|
|
|
---
|
|
|
|
## Mauvais contrôle des accès
|
|
|
|
### Pratique
|
|
|
|
> WebGoat: Access Control Flaws
|
|
|
|
---
|
|
|
|
## Risques
|
|
|
|
- Accès non autorisés à des fonctionnalités critiques
|
|
- Vol de données
|
|
- Prise de contrôle de l'application
|
|
|
|
---
|
|
|
|
## Mitigation
|
|
|
|
- Journaliser tous les accès à des ressources critiques (qui, quoi, quand, quel contexte ?)
|
|
- Utiliser une double authentification pour l'accès aux ressources critiques
|
|
|
|
> **Attention** L'obfuscation des accès n'est pas une méthode de sécurisation des points d'entrée.
|
|
|
|
---
|
|
|
|
## Fuite d'informations sensibles
|
|
|
|
### Pratique
|
|
|
|
```
|
|
Epicfaild: Gate 4/5
|
|
WebGoat: Insecure communication, Client Side/Client side filtering
|
|
```
|
|
|
|
---
|
|
|
|
## Risques
|
|
|
|
- Vol de données
|
|
|
|
---
|
|
|
|
## Mitigation
|
|
|
|
- Ne retourner à l'utilisateur que les données dont il a besoin (approche "frugale").
|
|
- Limiter la zone d'action de l'utilisateur à ses seuls besoins.
|
|
|
|
---
|
|
|
|
## Cross Site Request Forgery (CSRF)
|
|
|
|
### Pratique
|
|
|
|
> WebGoat: Request Forgeries
|
|
|
|
---
|
|
|
|
## Risques
|
|
|
|
- Hameçonnage
|
|
- Vol de session
|
|
- Vol d'identité
|
|
|
|
---
|
|
|
|
## Mitigation
|
|
|
|
- Utilisation de `nonce` (aussi appelé CSRF Token)
|
|
- Utilisation de requêtes `POST|PUT|DELETE` pour toutes les actions autres que la "consultation"
|
|
- S'assurer que les mécanismes de type "HTTP Method Override" ne sont pas activés en production ([Exemple pour Symfony3](http://symfony.com/doc/2.6/cookbook/routing/method_parameters.html#faking-the-method-with-method))
|
|
|
|
---
|
|
|
|
## Mauvaise politique de maintenance
|
|
|
|
### Pratique
|
|
|
|
> WebGoat: Vulnerable components
|
|
|
|
---
|
|
|
|
## Risques
|
|
|
|
Les risques dépendent du composant faillible...
|
|
|
|
---
|
|
|
|
## Mitigation
|
|
|
|
- Activer les mécanismes de mise à jour automatique
|
|
- Vérifier les mises à jour des librairies de manière automatisée.
|
|
- Suivre la publication des [CVE](https://cve.mitre.org/)/[NVD](https://nvd.nist.gov/)
|
|
|
|
---
|
|
|
|
## Métrologie applicative appliquée à la sécurité
|
|
|
|
### Méthodologie générale
|
|
### Modélisation de menace
|
|
### Identification des flux de données
|
|
### Les facteurs d'une bonne métrique
|
|
### Exemple d'outil: Prometheus
|
|
|
|
---
|
|
|
|
## Méthodologie générale
|
|
|
|
1. Définir le modèle de menace
|
|
2. Identifier et isoler les scénarios d'attaque pour les différentes menaces
|
|
3. Trouver les indicateurs "clés" pour ces scénarios i.e. identifier les métriques pertinentes pour la détection des comportements suspects
|
|
4. Mettre en place les sondes pour les métriques
|
|
5. Définir les seuils d'alerte et les réponses à apporter
|
|
|
|
---
|
|
|
|
## La modélisation de menace
|
|
|
|
- Identification des **dépendances externes**.
|
|
Exemple: _serveur GNU/Linux, base de données_
|
|
- Identification des **points d'entrées**
|
|
Exemple: _formulaire de contact, port de la base de données_
|
|
- Identification des **assets**
|
|
Exemple: _Comptes utilisateurs de l'application, données personnelles, droits d'accès_
|
|
- Identification des **niveaux de confiance**
|
|
Exemple: _Utilisateur anonyme, administrateur_
|
|
|
|
---
|
|
|
|
### Identification des flux de données
|
|
|
|
![center](./img/Data_flow2.jpg?)
|
|
|
|
---
|
|
|
|
## Les facteurs d'une bonne métrique
|
|
|
|
- **Concision** _Le domaine de mesure est il correctement défini ? La métrique n'essaye t-elle pas de mesurer trop de choses ?_
|
|
- **Fidélité** _La mesure est elle reproductible ? Mesure t-elle toujours la même chose ?_
|
|
- **Intégrité** _Le processus de mesure est il vulnérable à la falsification ?_
|
|
- **Utilité** _La métrique apporte elle une information utile au processus décisionnel ?_
|
|
|
|
---
|
|
|
|
## Exemple d'outil: Prometheus
|
|
|
|
---
|
|
|
|
## Configuration générale
|
|
|
|
---
|
|
|
|
## Instrumentation de l'application
|
|
|
|
### Modèle de données
|
|
### Les différents types de métriques
|
|
### Visualiser les métriques
|
|
### Effectuer des requêtes sur les métriques
|
|
|
|
---
|
|
|
|
## Modèle de données
|
|
|
|
Prometheus stocke des échantillons (mesures) sous la forme de **séries temporelles**. Il créait une nouvelle série pour chaque association **(nom_métrique, label1=value, label2=value, ...)**.
|
|
|
|
Chaque couple **(label, valeur)** est appelée **dimension** de la métrique.
|
|
|
|
|
|
**Représentation**
|
|
```
|
|
http_total_requests{ method="POST", path="/test" }
|
|
| name | labels |
|
|
```
|
|
|
|
|
|
|
|
---
|
|
|
|
## Les différents types de métriques (1)
|
|
|
|
### Compteur
|
|
|
|
Un compteur est une métrique dont la valeur ne peut faire qu'augmenter au cours du temps.
|
|
|
|
> **Exemple** Nombre total de connexions d'un compte sur un site
|
|
|
|
---
|
|
|
|
## Les différents types de métriques (2)
|
|
|
|
### Jauge
|
|
|
|
Une jauge est une métrique dont la valeur peut augmenter ou diminuer au cours du temps.
|
|
|
|
![center 50%](../img/jauge.jpg)
|
|
|
|
> **Exemple** La température d'une pièce
|
|
|
|
---
|
|
|
|
## Les différents types de métriques (3)
|
|
|
|
### Histogramme
|
|
|
|
Un histogramme est une métrique répartissant les données dans des "paquets" (ou "buckets" en anglais) configurables et comptant le nombre total et par "paquet" d'échantillons ainsi que leur somme.
|
|
|
|
![center 70%](../img/histogram.png)
|
|
|
|
> **Exemple** Le temps de réponse des requêtes HTTP
|
|
|
|
---
|
|
|
|
## Configuration de l'`alertmanager`
|
|
|
|
---
|
|
|
|
## Écriture de règles d'alertes
|
|
|
|
---
|