从JDBC MySQL不出网攻击到spring临时文件利用
字数 1488 2025-08-29 22:41:10

JDBC MySQL不出网攻击与Spring临时文件利用技术分析

0x00 传统攻击流程分析

传统JDBC MySQL攻击流程包含以下步骤:

  1. 攻击者控制目标JDBC连接指向恶意fakeServer
  2. 目标向fakeServer发起连接请求
  3. fakeServer下发恶意数据包
  4. 目标解析恶意数据包完成攻击(文件读取、反序列化等)

局限性

  • 需要外连恶意服务器
  • 容易被流量设备监测
  • 网络隔离环境下无法实施

0x01 MySQL驱动的socketFactory机制

socketFactory关键参数

  • 默认值:StandardSocketFactory.class.getName()
  • 功能:指定用于创建MySQL连接的Socket工厂类

核心类分析

  1. StandardSocketFactory

    • 默认实现
    • 使用TCP连接方式
    • 需要网络连接MySQL Server
  2. NamedPipeSocketFactory

    • 使用命名管道方式
    • 关键代码路径:
      // 使用RandomAccessFile打开指定路径文件
      RandomAccessFile namedPipeFile = new RandomAccessFile(filePath, "rw");
      
    • 连接参数:namedPipePath(通过JDBC URL控制)

控制文件路径

  • JDBC URL中通过namedPipePath参数指定文件路径
  • 示例格式:jdbc:mysql://localhost:3306/test?socketFactory=com.mysql.jdbc.NamedPipeSocketFactory&namedPipePath=/path/to/file

0x02 不出网利用实现

攻击流程

  1. 构造恶意流量数据包

    • 使用FakeServer生成攻击流量
    • 通过Wireshark抓取完整TCP流
    • 导出原始数据包
  2. 本地文件利用

    • 将导出的数据包保存为文件(如1.pcap)
    • 通过namedPipePath指定该文件路径
    • 触发JDBC连接实现反序列化攻击

必要条件

  1. 能将恶意数据文件推送到目标服务器
  2. 能控制JDBC连接参数

0x03 文件上传技术研究

方法一:业务功能上传

  • 利用现有文件上传功能
  • 直接上传恶意文件到已知路径
  • 通过namedPipePath指定上传文件路径

方法二:临时文件+heapdump泄漏

Spring Web文件上传机制

  • 使用commons-fileupload处理上传
  • 缓冲区大小:DiskFileItemFactory.DEFAULT_THRESHOLD(10240字节)
  • 超过阈值时缓存到临时文件
  • 临时文件路径格式:
    /tmp/{tomcat_path}/work/Tomcat/localhost/ROOT/upload_{UID}_{UniqueId}.tmp
    
    • UID:随机UUID(类初始化时生成)
    • UniqueId:自增ID(每次文件缓存+1)

防止文件删除技巧

  • 修改HTTP请求使服务器持续等待:
    • 去除multipart结束标志--
    • 示例:
      POST /upload HTTP/1.1
      Host: target.com
      Content-Type: multipart/form-data; boundary=xxxxxxxx
      Content-Length: 100000
      
      --xxxxxxxx
      Content-Disposition: form-data; name="file"; filename="test.txt"
      Content-Type: text/plain
      
      [超过10KB的数据...
      

heapdump利用

  1. 触发临时文件生成
  2. 通过heapdump获取:
    • UID值
    • 临时文件绝对路径
  3. 预测下一个临时文件名(UniqueId+1)

方法三:去除heapdump依赖

/proc文件描述符利用

  • Linux特性:未关闭的文件会在/proc/self/fd/下显示
  • 关键技巧:
    • 不发送multipart结束标志
    • 保持文件处于打开状态
    • 通过/proc/self/fd/x访问临时文件

最终利用脚本

import requests

url = "http://target.com/upload"
headers = {
    "Content-Type": "multipart/form-data; boundary=xxxxxxxx",
    "Content-Length": "1000000"  # 设置超大值
}

# 构造不完整的multipart请求
data = (
    "--xxxxxxxx\r\n"
    "Content-Disposition: form-data; name=\"file\"; filename=\"test.txt\"\r\n"
    "Content-Type: text/plain\r\n\r\n"
    "[超过10KB的恶意数据..."
    # 不包含结束标志
)

# JDBC连接使用/proc文件描述符
jdbc_url = (
    "jdbc:mysql://localhost:3306/test?"
    "socketFactory=com.mysql.jdbc.NamedPipeSocketFactory&"
    "namedPipePath=/proc/self/fd/x"  # x为文件描述符编号
)

0x04 技术总结

攻击优势

  1. 完全不出网,绕过网络隔离
  2. 隐蔽性强,不易被流量设备检测
  3. 适用于多种需要本地文件的攻击场景

扩展应用

  1. ClassPathXmlApplicationContext加载本地XML
  2. 加载本地类文件
  3. 加载本地插件等场景

参考资源

  • JDBC Tricks项目
  • 包含URL绕过技巧和不出网利用demo
  • 相关议题PPT和技术细节
JDBC MySQL不出网攻击与Spring临时文件利用技术分析 0x00 传统攻击流程分析 传统JDBC MySQL攻击流程包含以下步骤: 攻击者控制目标JDBC连接指向恶意fakeServer 目标向fakeServer发起连接请求 fakeServer下发恶意数据包 目标解析恶意数据包完成攻击(文件读取、反序列化等) 局限性 : 需要外连恶意服务器 容易被流量设备监测 网络隔离环境下无法实施 0x01 MySQL驱动的socketFactory机制 socketFactory关键参数 默认值: StandardSocketFactory.class.getName() 功能:指定用于创建MySQL连接的Socket工厂类 核心类分析 StandardSocketFactory : 默认实现 使用TCP连接方式 需要网络连接MySQL Server NamedPipeSocketFactory : 使用命名管道方式 关键代码路径: 连接参数: namedPipePath (通过JDBC URL控制) 控制文件路径 JDBC URL中通过 namedPipePath 参数指定文件路径 示例格式: jdbc:mysql://localhost:3306/test?socketFactory=com.mysql.jdbc.NamedPipeSocketFactory&namedPipePath=/path/to/file 0x02 不出网利用实现 攻击流程 构造恶意流量数据包 使用FakeServer生成攻击流量 通过Wireshark抓取完整TCP流 导出原始数据包 本地文件利用 将导出的数据包保存为文件(如1.pcap) 通过 namedPipePath 指定该文件路径 触发JDBC连接实现反序列化攻击 必要条件 能将恶意数据文件推送到目标服务器 能控制JDBC连接参数 0x03 文件上传技术研究 方法一:业务功能上传 利用现有文件上传功能 直接上传恶意文件到已知路径 通过 namedPipePath 指定上传文件路径 方法二:临时文件+heapdump泄漏 Spring Web文件上传机制 使用commons-fileupload处理上传 缓冲区大小: DiskFileItemFactory.DEFAULT_THRESHOLD (10240字节) 超过阈值时缓存到临时文件 临时文件路径格式: UID:随机UUID(类初始化时生成) UniqueId:自增ID(每次文件缓存+1) 防止文件删除技巧 修改HTTP请求使服务器持续等待: 去除multipart结束标志 -- 示例: heapdump利用 触发临时文件生成 通过heapdump获取: UID值 临时文件绝对路径 预测下一个临时文件名(UniqueId+1) 方法三:去除heapdump依赖 /proc文件描述符利用 Linux特性:未关闭的文件会在 /proc/self/fd/ 下显示 关键技巧: 不发送multipart结束标志 保持文件处于打开状态 通过 /proc/self/fd/x 访问临时文件 最终利用脚本 0x04 技术总结 攻击优势 完全不出网,绕过网络隔离 隐蔽性强,不易被流量设备检测 适用于多种需要本地文件的攻击场景 扩展应用 ClassPathXmlApplicationContext 加载本地XML 加载本地类文件 加载本地插件等场景 参考资源 JDBC Tricks项目 包含URL绕过技巧和不出网利用demo 相关议题PPT和技术细节