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通过该描述符读取临时文件中的恶意数据,完成不出网攻击。
posted @ 2025-08-21 15:28  Zephyr07  阅读(41)  评论(0)    收藏  举报