Writeup du challenge Web Hard du HTB University CTF 2024 — chaîne d’exploitation combinant mass assignment, prototype pollution et SSRF pour atteindre une RCE.
Contexte
Du 13 au 15 décembre, mon école a participé au HackTheBox University 2024 CTF. Ce writeup couvre la solution d’un des challenges web difficiles.
The Galactic Bounty Exchange — a system where hunters and hunted collide, controlled by the ruthless Frontier Board. Hidden within its encrypted core lies a prize of untold power: the bounty for the Starry Spur.

Reconnaissance
Le code source de l’application était fourni. Observations clés :
- Un fichier
botdans les sources indiquait une vulnérabilité côté client - Présence d’une application mail intégrée
- Backend implémenté en JavaScript
- L’inscription nécessitait un domaine d’email de la whitelist
Exploitation
1. Bypass de la restriction de domaine d’email
Le point d’entrée /register présentait deux vulnérabilités critiques :
Mass assignment — le paramètre role était directement assignable dans le payload :
{
"email": "asta@interstellar.htb",
"password": "asta",
"role": "admin"
}
Bypass de whitelist — fournir un tableau au lieu d’une chaîne contournait la restriction de domaine :
{
"email": ["babinks@interstellar.htb", "test@email.htb"]
}
2. Prototype Pollution
Un endpoint réservé aux admins /transmit utilisait la librairie Needle HTTP avec une option compressed. La librairie mergedeep dans l’endpoint editBountiesAPI était vulnérable à la prototype pollution.
En polluant le prototype :
{"__proto__": {"output": "/app/index.js"}}
Combiné avec l’option output de Needle, il était possible d’écraser des fichiers applicatifs et d’obtenir une RCE.
3. Chaîne d’exploitation complète

- S’inscrire avec le rôle admin via mass assignment
- Contourner la restriction de domaine avec la syntaxe tableau
- Vérifier le compte avec le code OTP reçu
- Effectuer la prototype pollution sur l’endpoint bounties
- Utiliser SSRF/Needle pour écraser
/app/index.js - Déclencher l’exécution via l’auto-reload
Flag : HTB{f1nd1ng_0d4y_15_345Y_r1gh7!!?_97c10223cada67794bcc9584b943c9e5}

L’équipe a terminé 2ème de la compétition.
← retour aux articles