Exécution de code à distance via pollution de prototype côté serveur

Remote code execution via server-side prototype pollution

Contexte du lab

  • Application basée sur Node.js et le framework Express.

  • Vulnérabilité : server-side prototype pollution car l’application fusionne de manière non sécurisée une entrée contrôlée par l’utilisateur dans un objet JavaScript côté serveur.

  • Objectif : polluer Object.prototype afin d’injecter des commandes système qui seront ensuite exécutées par le serveur, puis supprimer /home/carlos/morale.txt.

  • Connexion fournie : wiener:peter (dans ce lab, on a déjà des privilèges élevés et l’accès aux fonctionnalités admin).

Point d’entrée vulnérable : mise à jour d’adresse

On observe que la fonctionnalité update address accepte un JSON. On peut y inclure une pollution via constructor.prototype (preuve que la fusion est dangereuse) :

Fonctionnalité “gadget” : Maintenance jobs (admin)

En tant qu’admin, on voit un bouton Run maintenance jobs.

Quand on clique, l’application exécute des tâches (ex : cleanup) et affiche :

  • Database cleanup → succès

  • Filesystem cleanup → succès

Le client envoie un JSON similaire :

Et le serveur répond avec :

Observation clé : en arrière-plan, il semble qu’un process Node.js lance ces tâches via un mécanisme du type child_process.

Exploitation : injecter des arguments Node via execArgv

Dans Node.js, certaines exécutions peuvent passer des arguments au runtime via execArgv. Idée : polluer Object.prototype.execArgv pour injecter un --eval=... qui exécute une commande système via child_process.execSync.

Payload utilisé (test de callback vers Burp Collaborator via curl) :

Ensuite, on déclenche Run maintenance jobs pour forcer l’application à lancer le process qui réutilise execArgv.

On reçoit bien une requête sur le Collaborator → exécution confirmée.

Vérification du contexte : exfiltrer whoami

On peut exfiltrer le user via un sous-domaine dynamique :

Réception : carlos

Étape finale : suppression du fichier demandé

On envoie une pollution propre avec la commande de suppression :

Puis on relance Maintenance jobs pour déclencher l’exécution.

Résultat attendu : le fichier /home/carlos/morale.txt est supprimé et le lab est validé.

Mis à jour