「 典型安全漏洞系列 」10.跨域资源共享CORS漏洞详解

news2025/1/19 11:36:41

跨域资源共享(Cross-origin Resource Sharing,CORS)是一种浏览器机制,可以对于给定域之外的资源进行受控访问。它扩展并增加了同源政策(Same-origin Policy,SOP)的灵活性。然而,如果网站的CORS策略配置和实施不当,它也可能引发跨域攻击。为了更好的理解CORS漏洞,在介绍CORS漏洞之前,我们先了解下什么是同源策略(SOP)。

在这里插入图片描述

1. 同源策略(SOP)

同源策略(Same-origin Policy,SOP)是浏览器的一种安全机制,旨在防止网站相互攻击。同源策略规定跨域之间的脚本是隔离的,一个域的脚本不能访问/操作另一个域的绝大部分属性和方法。

同源策略限制一个源上的脚本访问另一个源的数据。一个源包括一个URI协议、域名和端口号。例如,考虑以下URL:

http://normal-website.com/example/example.html

这使用 http 协议、域名 normal-website.com 和端口号 80 。下表显示了如果上述URL中的内容试图访问其他来源,将如何应用同源策略:

URL是否允许访问?
http://normal-website.com/example/是:相同的协议、域名和端口
http://normal-website.com/example2/是:相同的协议、域名和端口
https://normal-website.com/example/否:不同的协议和端口
http://en.normal-website.com/example/否:不同的域名
http://www.normal-website.com/example/否:不同的域名
http://normal-website.com:8080/example/否:不同端口*

2. 跨域资源共享CORS

2.1. CORS概念

跨域资源共享(Cross-origin Resource Sharing,CORS)是一种浏览器机制,可以对于给定域之外的资源进行受控访问。它扩展并增加了同源政策(Same-origin Policy,SOP)的灵活性。以下介绍了与CORS相关的HTTP请求头和响应头字段:

请求头说明
Origin表明预检请求或实际请求的源站URI,不管是否跨域,Origin字段总是会发送
Access-Control-Request-Method将实际请求所使用的HTTP方法告诉服务器
Access-Control-Request-Headers将实际请求所携带的头部字段告诉服务器
响应头说明
Access-Control-Allow-Origin指定允许访问该资源的外域URI,对于携带身份凭证的请求不要使用通配符
Access-Control-Expose-Headers指定XMLHttpRequest的getResponseHeader可以访问的响应头
Access-Control-Allow-Credentials是否允许浏览器读取response的内容;
当用在preflight预检请求的响应中时,指定实际的请求是否可使用credentials
Access-Control-Allow-Headers指明实际请求所允许使用的头部字段
Access-Control-Allow-Methods指明实际请求所允许使用的HTTP方法
Access-Control-Max-Age指明preflight请求的结果能够被缓存多久

Java实现举例:

response.setHeader('Access-Control-Allow-Origin','*')  //设置所有的请求地址都允许跨域
response.setHeader('Access-Control-Allow-Origin','http//127.0.0.1:5100')  //只有127.0.0.1:5100允许跨域
response.setHeader('Access-Control-Allow-Origin-Method','*') //设置所有的请求方法都允许跨域

2.2. CORS漏洞原理

如果网站的CORS策略配置和实施不当,它可引发跨域攻击。常见的CORS配置问题如下:

  • Origin校验错误
  • 信任null
  • HTTPS域信任HTTP域
  • 信任自身全部子域
  • Origin:*Credentials:true共用

3. 攻击步骤

  • 1)探索站点是否支持CORS头
  • 2)探索站点对Origin头的校验及绕过方法
  • 3)探索信任子域是否有XSS漏洞
  • 4)构造获取敏感信息的PoC

4. 漏洞防御

CORS漏洞主要是由于配置错误引起的。因此,预防是一个配置问题。以下介绍了针对CORS攻击的一些有效防御措施:

  • 正确配置跨域请求:如果web资源包含敏感信息,则应在 Access-Control-Allow-Origin` 标头中正确指定来源。
  • 不要将空值列入白名单:避免使用标头 Access-Control-Allow-Origin: null 。来自内部文档和沙盒请求的跨域资源调用可以指定 null 来源。对于私有服务器和公共服务器的可信来源,应该正确定义CORS头。
  • 仅允许受信任的站点Access-Control-Allow-Origin 标头中指定的来源应该仅是受信任的站点。
  • **避免在内部网络中使用通配符* **:当内部浏览器可以访问不受信任的外部域时,仅信任网络配置来保护内部资源是不够的。
  • CORS不能替代服务器安全策略:攻击者可以直接伪造来自任何可信来源的请求。因此,除了正确配置的CORS外,web服务器还应继续对敏感数据应用保护,如身份验证和会话管理。

推荐阅读:
「 典型安全漏洞系列 」09.权限提升漏洞详解
「 典型安全漏洞系列 」08.文件上传漏洞详解
「 典型安全漏洞系列 」07.OS命令注入详解
「 典型安全漏洞系列 」06.路径遍历(Path Traversal)详解
「 典型安全漏洞系列 」05.XML外部实体注入XXE详解
「 典型安全漏洞系列 」04.服务器端请求伪造SSRF详解
「 典型安全漏洞系列 」03.跨站请求伪造CSRF详解
「 典型安全漏洞系列 」02.SQL注入详解
「 典型安全漏洞系列 」01.跨站脚本攻击XSS详解

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1572030.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

蓝鲸6.1 CMDB 事件推送的开源替代方案

本文来自腾讯蓝鲸智云社区用户:木讷大叔爱运维 背景 在蓝鲸社区“社区问答”帖子中发现这么一个需求: 究其原因,我在《不是CMDB筑高墙,运维需要一定的开发能力!》一文中已经介绍,在此我再简单重复下&#…

吴恩达机器学习笔记:第 6 周-11机器学习系统的设计(Machine Learning System Design)11.1-11.5

目录 第 6 周 11、 机器学习系统的设计(Machine Learning System Design)11.1 首先要做什么11.2 误差分析11.3 类偏斜的误差度量11.4 查准率和查全率之间的权衡11.5 机器学习的数据 第 6 周 11、 机器学习系统的设计(Machine Learning System Design) 11.1 首先要做什么 在接…

Docker简单介绍、特点、与虚拟机技术的区别、核心概念及在CentOS 7 中安装卸载Docker

目录 一、什么是Docker 二、特点 三、Docker与虚拟机技术的区别 四、Docker的核心概念 Docker仓库与仓库注册服务器的区别 五、CentOS7在线安装Docker 安装配置 卸载 一、什么是Docker Docker是一个开源的容器化平台,用于打包、部署和运行应用程序。它利用…

移动端适配方案总结之vw

1、vw/vh是什么? vw是:viewport width 视口宽度单位 vh是: viewport height 视口高度单位 实际开发中我们基本用vw; 2.相对视口的尺寸计算结果 1vw 1/100视口宽度 1vh 1/100视口高度 例如: 当前屏幕视口是 375像素…

聚类算法的先验基础知识

聚类算法的先验基础知识 1. 瑞利商2. 谱定理3. 联合概率4. 条件概率分布5. 边缘分布6. 贝叶斯定理7. 有向图8. 拉格朗日乘子定理 下一篇将介绍整理各种聚类算法,包括k-means,GMM(Guassian Mixture Models, 高斯混合),EM(Expectation Maximiza…

如果真的要被优化了,你该如何提前应对与准备!

程序员35岁会失业吗? 35岁被认为是程序员职业生涯的分水岭,许多程序员开始担忧自己的职业发展是否会受到年龄的限制。随着科技的飞速发展,IT行业成为了变化最为迅速的领域之一。在这样的背景下,许多35岁左右的程序员开始担忧自己…

Android数据存储技术

一、文件存储 <LinearLayout xmlns:android"http://schemas.android.com/apk/res/android"android:orientation"vertical"android:layout_width"match_parent"android:layout_height"match_parent" ><EditTextandroid:id&qu…

【C++】c++11新特性(一)

目录 { }列表初始化 内置类型---对单值变量及数组的初始化 列表初始化时进行的类型转换 自定义类型---对类对象或结构的初始化 initializer_list 1. 定义接受 initializer_list 参数的构造函数 2. 在函数中使用 initializer_list 参数 3. 使用 initializer_list 与 vect…

C#将Console写至文件,且文件固定最大长度

参考文章 将C#的Console.Write同步到控制台和log文件输出 业务需求 在生产环境中&#xff0c;控制台窗口不便展示出来。 为了在生产环境中&#xff0c;完整记录控制台应用的输出&#xff0c;选择将其输出到文件中。 但是&#xff0c;一次性存储所有输出的话&#xff0c;文件会…

基于SSM+Jsp+Mysql的二手车交易网站

开发语言&#xff1a;Java框架&#xff1a;ssm技术&#xff1a;JSPJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包…

5G智慧地铁数字孪生可视化平台,推进铁路行业数字化转型

随着科技的快速发展&#xff0c;5G智慧地铁数字孪生可视化平台正逐渐成为铁路行业数字化转型的重要推动力。巨蟹数科数字孪生平台集成了5G通信技术、大数据分析、云计算和人工智能等先进技术&#xff0c;通过构建数字孪生模型&#xff0c;实现对地铁运营全过程的实时监控、预测…

【智能排班系统】基于SpringSecurity实现登录验证、权限验证

文章目录 SpringSecurity介绍sss-security实现依赖工具类Jwt工具JSON响应工具加密工具类 用户上下文用户信息实体类用户上下文 自定义重写自定义无权限的报错自定义密码加密自定义用户类 过滤器登录过滤器权限过滤器 Service登录Service 配置类说明登录验证权限验证IP流量限制 …

JDK安全剖析之安全处理入门

0.前言 Java 安全包括大量 API、工具以及常用安全算法、机制和协议的实现。Java 安全 API 涵盖了广泛的领域&#xff0c;包括加密、公钥基础设施、安全通信、身份验证和访问控制。Java 安全技术为开发人员提供了编写应用程序的全面安全框架&#xff0c;还为用户或管理员提供了…

蓝桥集训之斐波那契数列

蓝桥集训之斐波那契数列 核心思想&#xff1a;矩阵乘法 将原本O(n)的递推算法优化为O(log2n) 构造1x2矩阵f和2x2矩阵a 发现f(n1) f(n) * a 则f(n1) f(1) * an可以用快速幂优化 #include <iostream>#include <cstring>#include <algorithm>using na…

跨站请求伪造漏洞(CSRF)

什么是CSRF CSRF&#xff08;Cross-Site Request Forgery&#xff09;&#xff0c;也被称为 one-click attack 或者 session riding&#xff0c;即跨站请求伪造攻击。 漏洞原理 跨站请求伪造漏洞的原理主要是利用了网站对用户请求的验证不严谨。攻击者会在恶意网站中构造一个…

RAG知识分享

文章目录 博客详细讲解视频点击查看高清脑图 1.为什么要做RAG1.1. 解决幻觉问题1.1.1 直接输入问题1.1.2. 问题 相关知识 2. 什么是RAG2.1. 基本概念2.2. 基本RAG方法2.2.1. 知识预处理2.2.2. 知识检索2.2.3. 答案生成 3. RAG 与 Long Context3.1. Long Context3.2. RAG 与Lon…

你为什么选择程序员这个职业?

注意&#xff0c;今天的这篇文章&#xff0c;我只是对程序员这份工作所需要面对的问题挑选一些有意思的话题讲讲我的理解&#xff0c;并不是对程序员的职业规划进行分享。本文分为入行前和入行后两个部分&#xff0c;分别聊聊。 入行前 所谓入行前&#xff0c;其实就是指还是学…

力扣面试150: O(1) 时间插入、删除和获取随机元素 HashMap结合数组

Problem: 380. O(1) 时间插入、删除和获取随机元素 文章目录 思路复杂度Code 思路 &#x1f469;‍&#x1f3eb; 三叶题解 复杂度 时间复杂度: O ( 1 ) O(1) O(1) 空间复杂度: O ( n ) O(n) O(n) Code class RandomizedSet {static int[] nums new int[200_010];//存…

RabbitMQ小记

参考书籍&#xff1a;朱忠华的《RabbitMQ实战指南》 一、基础概念 1.Exchange 1.1 创建方法的参数&#xff0c;exchangeDeclare() exchange&#xff1a;交换器的名称type&#xff1a;交换器的类型durable&#xff1a;是否持久化&#xff0c;true代表持久化。&#xff08;持…

iperf图形化打流工具JPerf2.0使用教程(1):相关设置介绍

0 前言 iperf是一个很常用的网络性能测试工具&#xff0c;经常来进行打流测试&#xff0c;用来查看丢包率、抖动时间等网络通信情况&#xff0c;但它是使用命令行操作的&#xff0c;使用起来不太友好。本文介绍基于iperf的图形化操作工具JPerf2.0。 1 JPerf2.0的客户端和服务…