文件读取
文件读取
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)
调用栈:
)——》case BLOB ——》objIn.readObject()</p>
<p>其中getObject调用<code>obj = objIn.readObject();</code></p>
<p><img alt=)
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


扩展








评论