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
- Kyk na die subskripsie planne!
- Sluit aan by die đŹ Discord groep of die telegram groep of volg ons op Twitter đŠ @hacktricks_live.
- Deel hacking truuks deur PRs in te dien na die HackTricks en HackTricks Cloud github repos.
Algemene argitektuur van ân Next.js-toepassing
Tipiese lĂȘerstruktuur
ân Standaard Next.js-projek volg ân spesifieke lĂȘer- en gidsstruktuur wat sy funksies soos routering, API-eindpunte en bestuur van statiese bates 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
Kerngidse en LĂȘers
- public/: Gasheer statiese bates soos beelde, lettertipes, en ander lĂȘers. LĂȘers hier is toeganklik by die wortelpad (
/). - app/: Sentrale gids vir jou aansoek se bladsye, layouts, komponente, en API-roetes. Omhels die App Router paradigma, wat gevorderde routerfunksies en skeiding tussen server- en kliëntkomponente moontlik maak.
- app/layout.tsx: Definieer die wortel layout vir jou toepassing, wat om alle bladsye vou en konsekwente UI-elemente soos headers, footers, en navigasiebalkies voorsien.
- app/page.tsx: Bedien as die ingangspunt vir die wortelroute
/, en render die tuisblad. - app/[route]/page.tsx: Hanteer statiese en dinamiese roetes. Elke gids binne
app/verteenwoordig ân route-segment, enpage.tsxbinne daardie gidse kom ooreen met die route se komponent. - app/api/: Bevat API-roetes, wat jou toelaat om serverless funksies te skep wat HTTP-versoeke hanteer. Hierdie roetes vervang die tradisionele
pages/apigids. - 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 styling.
- app/utils/: Sluit nuttige funksies, helper modules, en ander nie-UI logika in wat gedeel kan word oor die toepassing.
- .env.local: Stoor omgewingsveranderlikes spesifiek vir die plaaslike ontwikkelomgewing. Hierdie veranderlikes word nie in weergawebeheer gecommit nie.
- next.config.js: Pas Next.js-gedrag aan, insluitend webpack-konfigurasies, omgewingsveranderlikes, en sekuriteitsinstellings.
- tsconfig.json: Konfigureer TypeScript-instellings vir die projek, wat tipekontroles en ander TypeScript-funksies moontlik maak.
- package.json: Bestuur projekafhanklikhede, 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 konsekwente installasies oor verskillende omgewings verseker.
Kliëntkant in Next.js
LĂȘergebaseerde Routing in die app Directory
Die app gids is die hoeksteen van routing in die nuutste Next.js weergawes. Dit gebruik die lĂȘerstelsel om roetes te definieer, wat routebestuur intuĂŻtief en skaalbaar maak.
Hantering van die wortelpad /
File Structure:
my-nextjs-app/
âââ app/
â âââ layout.tsx
â âââ page.tsx
âââ public/
âââ next.config.js
âââ ...
Sleutel LĂȘers:
app/page.tsx: Hanteer versoeke na die wortelpad/.app/layout.tsx: Definieer die layout vir die toepassing en omsluit 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.tsxlĂȘer direk in dieappgids ooreen met die/roete. - Weergawering: Hierdie komponent gee die inhoud van die tuisblad weer.
- Layout-integrasie: Die
HomePagekomponent word deur dielayout.tsxomhul, wat kopstukke, voetskrifte 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.tsxlĂȘer in dieaboutgids kom ooreen met die/aboutroete. - Weergawing: Hierdie komponent gee die inhoud vir die about-bladsy weer.
Dinamiese Roetes
Dinamiese roetes maak dit moontlik om paaie met veranderlike segmente te hanteer, sodat toepassings inhoud kan wys gebaseer op parameters soos IDs, slugs, ens.
Voorbeeld: /posts/[id] Route
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:
- Dynamic Segment:
[id]dui ân dinamiese segment in die roete aan, wat dieidparameter van die URL vasvang. - Accessing Parameters: Die
paramsobject bevat die dinamiese parameters, toeganklik binne die komponent. - Route Matching: Enige pad wat by
/posts/*pas, soos/posts/1,/posts/abc, ens., sal deur hierdie komponent hanteer word.
Geneste Roetes
Next.js ondersteun geneste routering, wat hiërargiese roetestrukture moontlik maak wat die gidsstruktuur weerspieël.
Example: /dashboard/settings/profile Route
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:
- Diepe nesteling: Die
page.tsxlĂȘer binnedashboard/settings/profile/ooreenstem met die/dashboard/settings/profileroete. - WeerspieĂ«ling van hiĂ«rargie: Die gidsstruktuur weerspieĂ«l die URL-pad, wat die onderhoudbaarheid en duidelikheid verbeter.
Catch-all-roetes
Catch-all-roetes hanteer veelvuldige geneste segmente of onbekende paaie, wat buigsaamheid in roetehantering bied.
Voorbeeld: /* Roete
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 al die oorblywende padsegmenten as ân array. - Gebruik: Nuttig vir die hantering van dinamiese routing-scenarioâs soos gebruikersgegenereerde 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 fondament bied, kan onvanpaste koderingpraktyke kwesbaarhede inbring. Belangrike kliĂ«ntkant-kwesbaarhede sluit in:
Cross-Site Scripting (XSS)
XSS-aanvalle gebeur wanneer kwaadwillige scripts in vertroude webwerwe ingespuit word. Aanvallers kan scripts in gebruikers se blaaiers uitvoer, data steel of aksies namens die gebruiker uitvoer.
Voorbeeld van kwesbare kode:
// Dangerous: Injecting user input directly into HTML
function Comment({ userInput }) {
return <div dangerouslySetInnerHTML={{ __html: userInput }} />
}
Waarom dit kwesbaar is: Deur dangerouslySetInnerHTML met onbetroubare insette te gebruik, kan aanvallers kwaadwillige skripte inspuit.
Client-Side Template Injection
Dit gebeur wanneer gebruikersinsette verkeerd hanteer word in sjablone, wat aanvallers toelaat om sjablone of uitdrukkings in te spuit 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 in staat stel om client-side paths 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 client-side meganismes om legitieme 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 aflaaifunksie is aan die client side geĂŻmplementeer, waar gebruikers die lĂȘerpad kan spesifiseer om af te laai.
// 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
- Aanvaller se doelwit: Perform a CSRF attack to delete a critical file (e.g.,
admin/config.json) by manipulating thefilePath. - Uitbuiting van CSPT:
- Kwaadaardige invoer: Die aanvaller stel ân URL saam met ân gemanipuleerde
filePathsoos../deleteFile/config.json. - Resulterende API-oproep: Die client-side kode maak ân versoek na
/api/files/../deleteFile/config.json. - Bediener se hantering: Indien die bediener die
filePathnie valideer nie, verwerk dit die versoek en kan dit sensitiewe lĂȘers verwyder of openbaar maak.
- Uitvoering van CSRF:
- Gemaakte skakel: Die aanvaller stuur die slagoffer ân skakel of plaas ân kwaadaardige script wat die aflaaiversoek met die gemanipuleerde
filePathtrigger. - Uitkoms: Die slagoffer voer onbedoeld die aksie uit, wat tot ongemagtigde lĂȘertoegang of -verwydering lei.
Waarom dit kwesbaar is
- Gebrek aan invoervalidasie: Die client-side laat arbitrĂȘre
filePathinsette toe, wat path traversal moontlik maak. - Vertroue op kliëntinsette: Die server-side API vertrou en verwerk die
filePathsonder sanitisering. - Potensiële API-aksies: Indien die API-endpoint toestandveranderende aksies uitvoer (bv. delete, modify files), kan dit via CSPT uitgebuit word.
Bedienerkant in Next.js
Bedienerkant Rendering (SSR)
Bladsye word by elke versoek op die bediener gerender, wat verseker dat die gebruiker volledige gerenderde HTML ontvang. In hierdie geval behoort jy jou eie pasgemaakte server te skep om die versoeke te verwerk.
Use Cases:
- Dinamiese inhoud wat gereeld verander.
- SEO-optimering, aangesien soekenjins die volledig gerenderde bladsy kan deursoek.
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 Site Generering (SSG)
Bladsye word vooraf gerender tydens build-tyd, wat lei tot vinniger laaitye en verminderde bedienerbelasting.
Gebruikgevalle:
- 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
Serverlose Funksies (API Routes)
Next.js laat die skep van API-endpunte toe as serverlose funksies. Hierdie funksies hardloop op aanvraag sonder die behoefte aan ân toegewyde bediener.
Gebruikgevalle:
- Verwerking van vorminskrywings.
- Interaksie met databasisse.
- Verwerking van data of integrasie met derdeparty-APIs.
Implementering:
Met die bekendstelling van die app directory in Next.js 13 het routering en API-hantering meer buigsaam en kragtig geword. Hierdie moderne benadering stem nouver saam met die lĂȘer-gebaseerde routeringstelsel, maar bring verbeterde vermoĂ«ns in, insluitend ondersteuning vir server- en clientkomponente.
Basiese roete-hanteraar
LĂȘerstruktuur:
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 is geplaas onder die
app/api/directory. - LĂȘernaam: Elke API-endpoint lĂȘ in sy eie gids wat ân
route.jsofroute.tsfile bevat. - GeĂ«ksporteerde Funksies: In plaas van ân enkele default-export, word spesifieke HTTP-metode funksies (bv.
GET,POST) geëksporteer. - Response Hantering: Gebruik die
Responseconstructor om responses terug te gee, wat meer beheer oor headers en statuskodes toelaat.
Hoe om ander paaie en metodes te hanteer:
Hanering 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 Exporte: 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 ân presiese beheer van headers en statuskodes moontlik maak.
Catch-All en Geneste Roetes
Next.js 13+ ondersteun gevorderde routeringsfunksies soos catch-all roetes en geneste API-roetes, wat meer dinamiese en skaalbare API-strukture toelaat.
Catch-All Roete 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:
- Syntax:
[...]dui ân catch-all-segment aan en vang alle geneste paaie op. - Gebruik: Handig vir APIs wat wisselende roete-diepte of dinamiese segmente moet hanteer.
Geneste Roetes Voorbeeld:
// 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: Laat hiërargiese API-strukture toe wat verhoudings tussen hulpbronne weerspieël.
- Parametertoegang: Maklik toegang tot verskeie roete-parameters via die
params-objek.
Hantering van API-roetes in Next.js 12 en vroeër
API-roetes in die pages-gids (Next.js 12 en vroeër)
Voor Next.js 13 die app-gids en verbeterde routing-vaardighede bekendgestel het, is API-roetes hoofsaaklik binne die pages-gids gedefinieer. Hierdie benadering word steeds algemeen 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:
- Ligging: API-roetes is geleë onder die
pages/api/gids. - Uitvoer: Gebruik
export defaultom die handler-funksie te definieer. - Funksie-handtekening: Die handler ontvang
req(HTTP request) enres(HTTP response) objekte. - Roetering: Die lĂȘernaam (
hello.js) stem ooreen 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.idom die dinamiese parameter te kry. - Handling Methods: Gebruik voorwaardelike logika om verskillende HTTP-metodes (
GET,PUT,DELETE, etc.) te hanteer.
Hantering van verskillende HTTP-metodes
Alhoewel die basiese API-roetevoorbeeld alle HTTP-metodes binne ân enkele funksie hanteer, kan jy jou kode struktureer om elke metode eksplisiet 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: Skei die logika duidelik vir verskillende HTTP-metodes.
- Konsekwentheid van antwoorde: Verseker konsekwente antwoordstrukture om hantering aan kliëntkant te vergemaklik.
- Fouthantering: Hanteer nie-ondersteunde metodes en onvoorsiene foute op ân elegante wyse.
CORS-konfigurasie
Beheer watter oorspronge toegang tot jou API-roetes kan kry, en sodoende Cross-Origin Resource Sharing (CORS) kwesbaarhede verminder.
Slegte konfigurasie-voorbeeld:
// 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",
},
})
}
Let wel dat CORS ook in al die API routes binne die middleware.ts-lĂȘer geconfigureer kan word:
// 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 kan toelaat om sonder beperking met jou API te kommunikeer.- Breed toegelate metodes: Om alle metodes toe te laat kan aanvallers in staat stel om ongewenste aksies uit te voer.
Hoe aanvallers dit uitbuit:
Aanvallers kan kwaadwillige werwe skep wat versoeke aan jou API maak, moontlik funksionaliteite misbruik soos dataherwinning, datamanipulasie, of die ontketen van ongewenste aksies namens geauthentiseerde gebruikers.
CORS - Misconfigurations & Bypass
Server-kode blootstelling aan kliëntkant
Dit kan maklik gebeur dat kode wat deur die server gebruik word ook aan die kliĂ«ntkant blootgestel en gebruik word, die beste manier om te verseker dat ân kode-lĂȘer nooit aan die kliĂ«ntkant blootgestel word nie, is deur hierdie import aan die begin van die lĂȘer te gebruik:
import "server-only"
Sleutel-lĂȘers en hul rolle
middleware.ts / middleware.js
Ligging: Wortel van die projek of binne src/.
Doel: Voer kode uit in die server-side serverless-funksie voordat ân versoek verwerk word, wat take soos verifikasie, omleidings of die wysiging van antwoorde moontlik maak.
Uitvoeringsvloei:
- Inkomende versoek: Die middleware onderskep die versoek.
- Verwerking: Voer bedrywighede uit gebaseer op die versoek (bv. kontroleer of die gebruiker geverifieer is).
- Antwoordmodifikasie: Kan die antwoord verander of beheer aan die volgende handler deurgee.
Voorbeelde van gebruiksgevalle:
- Herlei ongeverifieerde gebruikers.
- Voeg aangepaste headers by.
- Log 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 Next.js-gedrag, skakel funksies aan of af, pas webpack-konfigurasies aan, stel omgewingsveranderlikes, en konfigureer verskeie sekuriteitskenmerke.
Belangrike Sekuriteitskonfigurasies:
Sekuriteitsheaders
Sekuriteitsheaders verbeter die sekuriteit van jou toepassing deur blaaiers te instrueer oor hoe om inhoud te hanteer. Hulle help om verskeie aanvalle soos Cross-Site Scripting (XSS), Clickjacking, en MIME type sniffing te mitiageer:
- 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 verkeerd gekonfigureerde instellings kan tot sekuriteitskwesbaarhede lei, byvoorbeeld deur onbetroubare bronne toe te laat om kwaadwillige inhoud in te spuit.
Slegte konfigurasievoorbeeld:
// next.config.js
module.exports = {
images: {
domains: ["*"], // Allows images from any domain
},
}
Probleem:
'*': Laat toe dat beelde van enige eksterne bron gelaai word, insluitend onbetroubare of kwaadwillige domeine. Aanvallers kan beelde host wat kwaadwillige payloads of inhoud bevat 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 vanaf kwaadwillige bronne in te sluit, kan aanvallers phishing-aanvalle uitvoer, misleidende inligting vertoon, of kwesbaarhede in beeld-rendering biblioteke uitbuit.
Blootstelling van Omgewingsveranderlikes
Bestuur sensitiewe inligting soos API keys en database credentials 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 dieNEXT_PUBLIC_voorvoegsel stel Next.js nie veranderlikes aan die kliënt bloot nie. As dit egter per ongeluk met die voorvoegsel geplaas word (bv.NEXT_PUBLIC_SECRET_API_KEY), word dit op die kliëntkant toeganklik.
Hoe aanvallers dit misbruik:
As sensitiewe veranderlikes aan die kliënt blootgestel word, kan aanvallers dit bekom deur die kliëntkantkode of netwerkaanvrae te inspekteer, en so ongemagtigde toegang tot APIs, databasisse of ander dienste verkry.
Omleidings
Bestuur URL-omleidings en herskrywings binne jou toepassing en verseker dat gebruikers na die korrekte plekke geleid word sonder om open redirect kwesbaarhede te skep.
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 URLâs wat deur gebruikers verskaf word sonder validatie, kan lei tot phishing, malware distribution, of credential theft.
Hoe aanvallers dit misbruik:
Aanvallers kan URLs saamstel wat skynbaar vanaf jou domein afkomstig lyk, 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
},
}
Problem:
- Blootstelling van Gevoelige Paaie: Om gevoelig directories te alias en kliënt-side toegang toe te laat kan leak vertroulike inligting.
- Bundeling van Sekrete: As gevoelig lĂȘers vir die kliĂ«nt saamgebundel word, word hul inhoud toeganklik deur source maps of deur ondersoek van die client-side code.
How attackers abuse it:
Aanvallers kan toegang kry tot of die toepassing se gidsstruktuur herbou, en moontlik gevoelige lĂȘers of data vind en misbruik.
pages/_app.js and pages/_document.js
pages/_app.js
Purpose: Oorskryf die standaard App-komponent, wat voorsiening maak vir globale state, style en layout-komponente.
Use Cases:
- Inspuiting van globale CSS.
- Byvoeging van layout-wrappers.
- Integrasie van toestandbestuursbiblioteke.
Example:
// 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.
Gebruiksscenarioâs:
- Aanpassing van die
<html>of<body>tags. - Byvoeging van meta tags of pasgemaakte scripts.
- Integrasie van lettertipes van derde partye.
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
Pasgemaakte Server (Opsioneel)
Doel: Alhoewel Next.js met ân ingeboude server kom, kan jy ân pasgemaakte server skep vir gevorderde gebruiksgevalle soos aangepaste routing of integrasie met bestaande backend-dienste.
Nota: Die gebruik van ân pasgemaakte server kan ontplooiingsopsies beperk, veral op platforms soos Vercel wat optimaliseer vir die ingeboude server van Next.js.
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: Hantering van sensitiewe inligting en konfigurasie-instellings buite die kodebasis.
Beste praktyke:
- Gebruik
.env-lĂȘers: Berg veranderlikes soos API-sleutels in.env.local(uitgesluit van weergawebeheer). - Kry toegang tot veranderlikes op ân veilige manier: Gebruik
process.env.VARIABLE_NAMEom omgewingsveranderlikes te kry. - Moet nooit geheime aan die kliënt blootstel nie: Verseker dat sensitiewe veranderlikes slegs aan die serverkant 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
},
}
Let wel: Om veranderlikes slegs op die server-kant te beperk, laat hulle uit die env-object weg of voorsien die voorvoegsel NEXT_PUBLIC_ vir kliëntblootstelling.
Verifikasie en magtiging
Benadering:
- Sessiegebaseerde verifikasie: Gebruik cookies om gebruikersessies te bestuur.
- Tokengebaseerde verifikasie: Implementeer JWTs vir staatlose verifikasie.
- Derdeparty-verskaffers: Integreer met OAuth-verskaffers (bv., Google, GitHub) deur biblioteke soos
next-authte gebruik.
Sekuriteitspraktyke:
- Veilige cookies: Stel die
HttpOnly,Secure, enSameSiteeienskappe. - Wagwoord-hashing: Hash altyd wagwoorde voordat jy dit stoor.
- Invoervalidasie: Voorkom injection attacks deur invoer te valideer en te ontsmet.
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ë:
- Image Optimization: Gebruik Next.js se
next/imagecomponent vir outomatiese beeldoptimalisering. - Code Splitting: Maak gebruik van dynamic imports om kode te verdeel en die aanvanklike laaitye te verminder.
- Caching: Implementeer cachingstrategieë vir API-antwoorde en statiese assets.
- Lazy Loading: 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 Enumeration (hash to function name via source maps)
Moderne Next.js gebruik âServer Actionsâ wat op die server uitgevoer word, maar vanaf die client aangeroep word. In produksie is hierdie aanroepe ondoorgrondelik: alle POSTs beland by ân algemene endpoint en word onderskei deur ân build-spesifieke hash wat in die Next-Action header gestuur word. Voorbeeld:
POST /
Next-Action: a9f8e2b4c7d1...
Wanneer productionBrowserSourceMaps geaktiveer is, bevat geminifiseerde JS-chunks oproepe na createServerReference(...) wat leak genoeg struktuur (plus geassosieerde source maps) om ân kartering tussen die action hash en die oorspronklike funksienaam te herstel. Dit laat jou toe om hashes wat in Next-Action waargeneem word te vertaal na konkrete teikens soos deleteUserAccount() of exportFinancialData().
Extraction approach (regex on minified JS + optional source maps)
Soek afgelaaide JS-chunks vir createServerReference en haal die hash en die funksie/bron-simbool uit. 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 chars)
- Groep 2: simbool of pad wat, wanneer ân source map teenwoordig is, na die oorspronklike funksienaam opgelos kan word
As die script ân source map adverteer (trailer-kommentaar //# sourceMappingURL=<...>.map), haal dit af en los die simbool/pad op na die oorspronklike funksienaam.
Praktiese werkvloei
- Passiewe ontdekking terwyl jy blaai: vang versoeke met
Next-Actionheaders en JS chunk URLs. - Haal die verwysde JS-bundels en die vergesellende
*.map-lĂȘers af (wanneer teenwoordig). - Voer die regex hierbo uit om ân hashâname-woordeboek op te bou.
- Gebruik die woordeboek om toetsing te teiken:
- Naam-gedrewe triage (bv.,
transferFunds,exportFinancialData). - Volg dekking oor builds deur funksienaam (hashes roteer oor builds).
- Naam-gedrewe triage (bv.,
Oefen van verborge aksies (sjabloon-gebaseerde aanvraag)
Neem ân geldige POST wat in-proxy waargeneem is as ân sjabloon en vervang die Next-Action-waarde om ân ander ontdekte aksie te teiken:
# Before
Next-Action: a9f8e2b4c7d1
# After
Next-Action: b7e3f9a2d8c5
Herhaal in Repeater en toets authorization, input validation en business logic van andersins onbereikbare actions.
Burp automatisering
- NextjsServerActionAnalyzer (Burp extension) automatiseer die bostaande in Burp:
- Gaan proxy history na vir JS chunks, onttrek
createServerReference(...)inskrywings, en ontleed source maps waar beskikbaar. - Onderhou ân deursoekbare hashâfunction-name woordeboek en verwyder duplikate oor builds volgens function name.
- Kan ân geldige template POST opspoor en ân gereed-om-te-stuur Repeater tab oopmaak met die teiken actionâs hash vervang.
- Repo: https://github.com/Adversis/NextjsServerActionAnalyzer
Aantekeninge en beperkings
- Vereis dat
productionBrowserSourceMapsin production geaktiveer is om name uit bundles/source maps te herstel. - Function-name disclosure is nie ân vulnerability op sigself nie; gebruik dit om discovery te rig en toets elke actionâs authorization.
References
- Pentesting Next.js Server Actions â A Burp Extension for Hash-to-Function Mapping
- NextjsServerActionAnalyzer (Burp extension)
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
- Kyk na die subskripsie planne!
- Sluit aan by die đŹ Discord groep of die telegram groep of volg ons op Twitter đŠ @hacktricks_live.
- Deel hacking truuks deur PRs in te dien na die HackTricks en HackTricks Cloud github repos.
HackTricks

