System.out.println("Database created successfully...");
}catch(SQLException se){
// 处理 JDBC 错误
se.printStackTrace();
}catch(Exception e){
// 处理 Class.forName 的错误
e.printStackTrace();
}finally{
// 用于关闭资源
try{
if(stmt!=null)
stmt.close();
}catch(SQLException se2){
}
try{
if(conn!=null)
conn.close();
}catch(SQLException se){
se.printStackTrace();
}
}// 结束 try
System.out.println("Goodbye!");
}// 结束 main
}// 结束 JDBCExample
复制代码
这一个 MySQL-JDBC 的漏洞简单来说就是 MySQL 对服务器的请求过程利用
[img=720,485.83586626139817]https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202302011351629.png[/img]
正常的命令执行得到结果后就结束了,但是如果响应的结果是一个恶意的 poc 并且在后续过程中进行了反序列化,那么就可以用来执行任意命令了。
【----帮助网安学习,以下所有学习资料免费领!加vx:yj009991,备注 “博客园” 获取!】
① 网安学习成长路径思维导图
② 60+网安经典常用工具包
③ 100+SRC漏洞分析报告
④ 150+网安攻防实战技术电子书
⑤ 最权威CISSP 认证考试指南+题库
⑥ 超1800页CTF实战技巧手册
⑦ 最新网安大厂面试题合集(含答案)
⑧ APP客户端安全检测指南(安卓+IOS)
0x03 漏洞分析
漏洞原理
如果攻击者能够控制 JDBC 连接设置项,那么就可以通过设置其指向恶意 MySQL 服务器进行 ObjectInputStream.readObject() 的反序列化攻击从而 RCE。
具体点说,就是通过 JDBC 连接 MySQL 服务端时,会有几个内置的 SQL 查询语句要执行,其中两个查询的结果集在 MySQL 客户端被处理时会调用 ObjectInputStream.readObject() 进行反序列化操作。如果攻击者搭建恶意 MySQL 服务器来控制这两个查询的结果集,并且攻击者可以控制 JDBC 连接设置项,那么就能触发 MySQL JDBC 客户端反序列化漏洞。
可被利用的两条查询语句:
SHOW SESSION STATUS
SHOW COLLATION
Connection con = DriverManager.getConnection(jdbc_url, "root", "123123");
}
}
复制代码
通过 tcp.port == 3306 && mysql 来过滤协议
我们需要用 python 脚本伪造的 MySQL 服务端需要伪造的是 Greeting 数据包 Response OK 、Response Response OK 以及 JDBC 执行查询语句 SHOW SESSION STATUS 的返回包等,我们逐个来分析。
首先是 greeting 数据包
这里发送 greeting 数据包之后需要发送 Login 请求,Login 请求里面包含了 user 和 db 以及 password,在这之后才会返回 Response OK 的数据包
[img=720,49.275101305718145]https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202302011351638.png[/img]
Login 的请求包在发送完 greeting 包之后会自动发送,所以我们只需要发送一段 greeting 数据包,返回一段 Response OK 数据包即可,Response OK 包如下
继续往下,需要编写四个 Request Query 包的 Response 包后,才是 SHOW SESSION STATUS
[img=720,83.87510008006406]https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202302011351640.png[/img]
响应包的编写需要我们将 MySQL Protocol 的部分全部复制进来
如此,构造出最后的 fake MySQL 服务端