参考链接:在JSON中玩转XXE攻击
前言
在刷题的过程中遇到了一个没见过的新姿势,这里记录一下加深对xxe漏洞的认识
xml基础
要了解xxe漏洞前先了解xml文档的基础,这是基本知识
和html的区别为:1
2XML 被设计为传输和存储数据,其焦点是数据的内容。
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 | HTTP Request: |
如果Content-Type头被修改为application/xml,客户端会告诉服务器post过去的数据是XML格式的。但如果你实际传过去的不是xml格式的话,服务器不会进行解析,并且会报如下的错:
1 | HTTP Request: |
说明服务器能够处理XML格式和JSON格式的数据,但现在服务器收到的真实数据格式并不是在Content-Type里声明的XML格式,所以这里自然不能被解析啦。为了解决这个问题,JSON格式被强行转换为XML格式。
Original JSON1
{"search":"name","value":"netspitest"}
XML Conversion1
2
3<?xml version="1.0" encoding="UTF-8" ?>
<search>name</search>
<value>netspitest</value>
然而,这样直接转换过来的XML文档很明显是无效的,它并没有XML格式文件所必须的\
1 | <?xml version="1.0" encoding="UTF-8" ?> |
1 | HTTP Response: |
因为在这里服务器是可以接收XML的数据的,黑客能由此对JSON终端实施XXE攻击。
1 | <?xml version="1.0" encoding="UTF-8" ?> |
黑客在这里就可以读到/etc/passwd的文件内容
总结
不是每一个JSON终端都会接收XML格式,改变Content-Type一般没有用处,有可能只能得到415的数据类型不支持错误。但是,JSON转换为XML的攻击不会只限制于通过post传输带有JSON内容的payload,如果JSON的参数被转换为XML,服务器会自己判断content type的真实类型。
学到了很多,以后有关于xxe漏洞的新姿势继续补上