WxJava XXE 漏洞分析

漏洞编号

CVE-2019-5312

漏洞简介

WxJava 是一款基于Java开发的开源微信开发工具包,该工具包支持包括微信支付、开放平台、小程序、企业微信/企业号和公众号等的后端开发。在WxJava3.3.0版本中的BaseWxPayResult.java文件的getXmlDoc()方法存在XML外部实体注入漏洞。

漏洞影响

WxJava 3.3.1.B及以前版本。

环境搭建

  • Java 运行环境
  • Nginx (查看访问log,用于XXE盲注)
  • 漏洞代码(WxJava 3.3.1.B)

补丁分析

在github上进行commit diff对比

可以看到作者已经在在创建DocumentBuilderFactory类的实例之后进行了setFeature禁用DTD文档。

在补丁上面一行发现作者已经通过setExpandEntityReferences()DocumentBuilderFactory实例的expandEntityRef属性设置为false了,此处修改对应另一个漏洞CVE-2018-20318,但这个修改并没有禁用外部实体的引用,也就是说并没有任何效果。深挖之后发现这可能是JAVA JDK的一个BUG:DOM parser does not honor DocumentBuilderFactory.setExpandEntityReferences(false),此BUG当前状态为IN PROGRESS,疑似还未修复。

漏洞分析

初始化WxPayOrderQueryResult类实例,通过setXmlString()方法设置xmlString,然后调用此类实例的toMap()方法将xml文档转换为Map。在此调用了此类的getXmlDoc()方法。

进入getXmlDoc()方法中发现此处已经对DocumentBuilderFactory实例进行了setExpandEntityReferences()的设置,但因为刚才提到的JDK BUG,此设置未生效。在这里依然可以解析DTD文档和外部实体,触发漏洞。

PoC

构造PoC如下:

执行结果:

修复建议

更新WxJava版本到3.3.2.B及以上。

Comments
Write a Comment