JSONP原理以及安全问题

JSONP介绍

JSONP全称是JSON with Padding ,是基于JSON格式的为解决跨域请求资源而产生的解决方案。他实现的基本原理是利用了 HTML 里 元素标签没有跨域限制

JSONP原理就是动态插入带有跨域url的script标签,然后调用回调函数,把我们需要的json数据作为参数传入,通过一些逻辑把数据显示在页面上。

比如如下代码所示,通过script标签完成http://localhost:8080/test01/dom01?callback=jsontest的调用。
在这里插入图片描述
后端代码:
在这里插入图片描述

访问test.html页面执行script,请求http://localhost:8080/test01/dom01?callback=jsontest,然后将请求的内容作为参数,执行jsontest函数,jsontest函数将请求的内容弹出来出来。结果如下:
在这里插入图片描述
这样我们就通过script标签实现了快于请求,绕过了同源策略。

Ajax的jsonp跨域请求原理和这个是一样的,也是在frame里面通过创建一个临时的script标签来实现跨域请求。感兴趣的同学可以自己验证下,操作时只需要打开浏览器调试工具就可以看到。

JSONP劫持

JSON劫持又称“JSON Hijacking”,2008年国外安全研究人员开始提到由JSONP带来的风险。这个问题属于CSRF(Cross-site request forgery跨站请求伪造)攻击范畴,当某网站通过JSONP的方式跨域(一般为子域)传递用户认证后的敏感信息时,攻击者可以构造恶意的JSONP调用页面,诱导被攻击者访问,以达到截取用户敏感信息的目的。如图所示(来自参考文章)
在这里插入图片描述

一个典型的JSON Hijacking攻击代码如下:
在这里插入图片描述
黑客诱惑用户去打开这个html文件,以用户的身份去访问http://localhost:8080/test01/dom01?callback=jsontest,然后把用户的敏感数据通过http://172.20.10.5:8080/test01/dom02?callback=jsontest发送给黑客的服务器。
在这里插入图片描述
http://172.20.10.5:8080/test01/dom02的代码如下所示:其实可以用一个map去接收数据,这样可以在不知道json的数据结构的情况下接收数据。
在这里插入图片描述

JSONP劫持挖掘与防御

JSONP漏洞挖掘,首先需要尽可能的找到所有的接口,尤其是返回数据格式是JSONP的接口,然后在数据包中检索关键词callback、json、jsonp、email等,观察返回值是否变化。

JSONP劫持的防御

  • 限制来源refer
  • 按照JSON格式标准输出(设置Content-Type : application/json; charset=utf-8),预防http://127.0.0.1/getUsers.php?callback=形式的xss
  • 过滤callback函数名以及JSON数据输出,预防xss
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章