Before:之前看到了key师傅的一篇博文,关于JSONP的内容,感觉之前遇到过这样的问题,有时间了一起来学习一下
同源策略与跨域
在学习JSONP之前要先认识同源策略,因为JSONP是基于JSON格式的为解决跨域请求资源而产生的解决方案。
那什么是同源策略?同源策略是一种约定,它是浏览器最核心也最基本的安全功能。所谓同源是指,域名(或IP),协议,端口相同。浏览器的同源策略,限制了来自不同源的的“document”或脚本,对当前“document”读取和设置某些属性,可以理解为不同源的脚本不能读写对方的资源。例如,a.com下的js脚本采用ajax读取b.com里面的文件数据是会报错的。同源策略提高了WEB的安全性,但是另一方面来讲,却也是一种限制。随着业务的发展,我们有些场景需要突破上数限制,需要去跨域。解决办法有很多,例如CORS(ajax 可以用CORS来做库跨域请求)、iframe、postMessage等,而属于其中也是比较经典的方法就是JSONP。
JSON与JSONP
JSON与JSONP是两种不同的东西。JSON一定不会陌生,它是一种JSON是一种基于文本的数据交换方式,或者叫做数据描述格式,脱胎于JavaScript,后台语言几乎全部支持,JSON 的官方 MIME 类型是 application/json
。而JSONP是一种非官方跨域数据交互协议。全称为 JSON with Padding。
JSONP实现跨域的原理是因为利用了<script></script>
标签,可以通过”SRC”属性引用外部js文件。实际上,不只有<script>
,带有”src”属性的标签都具有跨域的能力,比如<img>,<iframe>,<link>
。这应该算是针对同源策略开的后门吧2333。
JSONP过程大致是这样的:请求方利用 <script>
标签,属性src指向响应方,其中查询参数通常为callback,而值为前端定义好的函数名称,响应方根据得到的callback的值,会将json数据放在以这个值为函数名的回调函数里做为参数传回请求方,请求方得到数据后按照自己需求进行处理和展现。
例如返回的数据:jsonp({ "state": "success" , "msg": "获取成功" });
jsonp 就是自定义的函数名,所以JSONP=JSON+Padding
具体的代码就不举例了
JSON劫持
JSON 劫持又为“ JSON Hijacking ,这个问题属于读取型CSRF攻击范畴,是由于没有经过限制,在传递敏感数据时,攻击者可以构造恶意页面截取敏感数据。
POC
|
|
简单的判断还可以就直接换到另一个浏览器打开,看是否正常显示,如果存在,基本可以确定存在JSONP
常见参数名:
|
|
绕过referer
具体可以看看KEY师傅的referer绕过:http://gh0st.cn/archives/2018-08-01/1
XSS
在查询url中还可能出现XSS ,例如http://www.a.com/getUserinfo.php?callback=<script>alert(/xss/)</script>
是由于没有没有严格定义好 Content-Type( Content-Type: application/json )再加上没有进行过滤直接导致的
参考
http://blog.knownsec.com/2015/03/jsonp_security_technic/
http://gh0st.cn/archives/2018-03-22/1
http://www.cnblogs.com/dowinning/archive/2012/04/19/json-jsonp-jQuery.html
http://www.cnblogs.com/vimsk/archive/2013/01/29/2877888.html
https://zh.wikipedia.org/wiki/JSONP
https://segmentfault.com/a/1190000009577990