与跨域相关的 jsonp 劫持与 CORS 配置错误

参考文章:
CORS(跨域资源共享)错误配置漏洞的高级利用
JSONP劫持CORS跨源资源共享漏洞
JSONP绕过CSRF防护token
读取型CSRF-需要交互的内容劫持
跨域资源共享 CORS 详解
cors安全完全指南
GET请求-Referer限制绕过总结


跨域

什么是跨域:当一个请求url的协议、域名、端口三者之间任意一个与当前页面url不同即为跨域,跨域就是一个域名请求另外一个域名的资源
例如www.a.com网站请求www.b.com/b.js javascript文件,这就是跨域。

同源策略:同源策略是浏览器的一个安全功能,不同源的客户端脚本在没有明确授权的情况下,不能读写对方资源。
例如:
一个恶意网站(lol.pp.com)通过 iframe 标签将(lol.qq.com)引入进页面,由于用户安全意识不高,输入账号密码之后就开始了豪华十连抽。此时若没有同源策略的限制,那么钓鱼网站便可以通过 dom 操作获取到用户的账号密码、cookie

再比如,用户同时打开了一个恶意网站和一个受信任网站,此时若没有同源策略的限制,那个恶意网站上的脚本便可以操纵受信任网站,当用户在输入账号密码时,恶意网站便可以实现窃取

为什么要跨域:某些时候,我们需要获取别的域上的资源,比如别的受信任域上的 js 文件,来控制本页面的一些操作

跨域的方式有

  1. jsonp:
    在HTML标签里,一些标签比如 script、img、link,iframe 这样的获取资源的标签是没有跨域限制的
    jsonp 是服务器与客户端跨源通信的常用方法。
    于是可以通过添加一个

    当执行到第二个 script 标签时,此页面会向目标网站发起请求,而目标网页返回了这样一个东西:

    test({"name": "hacker" , "phone": "13888888888"});
    

    这代表了什么?简单来说就是返回了一串执行函数的代码,括号内的数据(一个json格式的数据)就是传入函数的形式参数,然后就会调用前一个 script 内定义的 test 函数,执行相应操作

    什么又是 jsonp 劫持呢? 用户访问了恶意网站,网站页面上存在恶意代码,模拟用户发起 jsonp 请求,并且将数据发送到黑客的服务器上。

    为什么会发生 jsonp 劫持?
    目标站点:

    1. Referer过滤不严谨;
      例如:
      当网站只检测 Referer 里是否只存在 trustedweb.com 这个字符串时
      攻击者可以构造特殊的域名来绕过: www.trustedweb.com.attacker.com 或者:attacker.com?trustedweb.com

    2. 空Referer(在通过跨协议调用JS时,发送的http请求里的Referer为空);
      例如:

      代码里我们使用