1)什么是json
json(JavaScript Object Notation, JS 对象标记) 是一种轻量级的数据交换格式。JSON最常用的格式是对象的键值对,例如下面这样:
{“firstName”: “Jayway”,“lastName”: “0Day”}
2)json hijacking漏洞
json劫持(jsonhijacking)漏洞其实是一个跨域数据窃取漏洞,它通过诱导用户点击恶意文件,重写Array()的构造函数的方法,将敏感的json数据发送攻击者,从而造成敏感信息泄露,所以可以理解为“通过CSRF方式导致的敏感信息泄露”。
举例说明:用户Jayway访问网站https://haacked.com/发出请求:
GET:/demos/secret-info.json返回敏感信息:{“firstName”:“Jayway”, “lastName”: “0Day”}此时,攻击者在他的服务器上放置这样一个html文件:
攻击者诱导用户Jayway点击这个文件,页面会弹框。若将alert改为其他操作函数,攻击者可以对用户的json数据作任意处理:
攻击的成功关键在于JavaScript允许重新定义Array构造函数:如果在JS中定义了两个相同名称的函数/方法,那么前一个函数等于定义无效,后一个函数才是有效的定义。
上面的HTML文件构造,关键是三步:
1)重新定义数组构造函数Array = function() 并将数组赋值给我们定义的全局变量;
2)向目标网站发送一条请求,借用被攻击者的session权限;
3)将获得的数据赋给yourData,从而进行任意处理。
其中第一步的函数覆盖是关键,可以JS中的方法覆盖的特性或者使用JS的特殊方法Object.prototype.__defineSetter__等。
3)什么是jsonp
jsonp(jsonp withPadding)是带有Padding的JSON,它的产生就是为了解决跨域访问问题,基本原理是利用了HTML 里 元素标签,远程调用 JSON 文件来实现数据传递。它最大的特征就是回传,也就是常见的callback函数。
比如,在一个端点处有下列json数据:
若传输到reports域内会因同源策略而无法进行xhr传输:
所以我们先通过 JSONP 的”Padding “输出为:
而后定义myCallback函数,在脚本标记中引用API调用来调用,callback参数在这里是可以自定义的:
4)jsonp injection漏洞
了解了jsonp的用法,由于callback参数可以自定义,所以就有了所有注入漏洞都有的通病:“输入在输出中回显”,其中导致的一个问题就是XSS,前提是返回包Content-Type:text/html而不是Content-Type: application/json。
此外jsonp也有hijacking漏洞,但稍有不同,json是重写函数,而jsonp是通过重写参数callback的函数值,payload更简单,自定义一个函数名然后通过callback调用:
达到的攻击效果主要是盗取用户敏感数据: