Web Security Academy

SSRF - Lab : SSRF with whitelist-based input filter

Objectif :

  • Accéder à l'interface administrateur pour supprimer l'utilisateur dont le nom est Carlos.

  • Dans l'énoncé, il est précisé que cette interface est située dans même serveur que l'application.

Solution :

On lance le lab et on se retrouve dans un site de commerce :

On accède aux détails d'un produit et en bas de la page, on peut vérifier la quantité du stock restante dans certaines villes :

Quand on clique sur "Check stock", une requête POST est envoyée au serveur, avec comme donnée une URL vers une API :

La donnée est : stockApi=http://stock.weliketoshop.net:8080/product/stock/check?productId=1&storeId=1

On va modifier cette URL pour interroger directement le serveur lui-même : http://localhost/.

On envoie la requête et le serveur nous renvoie la réponse suivante :

Le site vers l'API doit être contenu dans l'URL. Il va falloir utiliser certains opérateurs pour contourner cette restriction.

On va d'abord essayer d'écrire le caractère "@", permettant de base d'inclure des identifiants, avec l'URL suivante : http://localhost@stock.weliketoshop.net:8080/product/stock/check?productId=3&storeId=1.On la soumet au serveur et il nous renvoie pas d'erreur.

On tente maintenant d'incorporer le caractère "#" pour forcer le serveur à seulement prendre en compte l'adresse IP "localhost" de la façon suivante : http://localhost#@stock.weliketoshop.net:8080/product/stock/check?productId=3&storeId=1. Le serveur bloque la requête.

On essaye d'encoder le caractère "#" en URL mais toujours pareil, ça ne passe pas.

On tente donc le double encodage et le serveur nous répond différemment :

La requête semble passer.

On écrit maintenant http://localhost%2523@stock.weliketoshop.net/admin et ça fonctionne ! le panel administrateur s'affiche :

On clique sur "Delete" pour supprimer l'utilisateur Carlos et on constate qu'une requête GET est envoyée au serveur :

Il suffit donc de soumettre au serveur l'URL suivante pour mener à bien la suppression : http://localhost%2523@stock.weliketoshop.net/admin/delete?username=carlos.

On revient sur l'interface administrateur pour voir si le compte de Carlos n'est plus présent :

Effectivement, il a été supprimé. le lab est désormais validé !