深度剖析JSONP注入漏洞:JavaScript回调函数引发的会话弹窗劫持
字数 1660 2025-08-30 06:50:12
JSONP注入漏洞深度剖析与防御指南
1. JSONP注入漏洞概述
JSONP (JSON with Padding) 是一种用于解决跨域数据请求的技术,它通过动态创建<script>标签来实现跨域数据获取。然而,当JSONP实现不当时,会导致严重的安全漏洞:
- 高危特性:未过滤的JSONP回调函数可导致完整会话Cookie泄露
- 利用难度:低
- 危害程度:极高,可实现完全身份冒充
- 典型场景:企业登录系统、SP平台等使用JSONP进行跨域通信的场景
2. 漏洞挖掘与识别
2.1 识别JSONP端点
在渗透测试中,寻找以下特征的接口:
- 响应中包含
callback、jsonp或类似参数 - 响应内容为JavaScript代码而非纯JSON
- Content-Type可能为
application/javascript而非application/json
示例漏洞接口:
https://example.com/api/userinfo?callback=processUserData
2.2 前端代码审计关键点
审查前端JavaScript代码时,重点关注:
-
高危函数使用:
eval()- 直接执行字符串中的JS代码Function()构造函数 - 动态创建可执行函数setTimeout()/setInterval()- 当第一个参数为字符串时document.write()/innerHTML- 可能导致XSS
-
JSONP实现方式:
- 是否对回调函数名进行了严格过滤
- 响应是否设置了正确的Content-Type头
- 是否使用了不安全的动态代码执行方式
3. 漏洞利用技术
3.1 基本攻击流程
- 拦截JSONP响应(使用Burp Suite等工具)
- 注入恶意JavaScript代码
- 利用回调函数执行任意代码
攻击示例:
// 正常响应
callback({"user":"admin","token":"xyz"});
// 恶意注入
callback({}); alert(document.cookie); //
3.2 高级利用技术
-
函数劫持:
- 劫持
Object.assign等原生函数 - 覆盖默认行为以执行恶意代码
- 劫持
-
会话窃取:
- 通过
alert()或外部请求泄露完整Cookie - 窃取
JSESSIONID等关键会话标识
- 通过
-
无交互劫持:
- 在用户无感知情况下完成攻击
- 可绕过验证码等安全措施
4. 漏洞防御措施
4.1 服务端防御
-
严格过滤回调函数名:
- 只允许字母数字和下划线
- 限制长度(如最多32字符)
-
设置正确的Content-Type:
- 强制设置为
application/json - 避免浏览器误解析为JS
- 强制设置为
-
添加CSRF防护:
- 校验Referer头
- 使用一次性token
4.2 客户端防御
-
避免使用高危函数:
- 用
JSON.parse()替代eval() - 避免动态执行不可信代码
- 用
-
实施严格的CSP策略:
- 限制脚本来源
- 禁止内联脚本执行
-
会话保护:
- 设置
HttpOnly和Secure标志 - 使用SameSite Cookie属性
- 设置
5. 安全开发建议
-
优先使用CORS:
- 现代应用中应优先考虑CORS而非JSONP
- 更安全且功能更完善
-
输入验证与输出编码:
- 对所有输入进行严格验证
- 对动态内容进行适当的编码
-
安全审计:
- 定期进行代码安全审计
- 特别关注跨域通信相关代码
6. 渗透测试检查清单
在进行JSONP相关安全测试时,使用以下检查项:
-
全局搜索以下关键词:
eval(Function(setTimeout(innerHTMLjsonpcallback
-
测试所有JSONP端点:
- 尝试注入任意回调函数名
- 测试XSS payload
- 检查会话信息泄露
-
验证防御措施:
- 检查Content-Type头
- 验证回调函数名过滤
- 测试CSRF防护
7. 总结
JSONP注入漏洞虽然原理简单,但危害极大。通过本文的分析,我们了解到:
- 不安全的JSONP实现可导致会话完全被接管
eval()等高危函数是主要风险点- 严格的输入验证和输出编码是防御关键
- 现代应用应优先考虑CORS等更安全的替代方案
安全开发需要时刻保持警惕,特别是在处理跨域通信和动态代码执行时,必须实施多层防御措施,才能有效保护用户数据和系统安全。