Team: XxxPassword123xxX

Difficulty: medium

Overview

Lorsque l’on entre un endpoint qui n’existe pas l’erreur 404 se déclenche et affiche notre endpoint.

Exploitation de SSTI

On tente l’injection du calcul 7*7 pour s’assurer que l’on se trouve sur une SSTI :

BlackList

Après plusieurs tests, on constate que l’application web blacklist un ensemble de termes et de caractères en renvoyant “that’s not a starter”. Voici une liste de caractères filtrés :

[
]
"
'
|
builtins
config

Construction de la payload

Il faut donc construire une payload :

  • sans accéder à un élément d’une liste ou attribut d’un dictionnaire avec des brackets
  • sans utiliser builtins et config directement dans le endpoint
  • sans utiliser de quotes

Quelques élements pour bypasser la blackliste :

  • utilisation de la fonction __getitem__() pour accéder à un attribut sans brackets
  • injection de paramètres GET dans le __getitem__() pour pouvoir appeler __builtins__ (à l’extérieur de la SSTI) via request.args.<param>
  • par la même occasion, l’injection de paramètre GET dans la SSTI nous permet de directement injecter des chaines de caractères sans utiliser de quotes

Payload type :

<HTTP_HOST>/{{self.__init__.__globals__.__getitem__(request.args.param).__getitem__(request.args.import)(request.args.os).popen(request.args.cmd).read()}}?param=__builtins__&import=__import__&os=os&cmd=<CMD>

Exploitation :

Test de la payload :

Après avoir listé les répertoires, on retrouve le flag à la racine :

Flag : PCTF(wHOS7H47PoKEmoN)