几年前的文章了,现在才学习... 真的辣鸡,写一下自己的理解,可能会有很多问题,请多多指教~
先了解一下什么是JSONP:
JSONP是一种跨域请求资源的解决方案,JSONP可以绕过AJAX遵循的同源策略。
更容易理解的解释就是:利用“script标签可以跨域请求,并且把返回的结果当作js来执行”的特点来获取第三方的资源
类似这样:<script src="http://verysecurebank.ro/getAccountTransactions"></script>
为了让数据使用更便捷,第三方资源使用JSON格式输出结果
当使用AJAX请求同样的地址时将会出现这样的错误:
Callback:
其实callback很好理解,同样是为了更好的使用第三方数据,第三方允许"请求方"使用自定义的callback名称
还是上面的例子:http://verysecurebank.ro/getAccountTransactions&callback=testing 这里的callback参数是可以自定义的,可以是任何名字 (当然有些接口不允许这么做)
试着画了一张正常请求的图
安全问题:
当攻击者知道返回资源的地址时,且资源中存在隐私信息。是不是可以构造攻击页面,诱导用户访问并获取用户隐私呢?
怎么说呢...
用户在访问qq.com时页面会生成对应的Cookie,当访问子域game.qq.com/user?callback=blabla 时页面将返回game.qq.com下的用户信息
攻击者构造了攻击页面http://www.attack.com/phishing 当用户访问时将会执行攻击页面中的js,恶意的js创建了script标签,并以用户的名义加载game.qq.com/user?callback=blabla
就像这样:
(同事竟然表示看不懂图...简单解释下)
1.访问qq.com并通过认证后会生成qq.com下的Cookie
2.主动或被动访问了恶意页面,恶意页面又携带了向game.qq.com发送请求的恶意js。那么用户的浏览器会解析并执行该js:从game.qq.com获取JSON后发送给恶意js指定的接受页面。
防护与绕过防护:
厂商常用的解决方法是检查Referer是否合法,因为请求是从攻击页面发起的,所以Referer是攻击页面的Url。
这里有个添加了防护的列子:
直接请求这个地址,提示的是没有登陆。
当我手动去修改Header为http://game.qq.com 时成功返回了我的信息:
在浏览器修改Header算什么...... 自..我...安慰?
空Referer绕过
当Referer等于空时,可以绕过大部分网站的检测
使用iframe标签并利用js的伪协议可以实现无Referer的请求,就像这样:
<iframe src="javascript:'<script src=\'http://verysecurebank.ro/getAccountTransactions&callback=testing\'></script><script>alert(\'Hello\')</script>'"></iframe>
301跳转绕过
首先你需要一个该域名或子域的跳转漏洞,然后直接用js加载这个漏洞地址,漏洞地址指向返回JSON数据的接口地址就好了
这里因为手上没有例子,就说了... =。=
放个实例吧
忙着搬砖,临时找了个新浪微博游戏子站的漏洞
直接丢利用代码吧,特别特别好理解
首先是接口地址:http://game.weibo.com/test.php?callback=HelloWeibo&reqid=101001016
create_noref_ifr是创建没有referer的iframe标签的函数,接受一个地址和一串js脚本
script变量内容也很好理解的,当script标签加载了接口之后,会生成一个HelloWeibo变量,经过JSON处理之后alert就好了
有表哥说获取到的信息要怎么发送到自己这边。。其实也很简单的。
就像alert一样,改成一个请求就好了,把信息当作参数,请求自己的接受端。
像这样
为了能够成功接收ajax的请求,需要修改Header
可以用在哪些地方
信息收集挺好的,如果你只知道一个人的QQ,社工裤和搜索引擎又没有他的其他结果。你可以试着收集很多这样的接口,然后发他一个“看似正常的网站” 嗯
参考:
http://blog.knownsec.com/2015/03/jsonp_security_technic/ 这个写好很好的 =。=
最后
谢谢=。=