Cors跨域资源请求详解

介绍

Cors全称为“跨域资源共享”(Cross-origin resource sharing),是一个W3C标准,一种浏览器机制,可实现对位于应用程序域之外的资源的受控访问,对你的应用来源(域)之外的资源(比如图像或字体)的请求称为跨域请求。那么为什么会出现Cors呢,首先要了解到同源策略,同源策略(Sameoriginpolicy)简称SOP,是一种约定,同源策略限制了网站与源域(来源)以外的资源进行交互的能力,每当跨不同来源 (域)发出请求而没有跨来源配置时,服务器将报告错误。而Cors就是通过特定机制的筛选来实现浏览器认为安全的跨域请求。

原理

跨域请求是使用标准http请求方法发出的。大多数服务器允许GET请求,这意味着他们将允许来自外部来源(例如网页)的资源读取其资产。拒绝http请求方法(例如PATCH,PUT或DELETE),以避免发生冲突,但是,如果网站的Cors策略配置和实施不当,他也可能会导致基于跨域的攻击。cors并不是针对跨域攻击(例如跨站点请求伪造csrf)的保护措施。请求类型分为简单请求非简单请求(需预检请求)。

简单请求

1.请求方式为使用下列方法之一

GET
POST
HEAD

2.HTTP头不超出下列几种字段

Accept
Accept-Language
Content-Language
Lat-Event-ID
Content-Type

非简单请求(预检请求)

1.请求方式不是下列方法

GET
POST
HEAD
PUT
EDLETE

2.请求设置了指定的的header字段,Content-Type绝大多数是application/json

3.POST请求的Content-Type并非application/x-www-form-urlencoded, multipart/form-data, 或text/plain

当请求为简单请求时,浏览器会直接发送cors请求,在请求包header中加入origin请求头字段,origin字段代表请求时从那个源发出来的,请求时浏览器在请求头的origin中说明请求的源,服务器检验是否来自该源,如果检验成功,就会允许该源跨域请求,就会在响应包中添加三个字段:

Access-Control-Allow-Origin(必须有)
代表允许哪个域访问。当字段值为*时,就代表任意域都可以访问,这样,就导致了Cors漏洞的产生。
Access-Control-Allow-Credentials(非必须)
该字段与简单请求时的含义相同。
Access-Control-Expose-Headers(非必须)
如果浏览器请求包括Access-Control-Request-Headers字段,则Access-Control-Allow-Headers字段是必需的。它也是一个逗号分隔的字符串,表明服务器支持的所有头信息字段,不限于浏览器在"预检"中请求的字段。

漏洞复现

项目站,原谅重码。。。

在请求头中加入:Origin: https://hack.com

系统返回数据:Access-Control-Allow-Origin: https://hack.com

表明系统请求第三方域。

 

风险分析

通过此漏洞,攻击者可以在页面中嵌入跨域请求,用户访问链接,执行了跨域请求,从而攻击目标,比如访问了内网敏感资源,还可以劫持用户的会话。

安全建议

  1. 不使用通配符来请求任意域。
  2. 使用白名单信任域。
  3. 严格校验Origin字段的值。
  4. https网站不要信任http域。
  5. 不要信任全部自身子域,减少攻击面。
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值