freeBuf
主站

分类

云安全 AI安全 开发安全 终端安全 数据安全 Web安全 基础安全 企业安全 关基安全 移动安全 系统安全 其他安全

特色

热点 工具 漏洞 人物志 活动 安全招聘 攻防演练 政策法规

点我创作

试试在FreeBuf发布您的第一篇文章 让安全圈留下您的足迹
我知道了

官方公众号企业安全新浪微博

FreeBuf.COM网络安全行业门户,每日发布专业的安全资讯、技术剖析。

FreeBuf+小程序

FreeBuf+小程序

CORS攻击概述
2018-12-05 15:35:05
所属地 湖南省



原创: 慌得一批 = 合天智汇 


0x01.CORS简介

CORS是一个W3C标准,全称是"跨域资源共享"(Cross-originresource sharing)。

出于安全原因,浏览器限制从脚本中发起的跨域HTTP请求。默认的安全限制为同源策略,即JavaScript或Cookie只能访问同域下的内容。

而CORS允许浏览器向跨源服务器,发出XMLHttpRequest请求,从而克服了AJAX只能同源使用的限制。

0x02.分类

CORS请求分成两类:简单请求(simplerequest)和非简单请求(not-so-simplerequest)

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

(1)请求方法是HEAD,GET,POST之一

(2)HTTP的头信息不超出以下几种字段。

Accept

Accept-Language

Content-Language

Last-Event-ID

Content-Type:(只限于三个值application/x-www-form-urlencoded、multipart/form-data、text/plain)

凡是不同时满足上面两个条件,就属于非简单请求。

对于简单请求,浏览器直接发出CORS请求。具体来说,就是在头信息之中,增加一个Origin字段。

如果Origin指定的源,不在许可范围内,服务器会返回一个正常的HTTP回应。如果回应的头信息没有包含Access-Control-Allow-Origin字段,浏览器就会抛出一个错误,被XMLHttpRequest的onerror回调函数捕获。注意,这种错误无法通过状态码识别,因为HTTP回应的状态码有可能是200。

如果Origin指定的域名在许可范围内,服务器返回的响应,会多出几个以Access-Control-开头的字段。

其中最重要的两个是Access-Control-Allow-Origin和Access-Control-Allow-Credentials

Access-Control-Allow-Origin是必须的,它表示可接受跨域的域名

Access-Control-Allow-Credentials是可选的。它的表示是否允许发送Cookie或其他凭据

这里要敲重点了,通常是由于Access-Control-Allow-Origin配置不当从而引发导致跨域问题。

对于非简单CORS请求,会在正式通信之前,增加一次HTTP查询请求,称为预检请求(preflight)

一旦服务器通过了预检请求,以后每次浏览器正常的CORS请求,就都跟简单请求一样

0x03.CORS漏洞测试

通常,当服务器收到头部带有Origin字段的请求的时候才会配置CORS

所以我们需要发送头部带有Origin的数据包来进行测试

curlhttps://api.artsy.net -H "Origin: http://bbb.com" -I

HTTP/1.1200 OK

Access-Control-Allow-Credentials:true

Access-Control-Allow-Origin:http://bbb.com

....

可以看到Access-Control-Allow-Origin返回的是我们的Origin值

这便意味着可以接受来自http://bbb.com的跨域请求

那很明显这个站点就存在CORS漏洞了

如果http://bbb.com是我们控制的一个网站或者该网站有XSS等漏洞我们便可以利用该漏洞对https://api.artsy.net进行CORS攻击

首先讲恶意js植入http://bbb.com当用户访问时js便在不知不觉中发起跨域请求窃取用户在https://api.artsy.net上的敏感信息或进行敏感操作

利用:

<script type="text/javascript">
var xhr = new XMLHttpRequest();
xhr.onreadystatechange = function() {
if(xhr.readyState === 4) {
console.log(xhr.responseText);
}
}
xhr.open("GET", " https://api.artsy.net ");
xhr.send();
</script>

首先将以上代码保存为1.html

然后用游览器打开1.html并打开控制台


图片.png

这里可以我们可以看到游览器成功的进行了一次跨域请求

控制台输出了https://api.artsy.net的源代码

所以如果https://api.artsy.net包含了用户的敏感信息或进行敏感操作那就可以被攻击者读取到,之后可以再用XMLHttpRequest发送到攻击者的服务器上

可能有的同学就要抬杠了,直接这样请求不是挺正常么

那我们现在把https://api.artsy.net换成https://www.baidu.com看看

很明显,游览器不会让我们这么干

图片.png

因为服务器没有返回CORS头,游览器就不会进行跨域请求

0x04防御

(1)如果没有必要就不要开启CORS

(2)严格限制域白名单,而不是使用*

(3)尽量避免使用Access-Control-Allow-Credentials



# 合天智汇 # 合天网安
本文为 独立观点,未经授权禁止转载。
如需授权、对文章有疑问或需删除稿件,请联系 FreeBuf 客服小蜜蜂(微信:freebee1024)
被以下专辑收录,发现更多精彩内容
+ 收入我的专辑
+ 加入我的收藏
相关推荐
  • 0 文章数
  • 0 关注者