0x01 简述
简单总结一下自己对 JSON Hijacking
和 JSONP 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-type
为 application/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 参考
注:本文内容来自互联网,旨在为开发者提供分享、交流的平台。如有涉及文章版权等事宜,请你联系站长进行处理。