高级CORS利用技术分享

前言

在正式开始分享我的内容前,我要极力推荐大家去看下Linus Särud和Bo0oM发表的两篇,关于Safari特殊字符处理被滥用,导致XSS或Cookie注入的研究文章。

https://labs.detectify.com/2018/04/04/host-headers-safari/ https://lab.wallarm.com/the-good-the-bad-and-the-ugly-of-safari-in-client-side-attacks-56d0cb61275a

背景

去年的11月份,我曾在Yahoo View上发布了一篇关于,滥用Safari特殊字符处理绕过跨源资源共享的文章。之后我又进行了更加深入的研究,并发现了更多的可被利用的点,以及一些更为高级的利用技术。因此作为补充,我决定将更为先进的技术分享给大家!

注:

本文假定你对CORS是什么?以及如何利用其错误配置?已有基本的了解。这里有两篇关于CORS错误配置利用的文章,建议大家去看下:

Portswigger’s Post Geekboy’s post

背景:DNS&浏览器:

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

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

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

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

例如

浏览器?

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

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

例如

Chrome:

Firefox:

Safari:

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

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

CORS配置

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

示例#1:

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

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

示例#2:

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

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

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

分解:

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

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

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

https://hackerone.com/reports/168574

示例#3:

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

你能发现问题吗?

分解:

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

价值百万美元的问题:

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

以下面的Apache配置为例:

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

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

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

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

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

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

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

利用

先决条件:

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

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

[+] serve.js

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

[+] cors.html

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

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

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

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

实际测试

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

TheftFuzzer介绍:

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

结语

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

Corben Leo

https://twitter.com/hacker_ https://hackerone.com/cdl https://bugcrowd.com/c https://github.com/sxcurity

*参考来源:sxcurity,FB小编 secist 编译,转载请注明来自FreeBuf.COM

原文发布于微信公众号 - FreeBuf(freebuf)

原文发表时间:2018-07-01

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏阿凯的Excel

Python读书笔记(Python软件的安装)

小编最近一直在思考如何解决Excel的大数据分析的问题,为了解决该问题,小编决定开始学习Python!会在每周看心情分享自己的所学~ 是学习笔记哦!不是教学文...

3774
来自专栏网站漏洞修补

DedeCMS V5.7sp2网站漏洞如何修复

织梦dedecms,在整个互联网中许多企业网站,个人网站,优化网站都在使用dede作为整个网站的开发架构,dedecms采用php+mysql数据库的架构来承载...

2351
来自专栏陈树义

面对海量请求,缓存设计还应该考虑哪些问题?

1113
来自专栏Golang语言社区

golang插件化方案

业务线的活动,每一次新活动都做独立项目开发,有大量重复代码,并且浪费数据服务的连接资源;排序服务也许要经常添加业务代码,目前是停服务发布……这些场景为了开发维护...

2363
来自专栏枕边书

代码迁移之旅(二)- 渐进式迁移方案

说在前面 这是代码迁移的第二篇文章,也是最后一篇了,由于个人原因,原来的迁移我无法继续参与了,但完整的方案我已经准备好了,在测试环境也已经可以正常进行了。 上篇...

2369
来自专栏数据和云

Linux 内存中的Cache,真的能被回收么?

编辑手记:很多人都认为,Linux中buffers和cached所占用的内存空间是可以在内存压力较大的时候被释放当做空闲空间用的。但真的是这样么?今天我们重新来...

49511
来自专栏Java成神之路

【转】JAVA之网络编程

网络编程对于很多的初学者来说,都是很向往的一种编程技能,但是很多的初学者却因为很长一段时间无法进入网络编程的大门而放弃了对于该部分技术的学习。

1797
来自专栏编程

Python多线程怎样优雅的响应中断异常

最近需求做完没什么事干,就爬了点知乎的话题数据,用到了多个线程。遇到一个问题: 当我们手动时,怎样把子线程都停掉呢? 先说几个知识点: Ctrl+C 引起的任意...

3127
来自专栏影子

一张图解析 编译器编译流程

39615
来自专栏跟着阿笨一起玩NET

如何防止你的UI出现了假死吗?

如果应用程序在UI线程上执行非UI线程的耗时处理时,会使应用程序界面的运行显得缓慢而迟钝,有时会出现应用程序“UI界面假死”的现象,这也会引起用户的不满。

860

扫码关注云+社区

领取腾讯云代金券