通过一篇文章由浅入深的理解JSONP并拓展

目录

  • 简单描述
  • 层层深入
  • 真相浮现
  • 相关拓展:JSONP攻击
    • 1.JSONP 跨域劫持
    • 2.JSONP 跨域劫持token 实现CSRF
    • 3.Referer 头的绕过
  • 参考链接
    • 总结

      简单描述 JSONP 是 JSON with padding(填充式 JSON 或参数式 JSON)的简写。
      JSONP实现跨域请求的原理简单的说,就是动态创建
      我服务器上的test.php会返回json 格式的数据给客户端
      test1.php
      19,'name'=>'jianshu'); exit(json_encode($data)); ?>

      如果正常访问的话,那么我们的浏览器应该会弹出对话框,结果我们会得到这样的结果
      通过一篇文章由浅入深的理解JSONP并拓展
      文章图片

      此处输入图片的描述
      可以看到,浏览器发现这是一个跨域的请求,但是他在服务器的返回头中缺没有发现
      Access-Control-Allow-Origin 值允许 http://localhost 的访问,于是就拦截了。
      也就是说,虽然浏览器受到了同源策略的限制,不允许实现跨域访问,但是由于在开发过程中前后端的交互过程中不可避免地会涉及到跨域的请求(设计同源策略的人想必也发现了这个问题),于是设计者给我们留了一个后门,就是只要服务器响应头中返回允许这个源的选项,那么跨域请求就会成功。(这里纠正一个误区,不要认为浏览器默认支持同源策略就意味着不同源的请求就不能发出去,其实还是能发出去的,只是要看响应头而已。)
      我们知道在页面中有几个东西是对同源策略免疫的,那就是 通过一篇文章由浅入深的理解JSONP并拓展
      文章图片

      实际上,jquery 给我们提供了现成的接口,我们可以不用这么麻烦
      4.html
      GoJSONP

      这时候的请求的 URL 就像下面这个样子:
      http://check.k0rz3n.com/test1.php?id=1&theFunction=jsonhandle

      服务器端页面为:
      test2.php
      20,'name' => 'dada',); $callback = $_GET['theFunction']; echo $callback."(".json_encode($data).")"; return;

      怎么样,大概理解了吧,其实可以用一个非常形象的例子说明:
      幼稚园吃午饭,小明吧贴有自己名字的碗(回调函数)给了幼稚园阿姨(服务器),阿姨给小明盛好饭(json参数)以后又把碗还给了小明。
      就是这样的一个过程。

      相关拓展:JSONP攻击
      1.JSONP 跨域劫持
      实际上就是由于服务器端对JSONP 的请求来源的检查不严格导致的
      攻击者模拟用户向有漏洞的服务器发送JSONP请求,然后就获取到了用户的某些信息,再将这些信息发送到攻击者可控的服务器

      2.JSONP 跨域劫持token 实现CSRF
      通过 jsonp 发起请求,得到泄露的 csrf_token 然后,利用这个token 实现CSRF 攻击

      3.Referer 头的绕过
      在攻击过程中可能会涉及到 referer 头的绕过
      • data:URL
        为了逃避他的检测我们可以选择不发送referer这个头,那么怎么做呢?这就涉及到 data:URL 头
      为了构造一个不带HTTP Referer的请求,我们可以滥用data URI方案。因为我们正在处理的代码包含了引号,双引号,以及其他一些被阻止的语句,接着使用base64编码我们的payload(回调函数定义以及脚本包含)
      data:text/plain; base64our_base64_encoded_code:
      以下3个HTML标签允许我们使用data URI方案:
      iframe (在src属性中) – Internet Explorer下不工作embed (在src属性中) – Internet Explorer及Microsoft Edge下不工作object (在data属性中) – Internet Explorer及Microsoft Edge下不工作

      2.从HTTPS向HTTP发起请求
      如果目标网站可以通过HTTP访问,也可以通过将我们的代码托管在一个HTTPS页面来避免发送HTTP Referer。如果我们从HTTPS页面发起一个HTTP请求,浏览器为了防止信息泄漏是不会发送Referer header。以上我们要将恶意代码托管在一个启用了HTTPS的站点。
      注意:由于mixed-content安全机制,在浏览器默认设置下是不会工作的。需要受害者手动允许浏览器发出的安全警告。

      参考链接
      • https://blog.csdn.net/u011897301/article/details/52679486
      • https://blog.csdn.net/u014607184/article/details/52027879
      • http://www.91ri.org/13407.html
      • http://www.freebuf.com/articles/web/70025.html
      • http://www.freebuf.com/articles/web/126347.html
      • https://www.cnblogs.com/chiangchou/p/jsonp.html

      总结 【通过一篇文章由浅入深的理解JSONP并拓展】到此这篇关于JSONP拓展的文章就介绍到这了,更多相关理解JSONP并拓展内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

        推荐阅读