当前位置: 首页 > news >正文

Fastjson 反序列化漏洞实战排查:3 种检测方法与 2 种应急缓解脚本

Fastjson 反序列化漏洞实战排查:3 种检测方法与 2 种应急缓解脚本

当安全团队收到 Fastjson 漏洞预警时,时间就是防御的生命线。本文将从实战角度出发,提供一套完整的应急响应流程,帮助安全运维工程师和开发负责人快速定位受影响系统并实施临时防护措施。我们将重点介绍三种高效的检测方法和两种无需立即升级的应急缓解方案,确保在修复窗口期内有效降低风险。

1. 漏洞影响评估与快速定位

Fastjson 反序列化漏洞的本质在于攻击者通过精心构造的 JSON 数据,利用@type参数指定恶意类,触发 JNDI 注入或远程代码执行。根据历史漏洞分析,受影响版本主要集中在 1.2.80 及以下版本,但不同版本存在不同的绕过方式。

1.1 受影响组件识别

系统级检测(Linux 环境)

# 查找正在运行的Java进程使用的fastjson版本 lsof | grep fastjson | grep -E '\.jar' | awk '{print $9}' | xargs -I {} sh -c 'echo -n "{}: "; unzip -p {} META-INF/MANIFEST.MF | grep Implementation-Version || echo "无法确定版本"' # 查找项目依赖中的fastjson find /path/to/project -name "*.jar" -exec sh -c 'unzip -p {} META-INF/MANIFEST.MF | grep -q "fastjson" && echo "发现fastjson: {}"' \;

依赖分析(Maven 项目)

mvn dependency:tree -Dincludes=com.alibaba:fastjson

版本风险矩阵

版本范围已知漏洞数量最高风险等级
≤1.2.245+严重
1.2.25-1.2.473高危
1.2.48-1.2.682高危
1.2.69-1.2.801高危
≥1.2.830

1.2 流量特征检测

攻击流量通常具有以下特征:

  • Content-Type: application/json
  • POST 请求体包含@type参数
  • 可能包含JdbcRowSetImplTemplatesImpl等关键词

实时流量监控脚本(Python)

import pyshark def detect_fastjson_attack(pkt): if hasattr(pkt, 'http') and pkt.http.content_type == 'application/json': payload = pkt.http.file_data.lower() if b'@type' in payload and (b'jndi:' in payload or b'jdbcrowsetimpl' in payload): print(f"[!] 疑似Fastjson攻击: {pkt.ip.src} -> {pkt.ip.dst}") print(f" 路径: {pkt.http.request_uri}") print(f" 载荷片段: {payload[:200]}...") capture = pyshark.LiveCapture(interface='eth0', display_filter='http') capture.apply_on_packets(detect_fastjson_attack)

2. 三种高效检测方法

2.1 进程级检测(lsof 方案)

增强版检测脚本

#!/bin/bash # fastjson_detect_lsof.sh HIGH_RISK_VERSIONS=("1.2.24" "1.2.47" "1.2.68" "1.2.80") echo "[*] 扫描Java进程使用的fastjson版本..." lsof -nP -i4TCP | grep -E 'java|jdk|jre' | awk '{print $2}' | sort -u | while read pid; do jars=$(lsof -p $pid | grep -E '\.jar$' | awk '{print $9}') for jar in $jars; do if [[ $jar == *fastjson* ]]; then version=$(unzip -p $jar META-INF/MANIFEST.MF 2>/dev/null | grep 'Bundle-Version\|Implementation-Version' | awk '{print $2}' | tr -d '\r') if [[ -z "$version" ]]; then version=$(basename $jar | grep -oP '\d+\.\d+\.\d+') fi if [[ -n "$version" ]]; then risk="低风险" for v in "${HIGH_RISK_VERSIONS[@]}"; do if [[ "$version" == "$v" || "$(printf '%s\n' "$v" "$version" | sort -V | head -n1)" == "$version" ]]; then risk="高风险" break fi done echo "[!] 进程ID: $pid, 路径: $jar, 版本: ${version:-未知}, 风险等级: $risk" echo " 关联服务: $(ps -p $pid -o command=)" fi fi done done

2.2 依赖树分析(全量扫描)

Maven 项目深度扫描

#!/bin/bash # fastjson_detect_maven.sh echo "[*] 扫描Maven项目中的fastjson依赖..." find / -name "pom.xml" 2>/dev/null | while read pom; do project_dir=$(dirname "$pom") echo "[+] 检查项目: $project_dir" # 检查直接依赖 if grep -q '<artifactId>fastjson</artifactId>' "$pom"; then version=$(grep -A1 '<artifactId>fastjson</artifactId>' "$pom" | grep '<version>' | sed -E 's/.*<version>(.*)<\/version>.*/\1/') echo "[!] 发现直接依赖: fastjson $version" fi # 完整依赖树分析 if [ -f "$project_dir/mvnw" ]; then mvn_cmd="./mvnw" else mvn_cmd="mvn" fi cd "$project_dir" && $mvn_cmd dependency:tree -Dincludes=com.alibaba:fastjson 2>/dev/null | grep 'fastjson' cd - >/dev/null done

2.3 字节码特征检测

对于无法直接获取版本号的情况,可以通过类文件特征检测:

# fastjson_bytecode_check.py import os import zipfile import re FASTJSON_CLASSES = { 'com/alibaba/fastjson/JSON.class': { '1.2.24': b'\xca\xfe\xba\xbe\x00\x00\x00\x33', '1.2.47': b'\xca\xfe\xba\xbe\x00\x00\x00\x34', '1.2.68': b'\xca\xfe\xba\xbe\x00\x00\x00\x35' } } def scan_jar_files(path): for root, _, files in os.walk(path): for file in files: if file.endswith('.jar'): jar_path = os.path.join(root, file) try: with zipfile.ZipFile(jar_path) as z: for class_file in FASTJSON_CLASSES: if class_file in z.namelist(): with z.open(class_file) as f: magic = f.read(8) for ver, sig in FASTJSON_CLASSES[class_file].items(): if magic.startswith(sig): print(f"[+] 发现 {jar_path}: fastjson {ver}") except: continue scan_jar_files('/path/to/scan')

3. 两种应急缓解方案

当无法立即升级时,可采用以下临时防护措施:

3.1 JVM 参数强制 SafeMode

实施步骤

  1. 定位所有Java应用的启动脚本(如 catalina.sh、startup.sh 等)
  2. 添加JVM参数:
    JAVA_OPTS="$JAVA_OPTS -Dfastjson.parser.safeMode=true"
  3. 批量修改脚本示例:
    find / -name "*.sh" -exec grep -l "java.*jar" {} \; | while read script; do if ! grep -q "fastjson.parser.safeMode" "$script"; then sed -i '/java.*jar/ s/^/JAVA_OPTS="$JAVA_OPTS -Dfastjson.parser.safeMode=true"\n/' "$script" echo "[+] 已修改: $script" fi done

验证方法

// SafeMode验证测试类 public class FastjsonSafeModeCheck { public static void main(String[] args) { try { String json = "{\"@type\":\"com.sun.rowset.JdbcRowSetImpl\",\"dataSourceName\":\"ldap://malicious\",\"autoCommit\":true}"; Object obj = com.alibaba.fastjson.JSON.parse(json); System.err.println("[!] SafeMode未生效,仍可解析恶意JSON"); } catch (Exception e) { System.out.println("[+] SafeMode已生效,拦截恶意请求: " + e.getMessage()); } } }

3.2 代码级 Hook 防护

对于无法修改JVM参数的环境,可通过Java Agent实现运行时防护:

// FastjsonProtectAgent.java import java.lang.instrument.Instrumentation; import java.security.ProtectionDomain; public class FastjsonProtectAgent { public static void premain(String args, Instrumentation inst) { inst.addTransformer((loader, className, classBeingRedefined, protectionDomain, classfileBuffer) -> { if ("com/alibaba/fastjson/parser/ParserConfig".replace('.', '/').equals(className)) { System.out.println("[+] 拦截ParserConfig类加载"); String safeModeCode = "package com.alibaba.fastjson.parser;\n" + "public class ParserConfig {\n" + " public static boolean isSafeMode() { return true; }\n" + " // 其他原有方法...\n" + "}"; return safeModeCode.getBytes(); } return null; }); } }

部署方法

  1. 编译Agent并打包为JAR
  2. 在所有Java应用启动参数中添加:
    -javaagent:/path/to/FastjsonProtectAgent.jar

4. 漏洞修复与长期防护

4.1 升级路径选择

当前版本推荐升级路径注意事项
≤1.2.24直接升级到1.2.83或v2需要全面测试业务兼容性
1.2.25-47先升级到1.2.68开启安全模式,再升级到1.2.83注意中间版本的autoType变更
1.2.48-80直接升级到1.2.83检查是否有自定义白名单配置

4.2 安全配置检查表

  1. 版本验证

    find / -name "fastjson-*.jar" -exec sh -c 'echo -n "{}: "; unzip -p {} META-INF/MANIFEST.MF | grep -E "Bundle-Version|Implementation-Version"' \;
  2. 安全模式验证

    // 创建安全检查脚本SecurityCheck.java public class SecurityCheck { public static void main(String[] args) { System.out.println("Fastjson安全模式状态: " + com.alibaba.fastjson.parser.ParserConfig.getGlobalInstance().isSafeMode()); } }
  3. 网络防护策略

    • 出口防火墙禁止非常规端口(如LDAP默认389/636、RMI默认1099)
    • 入口WAF添加规则拦截包含@typeJdbcRowSetImpl的请求

5. 应急响应流程优化

建立标准化的响应checklist:

  1. 初步评估(15分钟内):

    • 确定受影响系统范围
    • 评估漏洞利用可能性
  2. 临时防护(1小时内):

    • 部署安全模式
    • 实施网络层防护
  3. 彻底修复(24-72小时):

    • 制定升级计划
    • 业务兼容性测试
  4. 持续监控

    # 持续监控日志中的可疑请求 tail -f /var/log/nginx/access.log | grep -E '@type|JdbcRowSetImpl|TemplatesImpl'

在实际应急过程中,我们曾遇到一个典型案例:某金融系统因历史原因无法立即升级,通过组合使用安全模式和网络ACL规则,成功阻断了攻击尝试,为系统升级争取了72小时时间窗口。关键是要根据业务特点选择最适合的缓解方案,同时建立多层防御体系。

http://www.jsqmd.com/news/1149851/

相关文章:

  • 【大数据毕业设计】基于大数据技术的电商消费用户画像建模系统的设计与实现 基于 Django 的电商用户画像聚类分析与可视化系统(源码+文档+远程调试,全bao定制等)
  • 如何用Fanqienovel-Downloader构建个人离线小说图书馆:终极免费解决方案
  • Uni-app 的真相:它不是跨端框架,而是中国移动互联网的“方言翻译器“
  • Java Web 安全实战:5步定位并利用WEB-INF目录信息泄露
  • YOLOv5/v8/v11/v12 4版本车牌检测模型对比:mAP 40.6%的YOLO12n实测分析
  • OWASP ZAP 2.15 实战:结合 Selenium 与 Playwright 实现 3 种自动化深度扫描
  • 3分钟掌握Boss-Key:Windows隐私保护终极解决方案,一键智能隐藏敏感窗口
  • STM32F756ZG与ISOM8710数字隔离器的高效接口设计
  • Spring Boot Actuator 未授权访问:3种利用手法与2种加固方案对比
  • 5分钟搞定!BthPS3驱动让你的PS3蓝牙手柄在Windows上完美运行
  • PHP XSS防御函数深度评测:strip_tags vs htmlspecialchars vs preg_replace 效果对比
  • CVE-2017-3506 与 10271 对比:从补丁绕过看 WebLogic 安全演进
  • Pikachu 靶场暴力破解 5 大防护缺陷分析与 4 项安全加固实践
  • 基于TLE 6208-6G与PIC18F2550的直流电机控制方案
  • 如何快速配置Everything搜索插件:Windows文件查找终极指南
  • UDS 0x29 vs 0x27 安全服务对比:从种子密钥到PKI证书的5个关键差异
  • 微信小程序登录 wx.login 2025:3种Code获取方案对比与安全风险分析
  • Node.js <10 CRLF注入漏洞(CVE-2019-9740)深度解析:从Unicode到SSRF攻击链
  • PHP eval() 代码执行漏洞实战:手动构造POST请求绕过菜刀工具(附3种Payload)
  • 快手快币 H5 支付接口 v1.0 逆向分析:从请求构造到安全风控 5 个关键点
  • 3分钟完成专业字幕:VideoSrt开源工具完整指南
  • C++ 软件防破解实战:3 层防护策略与 VMProtect 商业壳对比分析
  • Pikachu靶场 RCE漏洞实战:3种命令注入绕过与PHP eval利用详解
  • PyQt5 -- QtCore
  • Apache HttpClient 4.5 双向SSL认证:修复SSLPeerUnverifiedException的3步排错法
  • M1卡 4种常见控制字节组合实战:从门禁到消费卡的安全配置对比
  • CVE-2017-12615 实战防御:5步加固Tomcat配置与WAF规则编写
  • tElock 0.98 加密壳脱壳:3 种方法对比与 CRC 校验绕过实战
  • CTF 安卓逆向 APK 实战:3 种方法定位并解密 Timer 题目中的 Flag
  • Vulnhub Zico2 靶场:phpLiteAdmin 1.9.3 数据库文件写入 Webshell 的 3 种利用方式