NextJS

Tip

Leer en oefen AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Leer en oefen GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Leer en oefen Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Ondersteun HackTricks

Algemene argitektuur van ’n Next.js-toepassing

Tipiese lĂȘerstruktuur

’n Standaard Next.js-projek volg ’n spesifieke lĂȘer- en gidsstruktuur wat funksies soos routing, API-endpunte en bestuur van statiese hulpbronne vergemaklik. Hier is ’n tipiese uitleg:

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

Kern-lĂȘergidse en lĂȘers

  • public/: Huisves statiese hulpbronne soos beelde, lettertipes en ander lĂȘers. LĂȘers hier is toeganklik by die root-pad (/).
  • app/: Sentraal gids vir jou toepassing se bladsye, layouts, komponente en API routes. Omhels die App Router-paradigma, wat gevorderde routeringsfunksies en skeiding tussen server- en kliĂ«ntkomponente moontlik maak.
  • app/layout.tsx: Bepaal die root-layout vir jou toepassing, draai om alle bladsye en verskaf konsekwente UI-elemente soos headers, footers, en navigasiebalks.
  • app/page.tsx: Dien as die toegangspunt vir die root-roete /, en rendreer die tuisblad.
  • app/[route]/page.tsx: Hanteer statiese en dinamiese roetes. Elke gids binne app/ verteenwoordig ’n roete-segment, en page.tsx binne daardie vouers kom ooreen met die roete se komponent.
  • app/api/: Bevat API routes, wat jou toelaat om serverless funksies te skep wat HTTP-versoeke hanteer. Hierdie roetes vervang die tradisionele pages/api gids.
  • app/components/: Huisves herbruikbare React-komponente wat oor verskeie bladsye en layouts gebruik kan word.
  • app/styles/: Bevat globale CSS-lĂȘers en CSS Modules vir komponent-geskepte stylering.
  • app/utils/: Sluit nuttige funksies, helper-modules en ander nie-UI logika in wat gedeel kan word oor die toepassing.
  • .env.local: Stoor omgewingveranderlikes spesifiek vir die plaaslike ontwikkelingsomgewing. Hierdie veranderlikes word nie in weergawebeheer toegevoeg nie.
  • next.config.js: Pas Next.js-gedrag aan, insluitend webpack-konfigurasies, omgewingveranderlikes, en sekuriteitsinstellings.
  • tsconfig.json: Konfigureer TypeScript-instellings vir die projek, wat tipekontroles en ander TypeScript-funksies moontlik maak.
  • package.json: Beheer projek-afhanklikhede, skripte en metadata.
  • README.md: Verskaf dokumentasie en inligting oor die projek, insluitend opstelinstruksies, gebruiksriglyne en ander relevante besonderhede.
  • yarn.lock / package-lock.json: Sluit die projek se afhanklikhede vas op spesifieke weergawes, wat konsekente installasies oor verskillende omgewings verseker.

Kliënt-side in Next.js

LĂȘer-gebaseerde routering in die app gids

Die app gids is die hoeksteen van routering in die nuutste Next.js-weergawes. Dit maak gebruik van die lĂȘerstelsel om roetes te definieer, wat roete-bestuur intuĂŻtief en skaalbaar maak.

Hantering van die wortelpad /

File Structure:

my-nextjs-app/
├── app/
│   ├── layout.tsx
│   └── page.tsx
├── public/
├── next.config.js
└── ...

Belangrike LĂȘers:

  • app/page.tsx: Hanteer versoeke na die wortelpad /.
  • app/layout.tsx: Bepaal die uitleg vir die toepassing en omvou alle bladsye.

Implementering:

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>
);
}

Verduideliking:

  • Roete-definisie: Die page.tsx-lĂȘer direk onder die app-gids ooreenstem met die / roete.
  • Weergawing: Hierdie komponent toon die inhoud vir die tuisblad.
  • Layout-integrasie: Die HomePage-komponent word toegedraai deur die layout.tsx, wat headers, footers en ander algemene elemente kan insluit.
Hantering van Ander Statiese Paaie

Voorbeeld: /about-roete

LĂȘerstruktuur:

arduinoCopy codemy-nextjs-app/
├── app/
│   ├── about/
│   │   └── page.tsx
│   ├── layout.tsx
│   └── page.tsx
├── public/
├── next.config.js
└── ...

Implementering:

// app/about/page.tsx

export default function AboutPage() {
return (
<div>
<h1>About Us</h1>
<p>Learn more about our mission and values.</p>
</div>
)
}

Verduideliking:

  • Roete-definisie: Die page.tsx-lĂȘer binne die about-gids ooreenstem met die /about-route.
  • Weergawing: Hierdie komponent gee die inhoud vir die about-bladsy weer.
Dinamiese Roetes

Dinamiese roetes laat toe om paaie met veranderlike segmente te hanteer, wat dit vir toepassings moontlik maak om inhoud te wys gebaseer op parameters soos IDs, slugs, ens.

Voorbeeld: /posts/[id] Roete

LĂȘerstruktuur:

arduinoCopy codemy-nextjs-app/
├── app/
│   ├── posts/
│   │   └── [id]/
│   │       └── page.tsx
│   ├── layout.tsx
│   └── page.tsx
├── public/
├── next.config.js
└── ...

Implementering:

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>
);
}

Verduideliking:

  • Dinamiese segment: [id] dui ’n dinamiese segment in die roete aan, wat die id parameter uit die URL vaslĂȘ.
  • Toegang tot parameters: Die params object bevat die dinamiese parameters, toeganklik binne die komponent.
  • Roete-ooreenkoms: Enige pad wat ooreenstem met /posts/*, soos /posts/1, /posts/abc, ens., sal deur hierdie komponent hanteer word.
Geneste roetes

Next.js ondersteun geneste roetehantering, wat hiërargiese roetestrukture toelaat wat die gidsindeling weerspieël.

Voorbeeld: /dashboard/settings/profile roete

LĂȘerstruktuur:

arduinoCopy codemy-nextjs-app/
├── app/
│   ├── dashboard/
│   │   ├── settings/
│   │   │   └── profile/
│   │   │       └── page.tsx
│   │   └── page.tsx
│   ├── layout.tsx
│   └── page.tsx
├── public/
├── next.config.js
└── ...

Implementering:

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>
);
}

Verduideliking:

  • Diep geneste struktuur: Die page.tsx-lĂȘer binne dashboard/settings/profile/ ooreenstem met die /dashboard/settings/profile roete.
  • HiĂ«rargie-weerspieĂ«ling: Die gidsstruktuur weerspieĂ«l die URL-pad, wat onderhoudbaarheid en duidelikheid verbeter.
Catch-all-roetes

Catch-all-roetes hanteer verskeie geneste segmente of onbekende paaie, en bied buigbaarheid in roetehantering.

Voorbeeld: /* Route

LĂȘerstruktuur:

my-nextjs-app/
├── app/
│   ├── [...slug]/
│   │   └── page.tsx
│   ├── layout.tsx
│   └── page.tsx
├── public/
├── next.config.js
└── ...

Implementering:

// 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>
)
}

Verduideliking:

  • Catch-All-segment: [...slug] vang alle oorblywende padsegmente as ’n array op.
  • Gebruik: Nuttig vir die hantering van dinamiese routing-scenario’s soos deur gebruikers geskepde paaie, geneste kategorieĂ«, ens.
  • Roete-ooreenstemming: Paaie soos /anything/here, /foo/bar/baz, ens., word deur hierdie komponent hanteer.

Potensiële kliëntkant-kwesbaarhede

Alhoewel Next.js ’n veilige grondslag bied, kan onvanpaste koderingpraktyke kwesbaarhede invoer. Sleutel kliĂ«ntkant-kwesbaarhede sluit in:

Cross-Site Scripting (XSS)

XSS-aanvalle kom voor wanneer kwaadwillige skripte in vertroude webwerwe ingespuit word. Aanvallers kan skripte in gebruikers se blaaiers laat loop, data steel of handelinge namens die gebruiker uitvoer.

Voorbeeld van kwesbare kode:

// Dangerous: Injecting user input directly into HTML
function Comment({ userInput }) {
return <div dangerouslySetInnerHTML={{ __html: userInput }} />
}

Hoekom dit kwesbaar is: Die gebruik van dangerouslySetInnerHTML met onbetroubare insette laat aanvallers toe om kwaadwillige skripte in te voeg.

Client-Side Template Injection

Dit gebeur wanneer gebruikersinsette onbehoorlik hanteer word in sjablone, wat aanvallers toelaat om sjablone of uitdrukkings in te voeg en uit te voer.

Voorbeeld van kwesbare kode:

import React from "react"
import ejs from "ejs"

function RenderTemplate({ template, data }) {
const html = ejs.render(template, data)
return <div dangerouslySetInnerHTML={{ __html: html }} />
}

Waarom dit kwesbaar is: As template of data kwaadwillige inhoud bevat, kan dit lei tot die uitvoering van onbedoelde kode.

Client Path Traversal

Dit is ’n kwesbaarheid wat aanvallers toelaat om kliĂ«ntkant-paaie te manipuleer om onbedoelde aksies uit te voer, soos Cross-Site Request Forgery (CSRF). Anders as server-side path traversal, wat die bediener se lĂȘerstelsel teiken, fokus CSPT op die uitbuiting van kliĂ«ntkant-meganismes om wettige API-versoeke na kwaadwillige endpoints om te lei.

Voorbeeld van kwesbare kode:

’n Next.js-toepassing laat gebruikers toe om lĂȘers op te laai en af te laai. Die aflaai-funksie is aan die kliĂ«ntkant geĂŻmplementeer, waar gebruikers die lĂȘerpad wat afgelaai moet word, kan spesifiseer.

// 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>
)
}

Aanvalscenario

  1. Aanvaller se doelwit: Voer ’n CSRF-aanval uit om ’n kritiese lĂȘer te verwyder (bv. admin/config.json) deur die filePath te manipuleer.
  2. Uitbuiting van CSPT:
  • Kwaadaardige invoer: Die aanvaller vervaardig ’n URL met ’n gemanipuleerde filePath soos ../deleteFile/config.json.
  • Gevolg API-oproep: Die client-side kode maak ’n versoek na /api/files/../deleteFile/config.json.
  • Bediener se hantering: As die bediener nie die filePath valideer nie, verwerk dit die versoek en kan dit sensitiewe lĂȘers verwyder of blootstel.
  1. Uitvoering van CSRF:
  • Gemaakte skakel: Die aanvaller stuur die slagoffer ’n skakel of sluit ’n kwaadwillige skrip in wat die aflaaiversoek met die gemanipuleerde filePath aktiveer.
  • Uitkoms: Die slagoffer voer die aksie onbewustelik uit, wat lei tot ongemagtigde lĂȘertoegang of verwydering.

Waarom dit kwesbaar is

  • Gebrek aan invoervalidering: Die client-side laat arbitrĂȘre filePath insette toe, wat path traversal moontlik maak.
  • Vertrou op kliĂ«ntinsette: Die server-side API vertrou en verwerk die filePath sonder sanitization.
  • PotensiĂ«le API-aksies: As die API-endpoint state-changing aksies uitvoer (bv. delete, modify files), kan dit via CSPT uitgebuit word.

Server-Side in Next.js

Server-Side Rendering (SSR)

Bladsye word op die bediener by elke versoek gerender, wat verseker dat die gebruiker volledig gerenderde HTML ontvang. In hierdie geval moet jy jou eie custom server skep om die versoeke te verwerk.

Gebruikstoepassings:

  • Dynamiese inhoud wat gereeld verander.
  • SEO-optimalisering, aangesien soekenjins die volledig gerenderde bladsy kan kruip.

Implementering:

// 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

Statiese webwerf-generering (SSG)

Bladsye word vooraf-gerender tydens die build-tyd, wat lei tot vinniger laaitye en verminderde bedienerbelasting.

Gebruikstoepassings:

  • Inhoud wat nie gereeld verander nie.
  • Blogs, dokumentasie, bemarkingsbladsye.

Implementering:

// 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

Serverless Funksies (API Routes)

Next.js maak dit moontlik om API-endpunte as serverless-funksies te skep. Hierdie funksies loop op aanvraag sonder die behoefte aan ’n toegewyde server.

Gebruikgevalle:

  • Handel vorminskrywings af.
  • Interaksie met databases.
  • Verwerking van data of integrasie met derdeparty-APIs.

Implementering:

Met die bekendstelling van die app directory in Next.js 13 het routing en API-hantering meer buigsaam en kragtig geword. Hierdie moderne benadering pas nou binne die file-based routing-stelsel, maar bied uitgebreide vermoëns, insluitend ondersteuning vir server- en client-komponente.

Basiese Route Handler

File Structure:

my-nextjs-app/
├── app/
│   └── api/
│       └── hello/
│           └── route.js
├── package.json
└── ...

Implementering:

// 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))

Verduideliking:

  • Ligging: API routes word geplaas onder die app/api/ directory.
  • Bestandsbenaming: Elke API-endpoint woon in sy eie vouer wat ’n route.js of route.ts file bevat.
  • GeĂ«ksporteerde funksies: In plaas van ’n enkele default export, word spesifieke HTTP-metode funksies (bv. GET, POST) geĂ«ksporteer.
  • Responshantering: Gebruik die Response constructor om responses terug te stuur, wat meer beheer oor headers en statuskodes toelaat.

Hoe om ander paaie en metodes te hanteer:

Hantering van spesifieke HTTP-metodes

Next.js 13+ laat jou toe om handlers vir spesifieke HTTP-metodes binne dieselfde route.js of route.ts file te definieer, wat duideliker en meer georganiseerde kode bevorder.

Voorbeeld:

// 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" },
})
}

Verduideliking:

  • Meerdere Eksporte: Elke HTTP-metode (GET, PUT, DELETE) het sy eie geĂ«ksporteerde funksie.
  • Parameters: Die tweede argument gee toegang tot roeteparameters via params.
  • Verbeterde Antwoorde: Groter beheer oor response-objekte, wat presiese beheer van headers en statuskodes moontlik maak.
Catch-All en Geneste Routes

Next.js 13+ ondersteun gevorderde routeringsfunksies soos catch-all routes en geneste API-routes, wat meer dinamiese en skaalbare API-strukture moontlik maak.

Catch-All Route Voorbeeld:

// 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" },
})
}

Verduideliking:

  • Sintaksis: [...] dui ’n catch-all segment aan, wat alle geneste paaie vasvang.
  • Gebruik: Nuttig vir APIs wat wisselende roete-dieptes of dinamiese segmente moet hanteer.

Voorbeeld van geneste roetes:

// 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" },
}
)
}

Verduideliking:

  • Diepe nesteling: Maak hiĂ«rargiese API-strukture moontlik, wat hulpbronverhoudings weerspieĂ«l.
  • Parametertoegang: Maak dit maklik om verskeie roeteparameters via die params-objek te kry.
Hantering van API-roetes in Next.js 12 en vroeër

API-roetes in die pages Directory (Next.js 12 en vroeër)

Voordat Next.js 13 die app-gids en verbeterde routingvermoëns bekendgestel het, is API-roetes hoofsaaklik binne die pages-gids gedefinieer. Hierdie benadering word steeds wyd gebruik en ondersteun in Next.js 12 en vroeër weergawes.

Basiese API-roete

LĂȘerstruktuur:

goCopy codemy-nextjs-app/
├── pages/
│   └── api/
│       └── hello.js
├── package.json
└── ...

Implementering:

javascriptCopy code// pages/api/hello.js

export default function handler(req, res) {
res.status(200).json({ message: 'Hello, World!' });
}

Verduideliking:

  • Location: API routes is geleĂ« onder die pages/api/ gids.
  • Export: Gebruik export default om die handler-funksie te definieer.
  • Function Signature: Die handler ontvang req (HTTP-versoek) en res (HTTP-antwoord) objekte.
  • Routing: Die lĂȘernaam (hello.js) ooreenstem met die endpoint /api/hello.

Dinamiese API-roetes

LĂȘerstruktuur:

bashCopy codemy-nextjs-app/
├── pages/
│   └── api/
│       └── users/
│           └── [id].js
├── package.json
└── ...

Implementering:

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`);
}
}

Verduideliking:

  • Dynamic Segments: Vierkantige hakies ([id].js) dui dinamiese roete-segmente aan.
  • Accessing Parameters: Gebruik req.query.id om by die dinamiese parameter te kom.
  • Handling Methods: Gebruik voorwaardelike logika om verskillende HTTP-metodes (GET, PUT, DELETE, ens.) te hanteer.

Hantering van verskillende HTTP-metodes

Alhoewel die basiese API-roete-voorbeeld alle HTTP-metodes binne ’n enkele funksie hanteer, kan jy jou kode struktureer om elke metode uitdruklik te hanteer vir beter duidelikheid en onderhoudbaarheid.

Voorbeeld:

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 praktyke:

  • Skeiding van verantwoordelikhede: Skeid logika duidelik vir verskillende HTTP-metodes.
  • Responskonsekwentheid: Verseker konsekwente responsstrukture om die hantering aan die kliĂ«ntkant te vergemaklik.
  • Fouthantering: Hanteer nie-ondersteunde metodes en onverwagte foute op ’n elegante wyse.

CORS Konfigurasie

Beheer watter oorspronge toegang tot jou API-roetes kan kry, en verminder Cross-Origin Resource Sharing (CORS)-kwesbaarhede.

Slegte Konfigurasievoorbeeld:

// 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",
},
})
}

Neem kennis dat CORS ook in al die API-roetes gekonfigureer kan word binne die middleware.ts lĂȘer:

// 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
}

Probleem:

  • Access-Control-Allow-Origin: '*': Laat enige webwerf toe om toegang tot die API te kry, wat moontlik kwaadwillige werwe toelaat om sonder beperkings met jou API te kommunikeer.
  • BreĂ« metode-toestemming: Die toelaat van alle metodes kan attackers in staat stel om ongewenste aksies uit te voer.

Hoe attackers dit uitbuit:

Attackers kan kwaadwillige webwerwe skep wat versoeke na jou API stuur, moontlik funksionaliteit misbruik soos data retrieval, data manipulation, of die ontlokking van ongewenste aksies namens authenticated users.

CORS - Misconfigurations & Bypass

Bedienerkode blootstelling aan die kliëntkant

Dit kan maklik gebeur dat kode wat deur die server gebruik word ook in kode blootgestel en deur die kliĂ«ntkant gebruik word; die beste manier om te verseker dat ’n kodelĂȘer nooit aan die kliĂ«ntkant blootgestel word nie, is om hierdie import aan die begin van die lĂȘer te gebruik:

import "server-only"

SleutellĂȘers en hul Rolle

middleware.ts / middleware.js

Location: Root van die projek of binne src/.

Doel: Voer kode uit in die server-side serverless function voordat ’n request verwerk word, wat take soos authentication, redirects, of die wysiging van responses moontlik maak.

Uitvoeringsvloei:

  1. Incoming Request: Die middleware onderskep die request.
  2. Processing: Voer operasies uit gebaseer op die request (bv. check authentication).
  3. Response Modification: Kan die response verander of beheer oordra na die volgende handler.

Voorbeelde van gebruik:

  • Herlei nie-geverifieerde gebruikers.
  • Voeg aangepaste headers by.
  • Registreer versoeke.

Voorbeeldkonfigurasie:

// 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*"],
}

next.config.js

Ligging: Wortel van die projek.

Doel: Konfigureer die gedrag van Next.js, skakel funksies aan of af, pas webpack-konfigurasies aan, stel omgewing-variabeles in, en konfigureer verskeie sekuriteitsfunksies.

Belangrike sekuriteitskonfigurasies:

Sekuriteitsheaders

Sekuriteitsheaders verbeter die veiligheid van jou toepassing deur blaaiers aan te dui hoe om inhoud te hanteer. Dit help om verskeie aanvalle soos Cross-Site Scripting (XSS), Clickjacking, en MIME type sniffing te verminder:

  • Content Security Policy (CSP)
  • X-Frame-Options
  • X-Content-Type-Options
  • Strict-Transport-Security (HSTS)
  • Referrer Policy

Voorbeelde:

// 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...
],
},
]
},
}
Beeldoptimaliseringsinstellings

Next.js optimaliseer beelde vir prestasie, maar wankonfigurasies kan tot sekuriteitskwesbaarhede lei, soos om te laat dat onbetroubare bronne kwaadwillige inhoud inspuit.

Slegte Konfigurasie Voorbeeld:

// next.config.js

module.exports = {
images: {
domains: ["*"], // Allows images from any domain
},
}

Probleem:

  • '*': Laat toe dat beelde vanaf enige eksterne bron gelaai word, insluitend onbetroubare of skadelike domeine. Aanvallers kan beelde aanbied wat skadelike payloads bevat of inhoud wat gebruikers mislei.
  • Nog ’n probleem kan wees om ’n domein toe te laat waar enigiemand ’n beeld kan oplaai (soos raw.githubusercontent.com)

Hoe aanvallers dit misbruik:

Deur beelde van skadelike bronne in te voeg, kan aanvallers phishing-aanvalle uitvoer, misleidende inligting vertoon, of kwesbaarhede in image rendering libraries uitbuit.

Blootstelling van omgewingsveranderlikes

Hanteer sensitiewe inligting soos API-sleutels en databasis-aanmeldbewyse veilig sonder om dit aan die kliënt bloot te stel.

a. Blootstelling van sensitiewe veranderlikes

Slegte konfigurasie-voorbeeld:

// 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
},
}

Probleem:

  • SECRET_API_KEY: Sonder die NEXT_PUBLIC_ voorvoegsel maak Next.js nie veranderlikes aan die kliĂ«nt bloot nie. As dit egter per ongeluk voorafgegaan word (bv. NEXT_PUBLIC_SECRET_API_KEY), word dit aan die kliĂ«ntkant toeganklik.

Hoe aanvallers dit misbruik:

As sensitiewe veranderlikes aan die kliënt blootgestel word, kan aanvallers dit kry deur die kliëntkantkode of netwerkversoeke te inspekteer, en sodoende ongemagtigde toegang tot APIs, databasisse of ander dienste verkry.

Redirects

Bestuur URL-omleidings en herskrywings binne jou toepassing, en verseker dat gebruikers toepaslik herlei word sonder om open redirect vulnerabilities in te lei.

a. Open Redirect Vulnerability

Slegte Konfigurasie Voorbeeld:

// next.config.js

module.exports = {
async redirects() {
return [
{
source: "/redirect",
destination: (req) => req.query.url, // Dynamically redirects based on query parameter
permanent: false,
},
]
},
}

Probleem:

  • Dinamiese Bestemming: Laat gebruikers toe om enige URL te spesifiseer, wat open redirect attacks moontlik maak.
  • Vertrou Gebruikersinvoer: Omleidings na deur gebruikers verskafde URLs sonder validering kan lei tot phishing, malware distribution, of credential theft.

Hoe aanvallers dit misbruik:

Aanvallers kan URL’s saamstel wat blyk vanaf jou domein te kom, maar gebruikers na kwaadaardige werwe herlei. Byvoorbeeld:

https://yourdomain.com/redirect?url=https://malicious-site.com

Gebruikers wat die oorspronklike domein vertrou, kan onbewustelik na skadelike webwerwe navigeer.

Webpack Configuration

Pas Webpack-konfigurasies aan vir jou Next.js-toepassing, wat onbedoeld sekuriteitskwesbaarhede kan inbring as dit nie versigtig hanteer word nie.

a. Blootstelling van sensitiewe modules

Slegte konfigurasievoorbeeld:

// next.config.js

module.exports = {
webpack: (config, { isServer }) => {
if (!isServer) {
config.resolve.alias["@sensitive"] = path.join(__dirname, "secret-folder")
}
return config
},
}

Probleem:

  • Blootstelling van sensitiewe paaie: Aliasing van sensitiewe gidse en die toelaat van client-side toegang kan leak gevoelige inligting.
  • Bundeling van geheime: As sensitiewe lĂȘers vir die client gebundel word, raak hul inhoud toeganklik via source maps of deur die client-side kode te inspekteer.

Hoe aanvallers dit misbruik:

Aanvallers kan toegang kry tot of die aansoek se gidsstruktuur herbou, en moontlik sensitiewe lĂȘers of data vind en misbruik.

pages/_app.js en pages/_document.js

pages/_app.js

Doel: Oorskryf die standaard App-komponent, wat globale state, style en layout-komponente moontlik maak.

Gebruiksscenario’s:

  • Invoeging van globale CSS.
  • Toevoeging van layout-wrappers.
  • Integrasie van state-management biblioteke.

Voorbeeld:

// pages/_app.js
import "../styles/globals.css"

function MyApp({ Component, pageProps }) {
return <Component {...pageProps} />
}

export default MyApp

pages/_document.js

Doel: Oorskryf die standaard Document, wat aanpassing van die HTML- en Body-tags moontlik maak.

Gebruikstoepassings:

  • Wysig die <html> of <body>-tags.
  • Voeg meta-tags of pasgemaakte scripts by.
  • Integrasie van derdeparty-lettertipes.

Voorbeeld:

// 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

Aangepaste bediener (Opsioneel)

Doel: Terwyl Next.js met ’n ingeboude bediener kom, kan jy ’n aangepaste bediener skep vir gevorderde gebruiksgevalle soos aangepaste routering of integrasie met bestaande backend-dienste.

Nota: Die gebruik van ’n aangepaste bediener kan ontplooiingsopsies beperk, veral op platforms soos Vercel wat geoptimaliseer is vir Next.js se ingeboude bediener.

Voorbeeld:

// 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")
})
})

Bykomende Argitektoniese en Sekuriteits-oorwegings

Omgewingsveranderlikes en Konfigurasie

Doel: Bestuur sensitiewe inligting en konfigurasie-instellings buite die kodebasis.

Beste praktyke:

  • Gebruik .env-lĂȘers: BĂȘre veranderlikes soos API-sleutels in .env.local (uitgesluit van weergawebeheer).
  • Toegang tot veranderlikes veilig: Gebruik process.env.VARIABLE_NAME om omgewingsveranderlikes te kry.
  • Maak geheime nooit aan die kliĂ«nt sigbaar nie: Verseker dat sensitiewe veranderlikes slegs aan die bedienerkant gebruik word.

Voorbeeld:

// 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
},
}

Nota: Om veranderlikes slegs op die server te beperk, laat hulle uit die env-objek weg of voorsien hulle van die voorvoegsel NEXT_PUBLIC_ vir kliënt-eksposisie.

Verifikasie en autorisering

Benadering:

  • Sessiegebaseerde verifikasie: Gebruik cookies om gebruiker-sessies te bestuur.
  • Token-gebaseerde verifikasie: Implementeer JWTs vir staatlose verifikasie.
  • Derdeparty-verskaffers: Integreer met OAuth-verskaffers (bv. Google, GitHub) deur biblioteke soos next-auth te gebruik.

Sekuriteitspraktyke:

  • Secure Cookies: Stel HttpOnly, Secure, en SameSite eienskappe.
  • Wagwoord-hashing: Hash wagwoorde altyd voordat jy dit stoor.
  • Invoer-validering: Voorkom injection-aanvalle deur invoer te valideer en te sanitiseer.

Voorbeeld:

// 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" })
}
}

Prestasie-optimalisering

Strategieë:

  • Beeldoptimalisering: Gebruik Next.js se next/image component vir outomatiese beeldoptimalisering.
  • Kode-splitsing: Gebruik dinamiese imports om kode te verdeel en aanvanklike laaitye te verminder.
  • Caching: Implementeer caching-strategieĂ« vir API-responsies en statiese assets.
  • Lui-lading: Laai komponente of assets slegs wanneer dit nodig is.

Voorbeeld:

// Dynamic Import with Code Splitting
import dynamic from "next/dynamic"

const HeavyComponent = dynamic(() => import("../components/HeavyComponent"), {
loading: () => <p>Loading...</p>,
})

Next.js Server Actions Enumerasie (hash to function name via source maps)

Moderne Next.js gebruik “Server Actions” wat op die bediener uitgevoer word maar vanaf die kliĂ«nt aangeroep word. In produksie is hierdie aanroepe ondoorgrondelik: alle POSTs land op ’n gemeenskaplike endpoint en word van mekaar onderskei deur ’n build-spesifieke hash wat in die Next-Action header gestuur word. Voorbeeld:

POST /
Next-Action: a9f8e2b4c7d1...

Wanneer productionBrowserSourceMaps geaktiveer is, bevat minified JS-chunks oproepe na createServerReference(...) wat genoeg struktuur leak (plus geassosieerde source maps) om ’n mapping tussen die action hash en die oorspronklike funksienaam te herwin. Dit laat jou toe om hashes wat in Next-Action waargeneem word na konkrete teikens soos deleteUserAccount() of exportFinancialData() te vertaal.

Onttrekkingsbenadering (regex op minified JS + opsionele source maps)

Soek in afgelaaide JS-chunks na createServerReference en onttrek die hash en die function/source symbol. Twee nuttige patrone:

# 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*\)
  • Groep 1: server action hash (40+ hex karakters)
  • Groep 2: simbool of pad wat na die oorspronklike funksie opgelos kan word via die source map wanneer teenwoordig

As die script ’n source map adverteer (trailer comment //# sourceMappingURL=<...>.map), haal dit op en los die simbool/pad na die oorspronklike funksienaam op.

Praktiese werkvloei

  • Passiewe ontdekking terwyl jy blaai: vang versoeke met Next-Action headers en JS chunk URLs.
  • Haal die verwysde JS-bundels en die vergeselnde *.map-lĂȘers op (wanneer teenwoordig).
  • Voer die regex hierbo uit om ’n hash↔naam woordeboek op te bou.
  • Gebruik die woordeboek om teikengerigte toetsing:
    • Naamgedrewe triage (bv., transferFunds, exportFinancialData).
    • Volg dekking oor builds volgens funksienaam (hashes roteer tussen builds).

Uitoefen van verborge actions (sjabloon-gebaseerde versoek)

Neem ’n geldige POST wat in die proxy waargeneem is as ’n sjabloon en verwissel die Next-Action-waarde om ’n ander ontdekte action te teiken:

# Before
Next-Action: a9f8e2b4c7d1

# After
Next-Action: b7e3f9a2d8c5

Speel dit in Repeater af en toets autorisasie, invoervalidatie en sakelogika van andersins onbereikbare aksies.

Burp automation

  • NextjsServerActionAnalyzer (Burp-uitbreiding) automatiseer die bogenoemde in Burp:
  • Blaai deur proxy history vir JS chunks, haal createServerReference(...) inskrywings uit, en parse source maps wanneer beskikbaar.
  • Onderhou ’n deursoekbare hash↔function-name woordeboek en verwyder duplikate oor builds op grond van function name.
  • Kan ’n geldige template POST lokaliseer en ’n gereed-om-te-stuur Repeater-oortjie oopmaak met die teiken-aksie se hash ingegooi.
  • Repo: https://github.com/Adversis/NextjsServerActionAnalyzer

Notes and limitations

  • Vereis productionBrowserSourceMaps aangeskakel in production om name uit bundles/source maps te herstel.
  • Function-name disclosure is nie op sigself ’n kwetsbaarheid nie; gebruik dit om ontdekking te lei en toets die autorisasie van elke aksie.

React Server Components Flight protocol deserialization RCE (CVE-2025-55182)

Next.js App Router deployments that expose Server Actions on react-server-dom-webpack 19.0.0–19.2.0 (Next.js 15.x/16.x) contain a critical server-side prototype pollution during Flight chunk deserialisasie. Deur $ verwysings binne ’n Flight payload te konstrueer, kan ’n aanvaller van besoedelde prototypes draai na arbitrĂȘre JavaScript-uitvoering en dan na OS-opdraguitvoering binne die Node.js-proses.

NodeJS - proto & prototype Pollution

Aanvalsketting in Flight chunks

  1. Prototype pollution primitive: Stel "then": "$1:__proto__:then" sodat die resolver ’n then-funksie op Object.prototype skryf. Enige gewone objek wat daarna verwerk word, word ’n thenable, wat die aanvaller toelaat om asinchrone beheervloei binne RSC-internes te beïnvloed.
  2. Rebinding to the global Function constructor: Wys _response._formData.get na "$1:constructor:constructor". Tydens resolusie word object.constructor → Object, en Object.constructor → Function, so toekomstige oproepe na _formData.get() eintlik Function(...) uitvoer.
  3. Code execution via _prefix: Plaas JavaScript-bron in _response._prefix. Wanneer die besoedelde _formData.get aangeroep word, evalueer die raamwerk Function(_prefix)(...), sodat die ingespuitde JS require('child_process').exec() of enige ander Node-primitive kan aanroep.

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" }
}
}

Verwysings

Tip

Leer en oefen AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Leer en oefen GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Leer en oefen Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Ondersteun HackTricks