Table des matières

HTTP - Cookies

Description

Cette vulnérabilité repose sur l'utilisation de cookies HTTP pour stocker des informations d'identification, d'état ou d'autres données critiques sur les systèmes clients. Il existe différentes formes d'exploitation de cette vulnérabilité.

Prérequis d'exploitation

Pour exploiter cette vulnérabilité, il est nécessaire d’avoir accès à une application se basant sur la gestion de cookies de session pour fonctionner. Ces derniers doivent être présents au niveau des requêtes HTTP entre le client et le serveur.

Connaissances nécessaires

Outils nécessaires

Flux d'exécution

Explorer

Naviguer sur l’application afin de générer un cookie. Il peut s'agir d'un utilisateur final légitime souhaitant élever ses privilèges ou d'une personne écoutant le réseau pour obtenir un cookie HTTP.

Expérimenter

Tenter d'obtenir des informations sensibles à partir du cookie en essayant de le décoder par diverses méthodes (selon son encodage). Essayer de modifier ou de remplacer les valeurs des attributs que contient le cookie afin de contourner les contrôles de sécurité de l'application.

Exploiter

Conséquences potentielles

Une exploitation réussie de ce type de vulnérabilité peut permettre :

Contres-mesures

Les contre-mesures suivantes peuvent être mises en œuvre :

Comment cela fonctionne

Le scénario suivant peut être joué via l’exploitation de cette vulnérabilité :

Exemple 1

Voici un exemple de requête HTTP simple avec un cookie contenant une donnée sensible :

GET /page.php HTTP/1.1
Host: www.example.com
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:80.0) Gecko/20100101 Firefox/80.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Connection: keep-alive
Cookie: sessionID=abc1234; username=john.doe; password=MySensitivePassword

Dans cette requête, nous envoyons un cookie nommé “password” qui contient une donnée sensible, en l'occurrence le mot de passe “MySensitivePassword”.

Il est important de noter que l'envoi de données sensibles (par exemple des mots de passe) dans des cookies est à proscrire car ils peuvent être facilement interceptés par de potentiels attaquants.

Exemple 2

L'extrait de code suivant récupère la valeur d'un cookie de navigateur pour déterminer le rôle du visiteur. Il est facile pour un attaquant de modifier la valeur “role” trouvée dans le cookie stocké localement, permettant ainsi une potentielle escalade des privilèges.

Cookie[] cookies = request.getCookies();
for (int i =0; i< cookies.length; i++) {
	Cookie c = cookies[i];
	if (c.getName().equals("role")) {
		userRole = c.getValue();
	}
}

Exemple 3

Dans l'exemple suivant, un cookie nommé “authenticated” est utilisé pour déterminer si un utilisateur doit être autorisé ou non à accéder à un système.

La modification de la valeur d'un cookie du côté client est triviale, mais de nombreux développeurs supposent que les cookies sont essentiellement immuables.

boolean authenticated = new Boolean(getCookieValue("authenticated")).booleanValue();
if (authenticated) {
	...
}

CWEs

References

URL :

Retour fiches vulnérabilités