JSONP 劫持
JSONP 介绍
jsonp 是一种协议,准确的说,他是 json 的一种使用模式,为了解决 Json 受同源策略限制的问题。
基本语法
JSONP的基本语法为:callback({"name":"test", "msg":"success"})
常见的例子包括函数调用如callback({"a":"b"})
或变量赋值var a={JSON data}
应用场景
首先演示一下 JSON 的局限性
首先我搭建两个网站 http://www.victim.san.com/ 、http://www.attack.san.com/
我们在 http://www.victim.san.com/ 下新建一个 test.json :
{ "username": "Sentiment", "password": "123456" }
然后在 http://www.victim.san.com/ 中编写以下代码:
index.php:
然后访问 http://www.victim.san.com/
可以看到,能够正常的获取到 JOSN 中的数据
然后我们在 http://www.attack.san.com/ 中编写代码
index.php:
可以看到,因为同源策略的影响,我们的 www.attack.san.com 的 JS 是无法获取到 www.victim.san.com 的数据的。
也就是说,普通的 CSRF 漏洞是这样的。你诱骗别人访问了你的 www.attack.san.com ,你的的恶意 JS 可以操作受害者的浏览器访问关键系统了,然后受害者的浏览器也确实登陆过关键系统有 cookie 的,然后也确实系统返回了敏感数据给受害者的浏览器了,但是,,,你写的这个恶意 JS 因为同源策略的影响它拿不到数据,也就没法把数据发送给你的恶意服务器哦。
JSONP 的用法
jsonp 简单地说,就是利用 script 标签的 src 属性能够发起跨域请求的原理来实现的。
因此只需将 test.json 中的内容按照 javascript 规范去规定,便可以实现跨域资源访问。聪明的程序员们很快便找到了解决问题的办法。只需让目标页面回调本地页面的方法,并带入参数即可,这也就是 jsonp 的核心原理。
index.php:
在 test.json 中按照 javascript 代码规范调用 callback 函数,并将数据作为参数传入
callback({ "username": "Sentiment", "password": "123456" });
此时请求 http://www.attack.san.com/ ,成功请求跨域 json
所以 JSONP 主要就是用来解决跨域问题的。也就是说,顺便帮 CSRF 漏洞也解决了跨域问题。
JSONP跨域漏洞
JSONP 跨域漏洞主要是 callback 自定义导致的 XSS 和 JSONP 劫持。
callback 自定义导致的 XSS
我们知道,在 JSONP 跨域中,我们是可以传入一个函数名的参数如 callback,然后 JSONP 端点会根据我们的传参动态生成 JSONP 数据响应回来。
如果 JSONP 端点对于用于传入的函数名参数 callback 处理不当,如未正确设置响应包的 Content-Type、未对用户输入参数进行有效过滤或转义时,就会导致 XSS 漏洞的产生。
attack.san.com/jsonp.php:
我们再写一个常见的使用 jQuery 调用 JSONP 的例子(为了演示跨域,我就用 victim 调用 attack 了)
victim.san.com/index.php:
可以看到完美实现跨越请求而且发出的确实是 JSONP 格式请求。
那么 XSS 呢?
OK ,我们把 jsonp.php 再放到 victim.san.com 下去吧。
使用 POC 访问 http://www.victim.san.com/jsonp.php?callback=%3Cscript%3Ealert(%27XSS%27)%3C/script%3E;callback
请求后触发 xss,此时发现 php 默认的 content-type 为 text/html
其它 content-type 类型
经测试后发现 application/json、text/json、application/javascript、text/javascript 等都不触发 XSS
JSONP劫持
因为 jsonp 实现了跨域资源访问,如果获取的数据能够成为下一步操作的凭证,那么便可以引起 jsonp 劫持。
Demo1 — 窃取用户信息
以下都是 victim.san.com 下的。
设置模拟用户登录页面 index.php
查询信息页面 info.php
返回信息的接口 jsonp.php
当用户登录后,访问 info.php 便能查询到自己的信息。
这个时候攻击者发现 http://www.victim.san.com/jsonp.php?keyword=admin&callback=jQuery3700970858841055924_1691117036026&_=1691117036029 这个接口使用了 JSONP ,而且也没有防御 CSRF 这类的攻击,OK 进行攻击。
此时构造恶意 html
index.php
data.php
show.php:
引导用户访问后 http://www.attack.san.com/ 成功被 jsonp 劫持
防御
● 若可行,则使用 CORS 替换 JSONP 实现跨域功能;
● 应用 CSRF 防御措施来调用 JSON 文件:限制 Referer 、部署 Token 等;
● 严格设置 Content-Type 及编码(Content-Type: application/json; charset=utf-8 );
● 把回调函数加入到白名单
参考:
__EOF__

本文链接:https://www.cnblogs.com/Nestar/p/17605734.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
本文来自博客园,作者:Nestar,转载请注明原文链接:https://www.cnblogs.com/Nestar/p/17605734.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· SQL Server 2025 AI相关能力初探
· 单线程的Redis速度为什么快?
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码