同源策略(SOP)的绕过技术详解
字数 1886 2025-12-04 04:16:36
同源策略(SOP)的绕过技术详解
描述
同源策略(Same-Origin Policy,SOP)是浏览器核心安全机制,限制不同源的文档或脚本相互访问资源,防止恶意网站窃取用户数据。其“同源”判定基于协议、域名、端口三者完全一致。但在实际开发中,跨域访问需求频繁,因此衍生出多种SOP绕过技术,其中部分技术可能被滥用导致安全风险。本知识点将系统分析常见绕过技术的原理、应用场景及潜在威胁。
解题过程
-
理解同源策略的限制范围
- 受限操作:
- 读取Cookie、LocalStorage、DOM数据(如通过
iframe.contentDocument)。 - 发起跨域AJAX请求(默认被浏览器拦截)。
- 读取Cookie、LocalStorage、DOM数据(如通过
- 非受限操作:
- 跨域资源嵌入(如
<img>、<script>、<link>标签)。 - 跨域表单提交(但无法读取响应内容)。
- 跨域资源嵌入(如
- 关键点:SOP限制的是“读取”跨域响应,而非“发送”请求。这一特性是多数绕过技术的基础。
- 受限操作:
-
JSONP(JSON with Padding)绕过
- 原理:利用
<script>标签可跨域加载JS文件的特性,服务器返回一段回调函数包裹的JSON数据(如callback({"data": "value"})),客户端预先定义该函数即可处理数据。 - 步骤:
- 客户端动态创建
<script src="https://api.com/data?callback=handleResponse">。 - 服务器返回
handleResponse({"data": "value"})。 - 客户端执行
handleResponse函数获取数据。
- 客户端动态创建
- 风险:若服务器未严格校验回调函数名或内容类型,可能被用于窃取敏感数据(如JSONP劫持)。
- 原理:利用
-
CORS(跨域资源共享)机制滥用
- 原理:通过服务器设置
Access-Control-Allow-Origin响应头授权特定源访问资源。 - 绕过场景:
- 配置错误:若服务器设置
Access-Control-Allow-Origin: *,则任意网站可读取响应。 - 凭证泄漏:若服务器设置
Access-Control-Allow-Credentials: true但未严格限制Origin,攻击者可能通过恶意网站携带用户Cookie发起请求。
- 配置错误:若服务器设置
- 防御关键:服务器需精确校验
Origin头,避免使用通配符*与凭证同时存在。
- 原理:通过服务器设置
-
postMessage通信的恶意利用
- 原理:
window.postMessage允许跨域窗口间安全通信,但若接收方未验证消息来源,可能导致数据泄漏。 - 攻击步骤:
- 恶意网站嵌入合法网站的
iframe。 - 合法网站向所有源发送敏感数据(如
postMessage(data, "*"))。 - 恶意网站监听
message事件获取数据。
- 恶意网站嵌入合法网站的
- 防护:接收方需校验
event.origin,发送方应指定目标源而非*。
- 原理:
-
跨域资源嵌入与CSS侧信道攻击
- 原理:虽然无法直接读取跨域资源内容,但可通过CSS或时序差异推断部分信息。
- 示例:
- CSS注入:通过检测资源加载是否应用特定样式(如字体是否存在)判断用户状态。
- 时序攻击:测量跨域图片加载时间推测用户登录状态(如已登录用户图片缓存加载更快)。
- 局限性:信息获取效率低,需结合其他技术放大影响。
-
域名欺骗与子域控制
- 原理:通过控制父域或子域绕过SOP,因为
document.domain设置允许同父域下的页面将域名修改为一致。 - 案例:
- 若
a.example.com和b.example.com均设置document.domain = "example.com",则可相互访问。 - 攻击者通过子域名接管(如未使用的子域)或XSS父域实现跨域攻击。
- 若
- 防御:严格管理子域解析权限,避免泛解析。
- 原理:通过控制父域或子域绕过SOP,因为
-
浏览器漏洞与历史遗留接口
- 已修复漏洞:如早期IE允许
iframe通过document.domain降级到父域。 - 遗留接口:如
window.name可跨页传递数据(但需同源页面中转),可能被用于数据渗出。 - 现状:现代浏览器已大幅减少此类漏洞,但需保持更新。
- 已修复漏洞:如早期IE允许
总结
SOP绕过技术本质是平衡功能与安全的产物,开发者应严格遵循最小权限原则:
- 服务端:对CORS、JSONP等机制实施细粒度控制。
- 客户端:验证
postMessage来源、避免动态执行不可信脚本。 - 运维端:定期审计域名解析与子域安全。
理解这些技术有助于防御跨域数据泄漏,同时避免在开发中引入不必要的风险。