0x00 前言
继Jackson CVE-2016-3720 xxe之后,最近的一个cve,这个cve的导致原因是因为CVE-2016-3720 修复不完全所导致的。但是经过分析之后发现并没有找到合适的利用方式。
主要还是做一个记录
影响版本:2.7.8之前和2.8.4之前的2.8.x
cve地址:CVE-2016-7051
官方更新地址:更新地址
0x01 环境搭建
找到一个jackson-dataformat-xml-2.7.7的jar包,导入环境。
然后demo如下:
public class Demo {
public static void main(String[] args) throws IOException, XMLStreamException {
XmlFactory xmlFactory=new XmlFactory();
xmlFactory.createParser("<?xml version=\"1.0\" encoding=\"ISO-8859-1\"?><!DOCTYPE foo [<!ELEMENT foo ANY ><!ENTITY % xxe SYSTEM \"http://\" >]><foo></foo>");
}
}
0x02 简要分析
触发的位置还是在这里
增加了javax.xml.stream.isSupportingExternalEntities
的防护
javax.xml.stream.isSupportingExternalEntities
的做用主要是当它被设置为False的时候,就会忽略DTD的执行内容,当然仅仅只是忽略,不做处理。 查了很多资料都是只有只言片语,不足以为javax.xml.stream.isSupportingExternalEntities
提供无法修复的证据。
0x03 修复方式
官方还是对此做出了解决方案:增加了javax.xml.stream.supportDTD
补充知识
Jackson
Jackson是一个基于Java语言的开源库,提供了一系列处理JSON格式数据的工具方法。它可以将Java对象转换成JSON格式,也可以将JSON格式的数据转换成Java对象。Jackson的主要优点包括模块化、高性能、易扩展、简单易用等。
Jackson提供了三个主要的API:
-
Streaming API:使用流式的方式读写JSON数据,适用于大型JSON数据的处理。
-
Tree Model API:将JSON数据解析为树型结构,适用于小型JSON数据的处理。
-
Data Binding API:通过Java对象和JSON数据的相互转换,支持对象继承、多态等高级特性。
Jackson还提供了多种插件和扩展,例如支持XML格式数据的jackson-dataformat-xml插件,支持协议缓存的jackson-module-afterburner扩展等。
isSupportingExternalEntities
isSupportingExternalEntities是一个XML处理器的特性名称。该特性确定处理器是否支持处理外部实体。具体而言,当该特性设置为true时,处理器可以将XML文档中的外部实体解析并包含在解析结果中,否则则忽略外部实体。
外部实体是指在XML文档中声明但未在文档中直接出现的实体,例如DTD声明中的实体。在解析XML文档时,处理器需要考虑这些实体以确保正确解析文档。
如果isSupportingExternalEntities设置为false,则处理器可能会拒绝处理带有外部实体的文档,或者可能会忽略这些实体并导致解析错误。因此,如果需要处理带有外部实体的XML文档,则需要确保isSupportingExternalEntities设置为true。
supportDTD
supportDTD
是XML解析器库中的一个选项,它用于指示解析器是否支持文档类型定义(DTD)。DTD是一种用于验证XML文档结构的约束语言。如果supportDTD
选项设置为true,则解析器将尝试解析文档中的DTD声明并验证文档结构。如果设置为false,则解析器将忽略DTD声明并不会进行验证。
在一些应用程序中,需要进行验证以确保XML文档符合特定的结构要求。这时候就可以使用supportDTD
选项来开启DTD验证功能。但是,如果XML文档过于复杂或包含大量的DTD规则,可能会导致解析器的性能受到影响。
总之,supportDTD
是XML解析器库中的一个重要选项,可以控制解析器对文档的验证行为。根据实际情况,开启或关闭该选项可以使解析器在不同场景下达到更好的性能和效果。
SSRF介绍
SSRF(Server-Side Request Forgery)指的是一种攻击方式,攻击者通过构造恶意的请求,让服务端向攻击者指定的地址发起请求,从而获取到一些敏感信息或者利用服务端漏洞进行攻击。
SSRF攻击常见的应用场景包括:
- 获取敏感信息:攻击者可以通过构造请求,让服务端访问一些不应该被公开访问的内部地址,从而获取敏感信息。
- 攻击内部资源:通过SSRF攻击,攻击者可以让服务端向内网发起攻击,如攻击内部Web应用,获取内部机器的信息等。
- 攻击外部服务:攻击者可以利用SSRF攻击让服务端向外部服务发起攻击,从而获取到外部服务的敏感信息。
为了防止SSRF攻击,我们需要在服务端进行一些防御措施,如限制请求地址的白名单、对参数进行严格的输入检测和过滤、禁止服务端向外部服务发起攻击等。同时,开发者在编写程序的时候也需要注意参数的传递方式,避免出现可以被攻击者利用的漏洞。