[PatriotCTF2023 - Web] Pick Your Starter
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) viarequest.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)