先来了解下同源策略;
同源策略即:同一协议,同一域名,同一端口号。当其中一个不满足时,我们的请求即会发生跨域问题。
举例:
http://a.com:80 与 https://a.com:80 (域名、端口相同但协议不同)
https://a.com:80 与 https://a.com:8080 (端口不同)
https://a.com:80 与 https://b.com:80 (域名不同)
三要素:域名、端口、协议
JSONP原理
ajax请求受同源策略影响,不允许进行跨域请求,而script、img、ifram标签等中src属性的链接可以访问跨域的js脚本,利用这个特性,服务端不在返回json数据,而是返回调用某个函数的js代码,在src中调用,以此实现跨域。
存在问题
1.JSONP劫持(也叫JSON劫持?还叫JSON Hijacking)
只要返回敏感信息的json,并且没有验证Referer(或者没有有效的验证手段)均存在此问题;
利用流程:
发现-构造poc-发送给其他用户访问-获取其他用户敏感信息
2.callback可定义导致的安全问题
XSS问题;
安全防范
1.JSONP劫持
验证 JSON 文件调用的来源( Referer );
随机token;
对应绕过:
- Referer过滤规则(正则)不严谨;
- 空Referer;忽视了空Referer的情况,用 <iframe> 调用 javscript 伪协议来实现空 Referer 调用 JSON 文件;
- token可被爆破。
2.callback可定义导致的安全问题
严格定义 Content-Type: application / json;
过滤 callback 以及 JSON 数据输出;
对应绕过:
绕过不写了,常规XSS绕过。
JSONP与CORS
前面讲到了同源策略(SOP),而解决跨域处理问题的办法:
1、JSONP;2、CORS;3、子域代理(已不用)。
CORS:跨域资源共享(Cross-origin resource sharing)是H5提供的一种机制,WEB应用程序可 以通过在HTTP增加字段来告诉浏览器,哪些不同来源的服务器是有权访问本站资源的,当不同域的请求发生时,就出现了跨域的现象。也算是为了解决JSONP的问题。
- Access-Control-Allow-Origin:指定哪些域可以访问域资源。例如,如果requester.com想要访问provider.com的资源,那么开发人员可以使用此标头安全地授予requester.com对provider.com资源的访问权限。
- Access-Control-Allow-Credentials:指定浏览器是否将使用请求发送cookie。仅当allow-credentials标头设置为true时,才会发送Cookie。
- Access-Control-Allow-Methods:指定可以使用哪些HTTP请求方法(GET,PUT,DELETE等)来访问资源。此标头允许开发人员通过在requester.com请求访问provider.com的资源时,指定哪些方法有效来进一步增强安全性。