CORS学习笔记

2019年11月3日 0 作者 y1nhui

0x001 前言

表哥带着挖洞然后发现听不懂他说的名词了,赶快学学hhhh。

0x002 内容

CORS并不是漏洞,但是有漏洞利用CORS

CORS介绍,解释

CORS即跨域资源共享,它可以放宽浏览器的同源策略,通过浏览器来让不同网站,不同服务器之间互相通信。

同源策略

这个我写过文章。过去写的关于同源策略的幼稚文章
看了看文章,发现写的其实有些幼稚可笑,不过写出来的似乎已经够用了。

CORS

同源策略的安全性是很好的,但是对于大型应用来说限制太多了,尤其是他们有很多域名的情况下(:з」∠),于是大佬们想着办法放宽同源策略的限制,其中一种就是CORS。

通过在http头添加字段,来实现CORS机制
于是,web应用A会告诉浏览器,B有权访问自己。这就可以通过相同的描述来定义同源或者跨源操作。

CORS的标准定义:设置http头部字段,让客户端有资格跨域访问资源。通过服务器的验证和授权之后,浏览器有责任支持这些http头部字段并且确保能够正确的施加限制。

其主要的头部字段包含:Access-Control-Allow-Origin3

比如:Access-Control-Allow-Origin:https://www.y1nhui.com
同时请注意,这个值是由服务端返回的,用于告诉浏览器对应域名可以访问,而不是由客户端这边抓包修改发出就可以的(:з」∠)
同时-,被指定了的网站(下称B),就可以作为一个访问者向该服务端(下称A)发送请求并获得数据。

不过如果只是这样的话,B还是没有权限获得A中的用户数据,比如cookie,如果想要获取就需要A的响应包里存在字段:Access-Control-Allow-Credentials: true

利用CORS攻击

利用CORS攻击的前提是存在CORS攻击+CORS存在错误配置。

测试有无CORS

识别

首先我们需要在目标网站上找到开启了CORS的应用,比如API。
因为APi通常会与不同的域进行信息交换,所以一般会配置有CORS机制,同时通常情况下API接口会暴露一些信息收集与信息枚举的功能。
一般情况下,当服务器收到的请求包头带有”Origin”字段时才会开始配置CORS
如:Origin: www.y1nhui
而且,如果客户端收到的响应包头部含有Access-Control-*,并且没有看到定义源的话,可能该源是由请求包中的Origin来定义的。
当我们找到了API后,就可以发送带有Origin的请求包了。可以尝试输入不同的值来确认可选域名,记得送一个NULL进去看看反应是什么,这样应该可以确认是白名单还是黑名单(:з」∠)
如果反应包里面带有了Access-Control-Allow-*,比如Access-Control-Allow-credentials: true那就是该网址被允许了(:з」∠),同时也代表这个API是可以启用CORS的。

分析

找到了可以启用CORS的API当然就是传origin值了,传一下非子域,传一下自己用于攻击的域名看看能否通过。

攻击利用

一个poc

在Access-Control-Allow-Credentials为true时

“Access-Control-Allow-Origin” 值 “Access-Control-Allow-Credentials” 值 是否可利用
https://attack.com true
NULL true
* true

这里不能利用的原因是因为,是不会带出任何用户数据的,但其实也有一种方法可以利用,即结合self-xss打组合拳。

然后如果我们是前两种的话,就可以用我上面给出的poc来打了

不为true时

这个地方已经不是正常人能利用的了,虽然胡子哥在自己的文章走写了方法,但那个方法其实已经不是正常情况下能用出来的了,想看的话我贴出原文
https://xz.aliyun.com/t/2745#toc-16

绕过方法

这个的话,h1上经常见到的方法就是两个:
1.target.com.attack.com
2.target.com.attack.com
注:target.com指被攻击站点,attack.com指用于攻击的站点