XXE萌新进阶全攻略
首先声明下本文为萌新向,旨在让刚接触XXE基本概念的小伙伴们可以熟练运用高阶的XXE攻击。本文涉及层面包括概念讲解、代码审计、漏洞复现、漏洞利用、工具使用、安全开发,无论你是开发人员还是渗透工程师,都可以在这里拿到你想要的。
在渗透领域、XXE相对来讲入门门槛是偏高的,网上的各类XXE教程对于大牛还好,但对于一些零开发基础的小伙伴来讲,着实不太友好,所以我希望通过从最基础的理论着手,为大家建立一个健全易懂的XXE漏洞复现,结合代码审计,更好的帮助大家更好的攻克这个点。
代码审计涉及漏洞:
XML Entity Expansion Injection (XML实体扩展注入)
XML External Entity Injection (XML外部实体注入)
基本概念
在展开讲XXE之前,我们必须得了解些基础概念,因为本文重点为XXE,关于XML学习未提到的部分大家可以参照参考资料自我拓展。
XML
XML 指可扩展标记语言(eXtensible Markup Language)。方便大家理解,这里与HTML对比着给大家说一下:HTML和XML 为不同的目的而设计,HTML 被设计用来显示数据,其焦点是数据的外观。XML 被设计用来传输和存储数据,其焦点是数据的内容。HTML 旨在显示信息,而 XML 旨在传输信息。
DTD
DTD(文档类型定义)的作用是定义 XML 文档的合法构建模块。DTD的声明:指XML文档中声明该文档的DTD或DTD来源的部分,可以包含在使用它的XML文档内部,也可以以独立的DTD文档(*.dtd)文档存在。
所以DTD一般认为有两种引用或声明方式:
1、内部DTD:即对XML文档中的元素、属性和实体的DTD的声明都在XML文档中。2、外部DTD:即对XML文档中的元素、属性和实体的DTD的声明都在一个独立的DTD文件(.dtd)中。(网上有提到的引用公共DTD其实也算外部引用DTD的一种)
XML基本文档结构
xml version="1.0" encoding="UTF-8"?>
]>
foo>&xxe;foo>
XXE的复现
说起最近比较火的XXE,不得不提2018年出现的spring中出现的XXE漏洞【CVE-2018-1259】,今天就拿它来开刀吧。
Spring Data Commons, versions 1.13 prior to 1.13.12 and 2.0 prior to 2.0.7, used in combination with XMLBeam 1.4.14 or earlier versions, contains a property binder vulnerability caused by improper restriction of XML external entity references as underlying library XMLBeam does not restrict external reference expansion. An unauthenticated remote malicious user can supply specially crafted request parameters against Spring Data’s projection-based request payload binding to access arbitrary files on the system.
从官方的描述中我们可以看到,此漏洞主要出现在XMLbeam1.4.14之前的版本,同时要求Spring Data Commons 1.13至1.13.11以及2.0至2.0.6的版本,目前idea默认选择的spring boot2.1.1版本漏洞已修复,我们可以看到默认的Spring Data Commons版本为2.1.0以上。
spring boot默认库
spring boot 2.1.1数据包报错
spring boot 2.1.1调试报错
显然,这是因为spring boot 2.1.1默认禁用了DTD。
我们尝试降低spring-data-commons版本,以便漏洞正常复现,直接修改pom文件,借助maven自动解决依赖问题。
配置pom文件
在这里说点经验之谈,我对不同版本进行了尝试,不知道是不是个人原因,我发现版本并没有按照官方提到的那样精确,比如这里如果spring-data-commons采用2.0.6版本, XMLBeam采用1.4.13版本,你会发现DTD依然是被禁止的。所以本次漏洞复现我选择了spring-data-commons2.0.6+ XMLBeam1.4.14的组合。
然后我们在springboot中简单的写个小功能,操作过程打算使用burpsuite复现,那就不写前端页面啦~
核心代码如下,用来接收通过XML提交的两个数据:firstname/lastname
public interface UserPayload {
@XBRead("//firstname")
@JsonPath("$..firstname")
String getFirstname();
@XBRead("//lastname")
@JsonPath("$..lastname")
String getLastname();
}
springboot不愧为新一代的懒人框架,简单的调整下入口文件,小程序完美启动~
首先声明下本文为萌新向,旨在让刚接触XXE基本概念的小伙伴们可以熟练运用高阶的XXE攻击。本文涉及层面包括概念讲解、代码审计、漏洞复现、漏洞利用、工具使用、安全开发,无论你是开发人员还是渗透工程师,都可以在这里拿到你想要的。
在渗透领域、XXE相对来讲入门门槛是偏高的,网上的各类XXE教程对于大牛还好,但对于一些零开发基础的小伙伴来讲,着实不太友好,所以我希望通过从最基础的理论着手,为大家建立一个健全易懂的XXE漏洞复现,结合代码审计,更好的帮助大家更好的攻克这个点。
代码审计涉及漏洞:
XML Entity Expansion Injection (XML实体扩展注入)
XML External Entity Injection (XML外部实体注入)
基本概念
在展开讲XXE之前,我们必须得了解些基础概念,因为本文重点为XXE,关于XML学习未提到的部分大家可以参照参考资料自我拓展。
XML
XML 指可扩展标记语言(eXtensible Markup Language)。方便大家理解,这里与HTML对比着给大家说一下:HTML和XML 为不同的目的而设计,HTML 被设计用来显示数据,其焦点是数据的外观。XML 被设计用来传输和存储数据,其焦点是数据的内容。HTML 旨在显示信息,而 XML 旨在传输信息。
内容来自无奈安全网
DTD
DTD(文档类型定义)的作用是定义 XML 文档的合法构建模块。DTD的声明:指XML文档中声明该文档的DTD或DTD来源的部分,可以包含在使用它的XML文档内部,也可以以独立的DTD文档(*.dtd)文档存在。
所以DTD一般认为有两种引用或声明方式:
1、内部DTD:即对XML文档中的元素、属性和实体的DTD的声明都在XML文档中。2、外部DTD:即对XML文档中的元素、属性和实体的DTD的声明都在一个独立的DTD文件(.dtd)中。(网上有提到的引用公共DTD其实也算外部引用DTD的一种)
XML基本文档结构
xml version="1.0" encoding="UTF-8"?>
]>
本文来自无奈人生安全网
foo>&xxe;foo>
XXE的复现
说起最近比较火的XXE,不得不提2018年出现的spring中出现的XXE漏洞【CVE-2018-1259】,今天就拿它来开刀吧。
Spring Data Commons, versions 1.13 prior to 1.13.12 and 2.0 prior to 2.0.7, used in combination with XMLBeam 1.4.14 or earlier versions, contains a property binder vulnerability caused by improper restriction of XML external entity references as underlying library XMLBeam does not restrict external reference expansion. An unauthenticated remote malicious user can supply specially crafted request parameters against Spring Data’s projection-based request payload binding to access arbitrary files on the system.
从官方的描述中我们可以看到,此漏洞主要出现在XMLbeam1.4.14之前的版本,同时要求Spring Data Commons 1.13至1.13.11以及2.0至2.0.6的版本,目前idea默认选择的spring boot2.1.1版本漏洞已修复,我们可以看到默认的Spring Data Commons版本为2.1.0以上。
www.wnhack.com
spring boot默认库
spring boot 2.1.1数据包报错
spring boot 2.1.1调试报错
显然,这是因为spring boot 2.1.1默认禁用了DTD。
我们尝试降低spring-data-commons版本,以便漏洞正常复现,直接修改pom文件,借助maven自动解决依赖问题。
配置pom文件
在这里说点经验之谈,我对不同版本进行了尝试,不知道是不是个人原因,我发现版本并没有按照官方提到的那样精确,比如这里如果spring-data-commons采用2.0.6版本, XMLBeam采用1.4.13版本,你会发现DTD依然是被禁止的。所以本次漏洞复现我选择了spring-data-commons2.0.6+ XMLBeam1.4.14的组合。
然后我们在springboot中简单的写个小功能,操作过程打算使用burpsuite复现,那就不写前端页面啦~
核心代码如下,用来接收通过XML提交的两个数据:firstname/lastname
public interface UserPayload {
@XBRead("//firstname")
@JsonPath("$..firstname")
String getFirstname();
@XBRead("//lastname")
@JsonPath("$..lastname")
String getLastname();
}
springboot不愧为新一代的懒人框架,简单的调整下入口文件,小程序完美启动~
无奈人生安全网