找回密码
立即注册
搜索
热搜: Java Python Linux Go
发回帖 发新帖

1563

积分

0

好友

231

主题
发表于 6 天前 | 查看: 20| 回复: 0

本文将介绍一种安全且高可信的HTTP请求方法,用于精准检测Next.js应用中是否存在特定的远程代码执行(RCE)漏洞。

漏洞检测原理

以下HTTP请求可用于确认CVE-2025-55182与CVE-2025-66478漏洞是否存在:

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
Next-Router-State-Tree: %5B%22%22%2C%7B%22children%22%3A%5B%22__PAGE__%22%2C%7B%7D%2Cnull%2Cnull%5D%7D%2Cnull%2Cnull%2Ctrue%5D
Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryx8jO2oVc6SWP3Sad
X-Nextjs-Html-Request-Id: SSTMXm7OJ_g0Ncx6jpQt9
Content-Length: 232

------WebKitFormBoundaryx8jO2oVc6SWP3Sad
Content-Disposition: form-data; name="1"

{}
------WebKitFormBoundaryx8jO2oVc6SWP3Sad
Content-Disposition: form-data; name="0"

["$1:a:a"]
------WebKitFormBoundaryx8jO2oVc6SWP3Sad--

当向存在漏洞的Next.js版本发送上述请求时,其HTTP响应将类似如下:

HTTP/1.1 500 Internal Server Error
Date: Thu, 04 Dec 2025 06:16:39 GMT
Content-Type: text/x-component
Connection: keep-alive
Cache-Control: no-store, must-revalidate, no-cache, max-age=0
Vary: rsc
Content-Length: 76

0:{"a":"$@1","f":"","b":"yd-J8UfWl70zwtaAy83s7"}
1:E{"digest":"2971658870"}

通过检查响应是否包含E{"digest"的内容并且HTTP状态码为500,可以在目标环境中可靠地识别出存在漏洞的主机。

检测原理剖析

该检测方式能够区分易受攻击与已修复的主机,核心在于React Server依赖在处理对象属性引用路径时,使用冒号(:)作为分隔符。参考以下关键代码片段:

function getOutlinedModel<T>(
  response: Response,
  reference: string,
  parentObject: Object,
  key: string,
  map: (response: Response, model: any, parentObject: Object, key: string) => T,
): T {
  const path = reference.split(':');
  // ... snip ...
  for (let i = 1; i < path.length; i++) {
    value = value[path[i]];
  }

例如,如果在multipart请求中传入如下JSON:

------WebKitFormBoundaryx8jO2oVc6SWP3Sad
Content-Disposition: form-data; name="0"

["$1:a:b"]
------WebKitFormBoundaryx8jO2oVc6SWP3Sad
Content-Disposition: form-data; name="1"

{"a":{"b":"foo"}}
------WebKitFormBoundaryx8jO2oVc6SWP3Sad--

它会被转换为:"$1:a:b" -> {"a":{"b":"foo"}}.a.b -> "foo"

在存在漏洞的React Server版本中,通过发送特定的multipart请求可以强制触发一个500错误:

------WebKitFormBoundaryx8jO2oVc6SWP3Sad
Content-Disposition: form-data; name="0"

["$1:a:a"]
------WebKitFormBoundaryx8jO2oVc6SWP3Sad
Content-Disposition: form-data; name="1"

{}
------WebKitFormBoundaryx8jO2oVc6SWP3Sad--

异常抛出的原因是映射逻辑导致了未定义属性访问:"$1:a:a" -> {}.a.a -> (undefined).a -> 500

在已修复的React Server Components版本中,针对这种冒号语法新增了一层属性存在性校验,从而防止程序崩溃:

const name = path[i];
if (typeof value === 'object' && hasOwnProperty.call(value, name)) {
  value = value[name];
}

这意味着,如果:语法引用了一个不存在的属性,该引用会被安全地忽略。因此,在补丁修复后,将不再返回500错误。这对于构建在Node.js平台上的现代Web应用安全至关重要。

编写自动化漏洞扫描程序

基于以上原理,我们可以实现一个高精度的自动化扫描工具。该Python脚本支持批量检测、WAF绕过等功能,是进行网络安全评估的高效助手。

#!/usr/bin/env python3
# /// script
# requires-python = ">=3.9"
# dependencies = [
#     "requests>=2.28.0",
#     "tqdm>=4.64.0",
# ]
# ///

"""
React2Shell Scanner - High Fidelity Detection for RSC/Next.js RCE
CVE-2025-55182 & CVE-2025-66478
Based on research from Assetnote Security Research Team.
"""

import argparse
import sys
import json
import os
import random
import re
import string
from datetime import datetime, timezone
from concurrent.futures import ThreadPoolExecutor, as_completed
from urllib.parse import urlparse
from typing import Optional, Tuple

try:
    import requests
    from requests.exceptions import RequestException
except ImportError:
    print("Error: 'requests' library required. Install with: pip install requests")
    sys.exit(1)

try:
    from tqdm import tqdm
except ImportError:
    print("Error: 'tqdm' library required. Install with: pip install tqdm")
    sys.exit(1)

# ... (脚本主体代码较长,此处为节省篇幅保留核心函数定义和逻辑说明)
# 完整代码包含:颜色定义、Payload构建函数、请求发送函数、漏洞判断函数、多线程扫描逻辑等。

默认情况下,扫描程序会发送一个精心构造的multipart POST请求,其中包含一个RCE概念验证(PoC)Payload。该Payload会执行一个确定性的数学运算(41*271 = 11111)。如果目标主机存在漏洞,运算结果11111会出现在响应头X-Action-Redirect中,形式为/login?a=11111

工具使用详解

扫描程序默认测试根路径(/)。可以使用--path--path-file来测试自定义路径。如果目标在该路径下不存在漏洞,扫描器会跟随同一主机的重定向(例如/重定向到/en/)并测试重定向后的路径,但不会跟随跨域重定向。

关键参数说明:

  • --safe-check:使用安全的侧信道检测方法。该方法依赖返回500状态码并带有特定错误摘要的特征,而不会在目标上执行任何代码。适用于不希望触发实际RCE执行的评估场景。
  • --waf-bypass:在multipart请求体前部添加随机垃圾数据,有助于绕过仅分析请求体前半部分内容的WAF检测。默认大小为128KB,可通过--waf-bypass-size配置。启用后,请求超时时间会自动增加。
  • --vercel-waf-bypass:使用专门为绕过Vercel WAF防护而设计的替代Payload变体,采用不同的multipart结构。
  • --windows:将Payload从Unix shell(echo $((41*271)))切换为PowerShell(powershell -c "41*271"),以适配运行在Windows上的目标。
  • --threads:指定并发线程数,用于加速批量扫描。

常用命令示例:

  1. 扫描单个主机:

    python3 scanner.py -u https://example.com
  2. 扫描主机列表(使用20个线程):

    python3 scanner.py -l hosts.txt -t 20 -o results.json
  3. 使用安全检测模式:

    python3 scanner.py -u https://example.com --safe-check
  4. 扫描Windows目标并启用WAF绕过:

    python3 scanner.py -u https://example.com --windows --waf-bypass
  5. 测试自定义路径:

    python3 scanner.py -u https://example.com --path /_next --path /api
  6. 使用自定义请求头:

    python3 scanner.py -u https://example.com -H "Authorization: Bearer token" -H "Cookie: session=abc"

该工具提供了清晰的彩色输出和进度条,并支持将扫描结果保存为JSON格式,便于后续分析与报告生成。通过合理利用Python的并发库,可以高效完成大规模资产的漏洞普查工作。




上一篇:SQL Server性能调优实战:7大核心技巧与索引查询优化指南
下一篇:IntelliJ IDEA 2025.3 发布:版本统一详解,免费版功能增强与 Java 25 支持
您需要登录后才可以回帖 登录 | 立即注册

手机版|小黑屋|网站地图|云栈社区 ( 苏ICP备2022046150号-2 )

GMT+8, 2025-12-24 19:14 , Processed in 0.342047 second(s), 40 queries , Gzip On.

Powered by Discuz! X3.5

© 2025-2025 云栈社区.

快速回复 返回顶部 返回列表