记录cors认证过程-关于渗透

  • Post author:
  • Post category:其他


一、CORS本质

CORS (跨源资源共享) 是一种认证机制,是 W3C (万维网联盟) 推荐的一种用于跨域资源访问的安全策略。

二、源与同源策略

CORS 中的源指的是某个URL中的协议、域名和端口,由这三个元素标识一个唯一的源,如 http://localhost:8080 和 https://localhost:8000 是不同的源,因为它们的协议和端口都不同。

源也可以宽泛地理解为一个 Web站点,通常我们访问一个网站的时候,加载的静态资源通常都是站内的。

三、CORS分类

1、简单请求

HEAD、GET、POST类型

且HTTP头信息不超出以下几种字段

Accept

Accept-Language

Content-Language

Last-Event-ID

Content-Type,但仅能是下列之一

application/x-www-form-urlencoded、multipart/form-data、text/plain

简单请求的发送HTTP头当中要求总是包含一个域(Origin)的信息。该域包含协议名、地址以及一个可选的端口。不过这一项实际上由浏览器代为发送,并不是开发者代码可以触及到的。(疑问没搞清楚的情况:简单请求下,谷歌浏览器头部有些时候会自动填充Origin字段有时候不会填充)

简单请求的部分响应头:Access-Control-Allow-Origin(必含)、Access-Control-Allow-Credentials(可选)Access-Control-Expose-Headers(可选)。

2、复杂请求

任何一个不满足上述要求的请求,即被认为是复杂请求。一个复杂请求不仅有包含通信内容的请求,同时也包含预请求,以OPTIONS形式发送,此时作为服务端,也需要返回”预回应”作为响应。预请求实际上是对服务端的一种权限请求,只有当预请求成功返回,实际请求才开始执行。

四、实现CORS相关的几个Header

Origin

当浏览器检测到某个请求要访问跨域资源时,会在请求头中加上Origin,Origin 通常就是从 Referer 字段中截取协议、域名和端口相关的信息,用于表示请求的来源站点,用来说明请求从哪里发起的,包括,且仅仅包括协议和域名。这个参数一般只存在于CORS跨域请求中,可以看到response有对应的header:Access-Control-Allow-Origin。

Referer

告知服务器请求的原始资源的URI,其用于所有类型的请求,并且包括:协议+域名+查询参数(注意,不包含锚点信息)。因为原始的URI中的查询参数可能包含ID或密码等敏感信息,如果写入referer,则可能导致信息泄露。

Access-Control-Allow-Origin

如果服务器支持CORS的话,会在响应头中加上这个字段,表示服务器信任的源,当值为 “*”时,表示服务器的资源信任所有的源;浏览器发起CORS请求后也会检查这个字段,如果响应头中没有这个字段或者不信任源,都会在控制台报错。

Access-Control-Allow-Methods

发起跨域请求时允许的HTTP方法,由逗号分隔如GET,OPTIONS表示只能通过这些方法发起跨域请求,其他 DELETE,PUT,POST等可能改变资源的方法会被拒绝

Access-Control-Allow-Credentials

该项标志着请求当中是否包含cookies信息,只有一个可选值:true(必为小写)。如果不包含cookies,请略去该项,而不是填写false。

五、CORS实现

从以上介绍的几个CORS相关的Header也可以看出,CORS的实现需要客户端(浏览器)和服务端的协同配合:

1.浏览器要支持在发起跨域请求时附加 Origin 头,并在响应返回时检查 Access-Control-Allow-Origin 等头部,判断服务端是否支持或允许该跨域请求。现代的浏览器基本都支持CORS。

2.服务端要在响应中设置 Access-Control-Allow-Origin 等响应头,表示自己支持CORS,并声明自己的安全策略。

六、关于cors的csrf攻击流程

如put传参(允许跨站):

触发攻击者csrf—–浏览器发送options认证协议(浏览器带上Origin字段自动填充为null)——服务器返回(返回状态码200ok、Access-Control-Allow-Origin允许)——浏览器发送put传参内容

如put传参(不允许跨站):

触发攻击者csrf—–浏览器发送options认证协议(浏览器带上Origin字段自动填充为null)——服务器返回(返回非200ok或Access-Control-Allow-Origin不允许)——浏览器报错不发送put传参内容

七、关于cors的csrf漏洞

1.对于简单请求可直接构造csrf跨站;

2.对于其他传参如delete、put、update等复杂请求,如服务端允许不同域访问,及Origin字段值为任意值,可构造csrf跨站;

3.可通过其他方式向浏览器安装插件或者利用浏览器某漏洞,将认证协议options返回字段Access-Control-Allow-Origin篡改为*,骗过浏览器绕过验证直接发送请求包。



版权声明:本文为SmileAndFun原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。