Mysql-JDBC反序列化利用与简单分析"

admin 2026-10-20 06:20:42 网络安全文章 来源:ZONE.CI 全球网 0 阅读模式

cover_image文件读取

文件读取

JDBC URL分析

jdbc:mysql://127.0.0.1:3306/test?autoDeserialize=true&queryInterceptors=com.mysql.cj.jdbc.interceptors.ServerStatusDiffInterceptor&user=base64ZGVzZXJfQ0MzMV9jYWxj

原型:jdbc:mysql://<host>:<port>/<database>?<params>

  • • 127.0.0.1:连接的 MySQL 服务器地址,本地地址。
  • • 3306:MySQL 的默认端口。
  • • test:数据库名称。
  • • 后面是多个 URL 参数,用 & 分隔。

URL参数分析:

  • • autoDeserialize=true

  • • 启用 MySQL JDBC 驱动对序列化对象的自动反序列化。

  • • 当数据库返回字段是 Java 序列化对象(通常是 BLOB),会尝试通过 ObjectInputStream.readObject() 来还原为 Java 对象。

  • • queryInterceptors=com.mysql.cj.jdbc.interceptors.ServerStatusDiffInterceptor

  • • 指定一个或多个查询拦截器类,在执行查询前后插入自定义逻辑。

  • • ServerStatusDiffInterceptor 是 MySQL 官方提供的拦截器之一,它用来比较执行前后的 server\_status 变化。

  • • user=base64ZGVzZXJfQ0MzMV9jYWxj

  • • 指定用户名。

  • • base64解码后为deser\_CC31\_calc

利用链分析

通过构造恶意MySQL协议包,进入反序列化ObjectInputStream.readObject(),执行危险代码。

com.mysql.cj.jdbc.result.ResultSetImpl#getObject(int)
调用栈:

ByteArrayInputStream bytesIn = new ByteArrayInputStream(data);
ObjectInputStream objIn = new ObjectInputStream(bytesIn);
obj = objIn.readObject();
objIn.close();
bytesIn.close();

反向追栈

查看谁调用了getObject

com.mysql.cj.jdbc.util.ResultSetUtil#resultSetToMap(java.util.Map, java.sql.ResultSet)

queryInterceptors=com.mysql.cj.jdbc.interceptors.ServerStatusDiffInterceptor

com.mysql.cj.jdbc.interceptors.ServerStatusDiffInterceptor#populateMapWithSessionStatusValues

扩展

  • • Mysql-JDBC反序列化 https://forum.butian.net/share/2872

不出网的情况

绕过限制

参考资料

声明:文中所涉及的技术、思路和工具仅供以安全为目的的学习交流使用,任何人不得将其用于非法用途给予盈利等目的,否则后果自行承担!

如有侵权烦请告知,我会立即删除并致歉。谢谢!

文章有疑问的,可以公众号发消息问我,或者留言。我每天都会看的。