问答
发起
提问
文章
攻防
活动
Toggle navigation
首页
(current)
问答
商城
实战攻防技术
漏洞分析与复现
NEW
活动
摸鱼办
搜索
登录
注册
关于SAXParser未做安全配置所引发的安全漏洞分析
漏洞分析
逛啊逛逛github,逛到1day分析下~ 最近发现几个有趣的java-xxe的cve,于是进行了一波研究
0x00 前言 ======= 这两天在github逛漏洞情报的时候,发现几个组件存在有趣的java-xxe漏洞,这些漏洞都存在相同的特点,就是在xml进行解析的过程中缺少了某些安全配置Feature 例:`saxReader.setFeature("http://apache.org/xml/features/disallow-doctype-decl", false);` 以下内容便是对两个相关的漏洞进行分析 0x01 Hazelcast XXE漏洞(CVE-2022-0265) =================================== 漏洞描述 ---- Hazelcast(Hazelcast IMDG)是美国Hazelcast公司的一套可扩展的开源数据分发平台。该平台支持多种分布式数据结构,支持分布式缓存等功能。 `AbstractXmlConfigRootTagRecognizer()`函数使用从没有设置 `FEATURE_SECURE_PROCESSING`的`SAXParserFactory`生成的 `SAXParser`,从而允许XXE攻击。 ![1.png](https://shs3.b.qianxin.com/attack_forum/2022/03/attach-03da8242e3a099300ff439da1d7023d07b058d8e.png) 影响版本 ---- Hazelcast < 5.1 环境搭建 ---- 首先通过漏洞描述和[漏洞源码](https://github.com/hazelcast/hazelcast/blob/f373d8e05f0258a8e5e817a46b16ed4e32278bd3/hazelcast/src/main/java/com/hazelcast/internal/config/AbstractXmlConfigRootTagRecognizer.java#L56-L65)可以看到,该漏洞触发点是由于`com.hazelcast.internal.config.AbstractXmlConfigRootTagRecognizer`类中存在直接调用jdk中默认存在的不安全的方法: `javax.xml.parsers.SAXParser`和`javax.xml.parsers.SAXParserFactory` ![2.png](https://shs3.b.qianxin.com/attack_forum/2022/03/attach-5824474e7b76bb45756189ef6557c79c35f0298e.png) 通过对以上不安全方法提取出来做poc验证,得到 ```java SAXParser saxParser = SAXParserFactory.newInstance().newSAXParser(); saxParser.parse(new ByteArrayInputStream(xmlpoc.getBytes()), new HandlerBase()); ``` 以上该示例仅通过ssrf的方式去验证存在xxe漏洞 ![3.png](https://shs3.b.qianxin.com/attack_forum/2022/03/attach-805363dc458d4eaf540270fa692f30fb81959449.png) 漏洞分析 ---- poc中先是通过`SAXParserFactory`实例化了个`SAXParser`对象,接着在对象的`parse`方法中执行了我们恶意的xxe语句,所以就从`saxParser.parse`开始断点分析即可 ![4.png](https://shs3.b.qianxin.com/attack_forum/2022/03/attach-255c576f89aa36e28a82f0090ab318f18ed1dd88.png) 这里的`this`不再是`saxParser`,而是将恶意xxe的byte流带入到`SAXParserImpl.parse`方法中,而当中`HandlerBase`相当于一个xml的解析器,其中以下`setDTDHandler`方法向SAX解析器注册一个实例,是为了去解析咱们恶意xxe ![5.png](https://shs3.b.qianxin.com/attack_forum/2022/03/attach-e08ba4a1a20ef21314cbaae21b62df4b8656502f.png) 继续跟踪到其父类的`AbstractSAZParser.parse`方法中,先是将xxe的byte流等内容赋给新创建的`XMLInputSource`对象,再调用`XMLParser.parse`方法 ![6.png](https://shs3.b.qianxin.com/attack_forum/2022/03/attach-0a0d2f9ce0e2297f462b7b881e0c7fc93d3b5103.png) 跟踪,可以看到`fFeatures`即XML解析器的安全配置。因为XML解析器有时需要去解析外部传入的XML文件,如果没有做特殊处理,大多会解析XML文件中的外部实体。 如果外部实体包含URI,那么XML解析器会访问URI指定的资源,例如本地或者远程系统上的文件。为了防止以上恶意操作,所以就有了xml解析器安全配置的存在 ![7.png](https://shs3.b.qianxin.com/attack_forum/2022/03/attach-82f693595d1a07b6358542469e6fdf30dab3c79b.png) 经过以上过滤,最后会来到`XML11Configuration.parser`方法中准备开始xml解析操作 ![8.png](https://shs3.b.qianxin.com/attack_forum/2022/03/attach-57a61998d65a939bb7808361b689eeff86b46eec.png) 直到`XMLDocumentScannerImpl.startEntity`才完成解析xml ![9.png](https://shs3.b.qianxin.com/attack_forum/2022/03/attach-66d9f1c81db60244e5161083dfc045a328e0855e.png) 调用栈如下: ```php startEntity:529, XMLDocumentScannerImpl (com.sun.org.apache.xerces.internal.impl) startEntity:1327, XMLEntityManager (com.sun.org.apache.xerces.internal.impl) startEntity:1240, XMLEntityManager (com.sun.org.apache.xerces.internal.impl) scanEntityReference:1908, XMLDocumentFragmentScannerImpl (com.sun.org.apache.xerces.internal.impl) next:3061, XMLDocumentFragmentScannerImpl$FragmentContentDriver (com.sun.org.apache.xerces.internal.impl) next:602, XMLDocumentScannerImpl (com.sun.org.apache.xerces.internal.impl) scanDocument:505, XMLDocumentFragmentScannerImpl (com.sun.org.apache.xerces.internal.impl) parse:841, XML11Configuration (com.sun.org.apache.xerces.internal.parsers) parse:770, XML11Configuration (com.sun.org.apache.xerces.internal.parsers) parse:141, XMLParser (com.sun.org.apache.xerces.internal.parsers) parse:1213, AbstractSAXParser (com.sun.org.apache.xerces.internal.parsers) parse:643, SAXParserImpl$JAXPSAXParser (com.sun.org.apache.xerces.internal.jaxp) parse:342, SAXParserImpl (com.sun.org.apache.xerces.internal.jaxp) parse:139, SAXParser (javax.xml.parsers) main:14, cve_2022_0265 (vultest) ``` 补丁分析 ---- 补丁链接:[](https://github.com/hazelcast/hazelcast/commit/4d6b666cd0291abd618c3b95cdbb51aa4208e748)<https://github.com/hazelcast/hazelcast/commit/4d6b666cd0291abd618c3b95cdbb51aa4208e748> 从补丁可以看到hazelcast换了个xml的解析器 ![10.png](https://shs3.b.qianxin.com/attack_forum/2022/03/attach-d5b8b110d59293c4ba0cac52a8b3b58446c7f250.png) 并添加了`FEATURES_DISALLOW_DOCTYPE`安全配置,不允许使用`DOCTYPE` ![11.png](https://shs3.b.qianxin.com/attack_forum/2022/03/attach-e5d925518e3720e647aeb5e47f29a3efc9a77bac.png) 通过补丁,我们修改poc以进行验证 ```java SAXParser saxParser = XmlUtil.getSAXParserFactory().newSAXParser(); saxParser.parse(new ByteArrayInputStream(xmlpoc.getBytes()), new HandlerBase()); ``` 可以看到已经不允许解析`DOCTYPE`文档类型的内容了 ![12.png](https://shs3.b.qianxin.com/attack_forum/2022/03/attach-8994212078eb666c81e6161736659b3fabcfdf33.png) 0x02 Liquibase XXE 漏洞(CVE-2022-0839) ==================================== 漏洞描述 ---- Github liquibase是用于跟踪、版本和部署数据库架构更改。 liquibase 存在安全漏洞,该漏洞源于 XML 外部实体引用限制不当。 影响版本 ---- Liquibase < 4.8.0 环境搭建 ---- 首先从漏洞描述先来看到[漏洞源码](https://github.com/liquibase/liquibase/blob/6f3bb08572b2dcec2d8220b10d49ceb64c4d800a/liquibase-core/src/main/java/liquibase/parser/core/xml/XMLChangeLogSAXParser.java#L24-L27)处,可以看到在实例化解析日志`XMLChangeLogSAXParser`所构造的`SAXParser`解析器之后,在解析xml获取parser时并未设置安全`Feature`,直接将inputStream流带入parse进行解析导致XXE ![a.png](https://shs3.b.qianxin.com/attack_forum/2022/03/attach-3265c6a6bd18f99e3f9cbc55c1875bbe64d53512.png) 以下给出验证poc: ```java XMLChangeLogSAXParser xmlChangeLogSAXParser = new XMLChangeLogSAXParser(); HashMap hashMap = new HashMap<String, String>(); hashMap.put("com/test/cve_2022_0839.xml",POC); MockResourceAccessor resourceAccessor = new MockResourceAccessor(hashMap); xmlChangeLogSAXParser.parse("com/test/cve_2022_0839.xml", new ChangeLogParameters(),resourceAccessor); ``` poc验证效果如下: ![b.png](https://shs3.b.qianxin.com/attack_forum/2022/03/attach-38c9cbb9a79b7c75b44eafdf63bad12d74854340.png) 漏洞分析 ---- 关于poc中所要传入的东西就不说明了,请看这儿~ ```java ParsedNode parseToNode(String physicalChangeLogLocation, ChangeLogParameters changeLogParameters, ResourceAccessor resourceAccessor) ``` 接着让我们看看它在解析xml的过程前是不是没有配置相应的安全配置`Feature` 在调试过程中我们发现,首先来到`XMLChangeLogSAXParser`其父类`AbstractChangeLogParser.parse`方法中,看到了我们传进去所需要的东西 ![c.png](https://shs3.b.qianxin.com/attack_forum/2022/03/attach-49d4e76f17a542c49326fdaef5b377e8fb4f5269.png) `this.parseToNode`将跳回`XMLChangeLogSAXParser.parseToNode`方法中,进行解析器实例化,并且做了相关配置,在执行对poc解析过程中我们来看看现在的解析器有哪些`features` ![d.png](https://shs3.b.qianxin.com/attack_forum/2022/03/attach-eb166f11f0a0357f069cf832225e0100691a9d75.png) 从上述`features`中我们可以看到,并没有存在相对于攻击者来说过分的安全配置,例如`FEATURES_DISALLOW_DOCTYPE、FEATURE_SECURE_PROCESSING`等,这将极易导致存在xxe漏洞的出现和利用,既然漏洞原因和利用入口点是出自xml解析器缺少安全配置,那么后面xml的解析过程不做过多分析了,因为到这里也就可以发现后续调用栈和前一个漏洞是类似的了 ![e.png](https://shs3.b.qianxin.com/attack_forum/2022/03/attach-c962068bc2e19ecc3a93e59f40fda9e74d049834.png) 该漏洞利用调用栈如下: ```java ..... parse:777, XML11Configuration (com.sun.org.apache.xerces.internal.parsers) parse:141, XMLParser (com.sun.org.apache.xerces.internal.parsers) parse:1213, AbstractSAXParser (com.sun.org.apache.xerces.internal.parsers) parse:649, SAXParserImpl$JAXPSAXParser (com.sun.org.apache.xerces.internal.jaxp) parseToNode:89, XMLChangeLogSAXParser (liquibase.parser.core.xml) parse:15, AbstractChangeLogParser (liquibase.parser.core.xml) main:30, cve_2022_0839 (vultest) ``` 补丁分析 ---- 通过[diff](https://github.com/liquibase/liquibase/compare/v4.7.1...v4.8.0)可以看到在`XMLChangeLogSAXParser.java`处补充了`feature`和`property`等安全配置以进行过滤 ![f.png](https://shs3.b.qianxin.com/attack_forum/2022/03/attach-2a407063a6544403d6f2e0562327efc74202bdd3.png) 现在我们将`liquibase`换成更新后的版本,可以看到`features`确实多了关于xml解析的安全配置`FEATURE_SECURE_PROCESSING` ![g.png](https://shs3.b.qianxin.com/attack_forum/2022/03/attach-70a1b5b1412125c04a0572f33776fe03179cdb26.png) 0x03 总结 ======= 1、在java安全开发中若需要用到对xml进行解析的话,应考虑xml组件默认有没有禁用外部实体引用或者其他安全问题,针对补充安全配置以防止功能点在引用到不安全的xml解析器的时候引发一系列的安全问题 2、话说,这不就多了一种挖掘cve的道路吗
发表于 2022-03-24 09:29:22
阅读 ( 6621 )
分类:
漏洞分析
1 推荐
收藏
0 条评论
请先
登录
后评论
w1nk1
12 篇文章
×
发送私信
请先
登录
后发送私信
×
举报此文章
垃圾广告信息:
广告、推广、测试等内容
违规内容:
色情、暴力、血腥、敏感信息等内容
不友善内容:
人身攻击、挑衅辱骂、恶意行为
其他原因:
请补充说明
举报原因:
×
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!