Skip to content

jsonP漏洞

什么是jsonP

json是一种通过动态创建script标签实现跨域请求资源的解决方案,基本原理就是利用了html标签不会受到同源策略的影响,绕过同源策略获取远程资源。

jsonP漏洞

json劫持

如login.b.com网站提供的json格式:

data_kt({    newAcct: "boss@zhuanye02"    nickname: "Carry???"    phoneAcct: ""    qqAcct: ""    sacct: "boss"    sid: 1})

假设用户已经登录了login.b.com网站,攻击者通过一些图片或者链接诱惑用户进入第三方网站a.com,a.com网站就可以利用以下代码获取了用户的登录信息:

<script>    function data_kt(obj){        alert(obj);    }    </script><script src="http://login.b.com/ajax/getAcctInfo_h.do?callback=data_kt"></script>

jsonP引起的xss问题

jsonP为了方便前端调用,callback参数一般都是可自定义的,也是这个可定义的callback名输出又导致了其他安全问题。

在早期 jsonP 出现时候,大家都没有合格的编码习惯。再输出 jsonP 时,没有严格定义好 Content-Type( Content-Type: application/json ),误将Content-Type进行设置为text/html等,然后加上 callback 这个输出点没有进行过滤直接导致了一个典型的 XSS 漏洞。

<script src="http://127.0.0.1/getUsers.php?callback=<script>alert(/xss/)</script>"></script>

jsonP安全问题的防御

json劫持的防御

JSON 劫持的防御,重点其实就在于对调用方没有进行验证,那么对应的防御措施就比如:

● 验证referer,也就是验证调用方;

● 增加随机Token。

对产生xss问题的防御

对于XSS问题,我们从原理入手,最主要的就是:

● 设置正确的Content-Type;

● 可以通过对callback函数的长度进行限制、内容进行特殊字符的过滤,这块可以参考XSS的防御方法。

总结

1.  严格安全的实现 CSRF 方式调用 JSON 文件:限制 Referer 、部署一次性 Token 等。

2.  严格安装 JSON 格式标准输出 Content-Type 及编码( Content-Type : application/json; charset=utf-8 )。

3.  严格过滤 callback 函数名及 JSON 里数据的输出。

4.  严格限制对 JSONP 输出 callback 函数名的长度(如防御上面 flash 输出的方法)。

5.  其他一些比较“猥琐”的方法:如在 Callback 输出之前加入其他字符(如:/**/、回车换行)这样不影响 JSON 文件加载,又能一定程度预防其他文件格式的输出。还比如 Gmail 早起使用 AJAX 的方式获取 JSON ,听说在输出 JSON 之前加入 while(1) ;这样的代码来防止 JS 远程调用。