JDBC MySQL不出网利用
0x00 前言
好文章 多宣传:https://xz.aliyun.com/news/17830
师傅写的很厉害,分析的很详细
就是复现的时候会稍微有些麻烦,可能要多花些时间,我复现的步骤就不写了,就是跟着文章中的内容一步一步的,就不写流水账了,记得数据库版本用5.1.x的就行
我就稍微总结一下,便于后续忘记的时候回来看好回忆~
0x01 总结
不出网利用链
第一步
核心是利用socketFactory参数,其默认值为 StandardSocketFactory.class.getName(),该参数接收实现了SocketFactory接口的类名。在MysqlIO类的构造方法中会传入此参数,并通过createSocketFactory()方法调用Class.forName(socketFactoryClassName).newInstance()实例化该类
第二步
驱动中符合条件的实现类有StandardSocketFactory(默认 TCP 连接方式)和NamedPipeSocketFactory,后者的connect()方法会使用NamedPipeSocket类,其构造方法通过RandomAccessFile打开文件作为 IO 通道,而文件路径由NAMED_PIPE_PROP_NAME(即namedPipePath参数)控制
NamedPipeSocket的构造方法中发现,它用
RandomAccessFile打开了一个文件,并且最终使用这个文件流作为与服务器连接的IO通道
具体利用方式
利用时,先捕获包含恶意 payload(如反序列化攻击)的 MySQL 通信流量保存为文件,再构造 JDBC URL,指定socketFactory=com.mysql.jdbc.NamedPipeSocketFactory并通过namedPipePath指向恶意文件,驱动会读取本地文件中的恶意流量完成交互,无需实际连接外部服务器,实现不出网利用。进一步可自定义实现SocketFactory接口的类,在其connect()方法中返回自定义Socket子类,通过getInputStream()提供内存中的恶意数据字节流,彻底摆脱对文件的依赖。
实现不出网
通过文件IO的方式与MySQL Server进行交互:
将FakeServer下发的恶意流量放到文件中,再通过NamedPipeSocket的方式去发起连接,可以无网完成利用
文件上传实现
第一种:依赖 heapdump 泄漏的临时文件利用
核心是借助 spring web 的文件上传缓存机制生成恶意临时文件,并通过 heapdump 获取路径。
- 临时文件生成:spring web 使用
commons-fileupload处理上传,当数据超过DiskFileItemFactory.DEFAULT_THRESHOLD(10240b)时,会通过DiskFileItem类在临时目录(如 /tmp 下 tomcat 工作目录)生成upload_{UID}_{UniqueId}.tmp格式文件(UID为固定 UUID,UniqueId通过getUniqueId()自增生成)。 - 规避删除:构造不完整的 multipart 请求(去掉
--boundary--结束标志),使服务器持续等待数据,临时文件保持打开不被删除。 - 路径获取:通过 heapdump 泄漏
UID和临时文件绝对路径,结合UniqueId自增特性预判下一个文件路径,最终在 JDBC URL 中用namedPipePath指向该路径,配合NamedPipeSocketFactory读取恶意数据完成攻击。
第二种:不依赖 heapdump,利用 Linux 文件描述符
无需泄漏路径,直接通过 Linux 系统特性定位临时文件。
- 临时文件留存:同第一种方式,用不完整 multipart 请求使临时文件保持打开状态。
- 路径替代:利用 Linux 中 “打开的文件会在
/proc/self/fd下生成文件描述符” 的特性,无需知道具体路径,直接将 JDBC URL 中的namedPipePath指向/proc/self/fd/xx(如/proc/self/fd/23),NamedPipeSocketFactory通过该描述符读取临时文件中的恶意数据,完成不出网攻击。

浙公网安备 33010602011771号