漏洞系列之——CORS配置错误

本文探讨了CORS配置错误导致的安全隐患,重点介绍了允许任意来源请求、未授权凭据暴露及通配符来源等问题,以及如何通过精确设置Access-Control-Allow-Origin和Credentials来防止这类攻击。漏洞修复建议提供了一套最佳实践方法。

漏洞描述

CORS 错误配置。允许攻击者代表用户发出跨源请求,因为应用程序没有将 Origin 标头列入白名单并且具有 Access-Control-Allow-Credentials: true 意味着我们可以使用受害者的凭据从攻击者的站点发出请求。

漏洞等级

高危

漏洞危害

那么,CORS的漏洞到底出现在哪里呢?

1:CORS服务端的 Access-Control-Allow-Origin 设置为了 *,并且 Access-Control-Allow-Credentials 设置为false,这样任何网站都可以获取该服务端的任何数据了。

2:有一些网站的Access-Control-Allow-Origin他的设置并不是固定的,而是根据用户跨域请求数据的Origin来定的。这时,不管Access-Control-Allow-Credentials 设置为了 true 还是 false。任何网站都可以发起请求,并读取对这些请求的响应。意思就是任何一个网站都可以发送跨域请求来获得CORS服务端上的数据。

(1)Access-Control-Allow-Origin

该字段是必须的。它的值要么是请求时Origin字段的值,要么是一个*,表示接受任意域名的请求。

(2)Access-Control-Allow-Credentials

该字段可选。它的值是一个布尔值,表示是否允许发送Cookie。默认情况下,Cookie不包括在CORS请求之中。设为true,即表示服务器明确许可,Cookie可以包含在请求中,一起发给服务器。这个值也只能设为true,如果服务器不要浏览器发送Cookie,删除该字段即可。

(3)Access-Control-Expose-Headers

该字段可选。CORS请求时,XMLHttpRequest对象的getResponseHeader()方法只能拿到6个基本字段:Cache-Control、Content-Language、Content-Type、Expires、Last-Modified、Pragma。如果想拿到其他字段,就必须在Access-Control-Expose-Headers里面指定。上面的例子指定,getResponseHeader('FooBar')可以返回FooBar字段的值。

Origin: https://evil.com
Access-Control-Allow-Credential: true
Access-Control-Allow-Origin: https://evil.com 或者 Access-Control-Allow-Origin: null

Access-Control-Allow-Origin:   允许进行跨域请求的域名
Access-Control-Allow-Methods:  允许进行跨域请求的方式
Access-Control-Allow-Headers:  允许进行跨区请求的头部

易受攻击的示例:

Null Origin

服务器可能没有反映完整的Origin标头,但null允许来源。这在服务器的响应中看起来像这样:

GET /endpoint HTTP/1.1
Host: victim.example.com
Origin: null
Cookie: sessionid=... 

HTTP/1.1 200 OK
Access-Control-Allow-Origin: null
Access-Control-Allow-Credentials: true 
没有凭据的通配符来源

如果服务器以通配符来源响应*,则浏览器永远不会发送 cookie。但是,如果服务器不需要身份验证,仍然可以访问服务器上的数据。这可能发生在无法从 Internet 访问的内部服务器上。然后,攻击者的网站可以转入内部网络,无需身份验证即可访问服务器的数据。

 *是唯一的通配符来源
https: //*.example.com无效

GET / endpoint HTTP / 1.1 
Host: api.internal.example.com 
Origin: https: // evil.com
 
HTTP / 1.1  200 OK 
Access - Control - Allow - Origin: *
扩展源/正则表达式问题

有时,原始来源的某些扩展不会在服务器端过滤。这可能是由于使用错误实现的正则表达式来验证原始标头造成的。

在这种情况下,任何插入在前面的前缀都example.com将被服务器接受。

GET /endpoint HTTP/1.1
Host: api.example.com
Origin: https://evilexample.com

HTTP/1.1 200 OK
Access-Control-Allow-Origin: https://evilexample.com
Access-Control-Allow-Credentials: true 

漏洞修复方案

(最理想的)
Access-Control-Allow-Origin: https://attacker.com
Access-Control-Allow-Credentials: true
### CORS漏洞概述 跨域资源共享(Cross-Origin Resource Sharing, CORS)是一种基于HTTP头部的安全机制,用于控制Web应用程序从一个源加载资源到另一个源的行为。当浏览器尝试访问不同源上的资源时,它会通过预检请求(OPTIONS方法)来验证目标服务器是否允许该操作[^3]。 如果CORS配置不当,则可能导致敏感数据泄露或其他安全风险。例如,在某些情况下,服务器可能错误地设置了`Access-Control-Allow-Origin:*`,这使得任何网站都可以无限制地获取其资源[^2]。 ### SRC属性与CORS漏洞的关系 SRC通常指的是企业设立的安全应急响应中心(Security Response Center),鼓励研究人员提交发现的漏洞信息以便及时修补。在涉及多媒体文件处理的应用场景中,比如HTML `<video>`标签嵌入视频流并绘制至Canvas上时遇到的问题表明WebKit内核下的Safari浏览器存在特定限制——即不支持带有跨域设置(`crossorigin`)参数的<video>元素被渲染进<canvas>[^1]。这种行为虽然本身不是直接意义上的“漏洞”,但如果开发者未充分理解这些差异性实现细节就容易引发潜在隐患。 另外需要注意的是,并非所有类型的跨站攻击都能单纯依靠调整CORS策略解决;对于更复杂的交互型XSS等问题仍需综合运用多种防护手段如Content Security Policy(CSP)等加以防范[^4]。 ### 安全问题分析 #### 数据暴露 最典型的例子就是API接口开放了不必要的权限范围给第三方调用者,从而造成用户隐私资料外泄等情况发生。假如某个电商系统的购物车状态查询服务仅限同域名下调取却因疏忽设定了通配符形式(*), 那么恶意站点便能够轻易读取出当前访客所选商品清单等内容。 #### 功能滥用 除了简单的信息公开之外还存在着更为严重的威胁情形—非法操控业务逻辑流程。设想一下在线支付平台为了方便移动客户端集成而提供了免密小额转账功能入口却没有做好身份认证校验工作的话,一旦遭到伪造请求就会带来资金损失后果不堪设想! ### 解决方案建议 针对上述提到的各种可能性危害因素可以从以下几个方面着手改进: - **精确指定可信任来源**: 将具体的URL地址列入白名单而非采用泛化表达方式; - **实施严格的HTTPS加密传输协议** : 确保整个通信链路全程处于SSL/TLS保护之下防止中间人劫持篡改报文内容; 以下是关于如何正确配置Nginx反向代理以启用适当级别的安全性措施的一个简单示例: ```nginx server { listen 80; server_name example.com; location /api/ { proxy_pass http://backend_server/; add_header 'Access-Control-Allow-Origin' 'https://trusted-site.example'; add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS'; add_header 'Access-Control-Allow-Headers' 'Authorization'; if ($request_method = 'OPTIONS') { return 204; } } } ``` 此代码片段展示了怎样限定单一可信站点访问的同时也允许必要的自定义首部字段传递过去完成身份验证等功能需求.
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

征__程

多动手,避免老年痴呆,活跃身心

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值