Empoisonnement du cache via un paramètre de requête non indexé
Web cache poisoning via an unkeyed query parameter
Ce laboratoire est vulnérable à une attaque de web cache poisoning car un paramètre de requête n’est pas inclus dans la clé de cache.
Un utilisateur visite régulièrement la page d’accueil du site en utilisant Chrome.
L’objectif est d’empoisonner le cache afin que la page d’accueil serve une réponse exécutant alert(1) dans le navigateur de la victime.
Analyse initiale
En interceptant la réponse de la page racine, on observe la présence d’un lien canonical.
Si l’on accède à l’URL avec un paramètre arbitraire, par exemple
/?hello, la valeur est bien reflétée dans la réponse

En injectant un payload comme :
le code HTML est interprété dans la réponse, mais aucune alerte ne s’exécute côté victime.

Problème identifié
Le cache considère chaque variation du paramètre ?test comme une nouvelle entrée.
Ainsi, à chaque changement de valeur, le cache est régénéré et l’empoisonnement ne persiste pas.
Cependant, certains paramètres sont totalement ignorés par la clé de cache :
Leur nom et leur valeur ne sont pas pris en compte.
La réponse mise en cache reste identique, même si leur valeur change.
Identification du paramètre non indexé

À l’aide de Param Miner (fonction Guess query parameters), on identifie le paramètre utm_content.

En testant différentes valeurs pour ce paramètre, on constate que le cache reste inchangé, confirmant qu’il n’est pas inclus dans la clé de cache.

Exploitation
On injecte alors le payload malveillant dans ce paramètre non indexé :
La réponse empoisonnée est stockée dans le cache et servie aux visiteurs suivants.

Mis à jour