介绍
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
表明系统请求第三方域。
风险分析
通过此漏洞,攻击者可以在页面中嵌入跨域请求,用户访问链接,执行了跨域请求,从而攻击目标,比如访问了内网敏感资源,还可以劫持用户的会话。
安全建议
- 不使用通配符来请求任意域。
- 使用白名单信任域。
- 严格校验Origin字段的值。
- https网站不要信任http域。
- 不要信任全部自身子域,减少攻击面。