MySQL JDBC XXE漏洞复现-CVE-2021-2471
先粘贴上大哥的连接:【最新漏洞预警】CVE-2021-2471-MySQL JDBC XXE漏洞分析与概念验证
班门弄斧,不足挂齿,刚学java审计,很多东西都是我自己琢磨牵强附会也不知道对不对,各位师傅请斧正!!!
审计的环境获取:我是通过maven仓库直接拖出来的
这个洞出在Mysql JDBC在处理XML字符串的时候没有对输入字符串进行验证,漏洞的关键点在于MySQL的SQLXML对象的setString函数参数可控。
我们直接从XML的处理类MysqlSQLXML,中的getSource函数开始看:
该函数传入参数clazz,然后进行判断如果clazz不为空且不等于SAXSource.class那么再进入下一个if语句判断其值是否等于DOMSource.class,如果相等,则实例化一个XML构建器。最终解析XML的是这一句。
return new DOMSource(builder.parse(inputSource));
此时我们需要看inputsource是否可控,inputSource来自上面:
inputSource = new InputSource(new StringReader(this.stringRep));
这时候就要看this.stringRep是否可控,我们追踪一下stringRep,到如下位置:
可以看到stringRep被private修饰,那么不出意外可能有一个setString方法与getString对他进行操作,可能也没有,我们再整个类中搜索stringRep,最终定位到:
stringRep在此处被赋值为str,该str为setString方法的参数,那么此时只需要通过MysqlSQLXML的实例化对象调用该方法就可以实现XXE攻击了,也就是:
AObject.setString("<?xml version="1.0" ?>