JSONP

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

1
2
3
4
5
6
7
<script>
function jsonp1(json){
alert(JSON.stringify(json))
}
</script>
<script src="https://www.a.com/getuserinfo.php?callback=jsonp1"></script>

简单的判断还可以就直接换到另一个浏览器打开,看是否正常显示,如果存在,基本可以确定存在JSONP

常见参数名:

1
2
3
4
5
6
7
8
callback=
cb=
jsonp=
jsonpcallback=
json=
jsoncallback=
jcb=
call=

绕过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

https://segmentfault.com/a/1190000009624849#articleHeader0

https://www.cnblogs.com/rockmadman/p/6836834.html

文章作者: Venture
文章链接: http://yoursite.com/2018/08/31/jsonp/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Venture's Blog