CORS漏洞的学习与分析
同源策略
同源策略(Same origin policy)是一种约定,一种非常重要的安全措施,也是最基本的安全功能,它禁止了来自不同源的脚本对当前页面的读取或修改,从而限制了跨域访问甚至修改资源,防止出现A页面可以随意更改B页面信息这样子的极其糟糕的情况发生。
同源策略做了怎样的限制呢?怎样才会被认为是跨域的,不同源的呢?
以http://www.a.com为例:
| 正常情况 | http://www.a.com | 允许 |
| 不同域名 | http://www.b.com | 不允许 |
| 不同协议 | https://www.a.com | 不允许 |
| 不同端口 | http://www.a.com:10 | 不允许 |
| 不同子域名 | http://bp.a.com | 不允许 |
值得注意是:同源策略是在浏览器实现的所以它无法阻止请求和响应的发送,当跨域请求发起后,实际上已经接收到了所请求的资源,如果我们拦截来响应包,就可以发现,所请求的资源已经包含在响应的包中了,浏览器发现跨域,根据同源策略,浏览器不让所请求的资源加载出来。
hack.com将从test.com上请求数据

发现浏览器遵守同源策略阻止了跨域读取的资源的加载,那么这些想读取的资源究竟是根本就没有发送还是已经发送了却被浏览器给禁止加载了呢?

可以很明显的看出,已经接收了所请求的资源,但因为不同源被浏览器拦截了。
CORS是什么?
随着时代的发展,技术的进步,新的需求逐渐产生。人们开始有了跨域请求资源的需要,同源策略这样一股脑的禁止所有的跨域请求显然不合适,但放弃同源策略更是不可能的,允许不同源的页面相互作用是一场灾难。在这样的需求与矛盾下,CORS应运而生。
跨域资源共享(Cross-origin resource sharing),简称CORS,它使某些页面可以跨域请求来自特定的不同源的页面资源。
CORS依托于浏览器,如果浏览器不支持CORS,那么便无法使用,不过现在几乎没有不支持CORS的浏览器。
当发出跨域请求时,浏览器会在请求报文头中加入字段 Origin:xxx 来说明发起跨域请求的源,当另一端的服务器接受到了带有Origin的请求时,它会将所请求的资源放入响应报文中返回,并在响应头中加入一些以 Access-Control- 开头的字段,我们需要关注的只有其中两个:
- Access-Control-Allow-Origin: 它的值只能是一个外域的URI或者是*(只能有一个URI或*,不能写像 Access-Control-Allow-Origin:http://a.com,http://b.com 这样的,虽然这样很方便,但它是不被允许的,该字段后只允许有唯一一个URI,下文会说一种设置多个允许跨站的域的方法),这个值是允许进行跨域请求的源,浏览器接收响应后先比对这个字段中的URI是不是发起请求的Origin,若为*则允许所有域名的请求。如果两者一样,则允许这次跨域请求,响应中的所请求的资源将会被加载到浏览器上。
- Access-Control-Allow-Credentials: 这个字段的值只能是true,则接收的数据中包含cookie,若不设置该字段,则不发送cookie。
如此,通过CORS,可以实现几个特定的域之间的跨域的访问。
CORS设置:
修改一下hosts,模拟两个不同的站点:
192.168.10.103 www.test.com
192.168.10.103 www.hack.com
按照自己的情况修改ip,
如果跨站请求成功会显示success,
被请求的url,http://www.test.com/test/test.php
<?php
echo 'success';
?>
发起跨域请求的url,http://www.hack.com/test/1.html
<!DOCTYPE>
<html>
<p>Hello<p>
<script type="text/javascript">
function test()
{
var ajax = new XMLHttpRequest(); ajax.onreadystatechange=function()
{
if(ajax.readyState == 4 && ajax.status == 200)
{
var text = ajax.responseText;
document.write(text)
}
}
ajax.open("GET","http://www.test.com/test/test.php","true")
ajax.send();
}
test();
</script>
</html>
在hack.com的页面上请求test.com的资源:

显示禁止跨域发出xmlhttprequest请求
<?php
header('Access-Control-Allow-Origin:http://www.hack.com');
echo 'success';
?>
加入Access-Control-Allow-Origin字段允许hack.com的源跨站请求资源。

跨站访问成功。
当我们把Access-Control-Allow-Origin改为http://www.a.com时:

又失败了。
漏洞的产生
漏洞产生的原因可分为两个,它们的原因都出在Access-Control-Allow-Origin上,当配置为星号*时,来自任何一个域名上的脚本都可以请求这个页面上的所有信息,相当于手动禁止了同源策略,这个原因的可能性极小,因为除非是一个全无经验的人,否则没有人会将其设置为*。另一个原因出现的几率就远远大于第一个了,其原因为由程序员的大意或疏忽导致匹配的不严谨。
不完全匹配:
这种问题是由于当按一定的规则来确认发起跨域请求的源是否应该允许访问时,匹配的规则有纰漏,只确认了其中某一部分符合规则就认为源一定是可信任的,例如:
将http://www.test.com/test/test.php进行更改
<?php
$origin = $_SERVER['HTTP_ORIGIN'];
$pattern = '#www.a.com#';
preg_match($pattern,$origin,$match);
if ($match)
{
header('Access-Control-Allow-Origin:'.$origin);
}
echo 'success';
?>
这段代码中,只要匹配到www.hack.com,并没有确认其他部分的内容就简单的判断允许跨域请求,当攻击者使用 www.a.com.hack.com 时,很容易就骗过了规则,成功发起跨域请求并接收。
再举个例子,当匹配规则为确认 a.com 在Origin末尾时才允许访问,显然上面一个例子中的方法不再适用,这时仍可以构造 bbbbbbba.com 这样的域名来突破限制。
道高一尺魔高一丈,匹配规则有很多,突破方法有更多,这里就不一一列举了。
没有转义:
当用正则表达式进行匹配时,URI中存在着许多点 . 像 bp.a.com , tieba.baidu.com , www.billbill.com 小数点.这个符号在正则表达式可以代替着任意一个字符,如果想让其仅仅代表.这个符号本身而不是匹配任何一个字符的话,应当使用转义符\. ,但很多人往往总会忘记转义,如在上述的代码中就没有进行转义:
http://www.test.com/test/test.php中注意:
$pattern = '#www.a.com#';
当我们使用 www.aacom.com , www.wwwaaacom.com , www.wwwaa.com 在 . 的位置随意写上一个字符就可以突破限制,正确写法应该是www\.a\.com
当头设置了Access-Control-Allow-Credentials:true时,恰巧产生了CORS漏洞,危害会大大增加,因为向其发起跨域请求时,它会将cookie一起发送,这是及其不希望看到的,也是非常危险的,读取了页面上的一些信息有时或许无伤大雅,但读取了cookie很多时候都是非常恐怖的。
漏洞检测与利用
CORS漏洞会加强xss的攻击力,哪怕是反射型的xss也增加了许多可能性。
检测CORS的方式可以通过不断修改Origin,检测响应中的Access-Control-Allow-Origin的值是否与Origin相同,如若相同,则存在CORS漏洞,github上有一个CORS漏洞的检测工具CORScanner,当检测到CORS时,可以这样利用:
<script>
var ajax = new XMLHttpRequest();
ajax.open('GET','http://xxx','true');
ajax.onload = main;
ajax.withCredentials = true;
ajax.send() function main(){
xxx
}
其中,ajax.withCredentials = true;这一段代码的作用是将Access-Control-Allow-Credentials:true设置为true以允许读取cookie,提升危害,main中写入可以读取敏感数据birucookie并将其发送给攻击者的代码,诱使受害者执行这段代码,就可以达到获取重要信息的目的。
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
总体来说,CORS漏洞现在看来危害并不是特别大,但是千里之堤溃于蚁穴,无论怎样的漏洞都要有足够的重视,既是对自己负责,也是对他人负责、
CORS漏洞的学习与分析的更多相关文章
- CVE-2013-2551漏洞成因与利用分析(ISCC2014 PWN6)
CVE-2013-2551漏洞成因与利用分析 1. 简介 VUPEN在Pwn2Own2013上利用此漏洞攻破了Win8+IE10,5月22日VUPEN在其博客上公布了漏洞的细节.它是一个ORG数组整数 ...
- CORS漏洞利用检测和利用方式
CORS全称Cross-Origin Resource Sharing, 跨域资源共享,是HTML5的一个新特性,已被所有浏览器支持,不同于古老的jsonp只能get请求. 检测方式: 1.curl访 ...
- [二进制漏洞]PWN学习之格式化字符串漏洞 Linux篇
目录 [二进制漏洞]PWN学习之格式化字符串漏洞 Linux篇 格式化输出函数 printf函数族功能介绍 printf参数 type(类型) flags(标志) number(宽度) precisi ...
- Linux内核分析第五周学习总结——分析system_call中断处理过程
Linux内核分析第五周学习总结--分析system_call中断处理过程 zl + <Linux内核分析>MOOC课程http://mooc.study.163.com/course/U ...
- Linux内核分析第六周学习笔记——分析Linux内核创建一个新进程的过程
Linux内核分析第六周学习笔记--分析Linux内核创建一个新进程的过程 zl + <Linux内核分析>MOOC课程http://mooc.study.163.com/course/U ...
- CVE-2014-0322漏洞成因与利用分析
CVE-2014-0322漏洞成因与利用分析 1. 简介 此漏洞是UAF(Use After Free)类漏洞,即引用了已经释放的内存,对指定内存处的值进行了加1.其特点在于攻击者结合flash实现了 ...
- CVE-2013-3897漏洞成因与利用分析
CVE-2013-3897漏洞成因与利用分析 1. 简介 此漏洞是UAF(Use After Free)类漏洞,即引用了已经释放的内存.攻击者可以利用此类漏洞实现远程代码执行.UAF漏洞的根源源于对对 ...
- 漏洞分析:OpenSSH用户枚举漏洞(CVE-2018-15473)分析
漏洞分析:OpenSSH用户枚举漏洞(CVE-2018-15473)分析 漏洞分析:OpenSSH用户枚举漏洞(CVE-2018-15473)分析 - FreeBuf互联网安全新媒体平台 https: ...
- C语言 extern学习2 分析
上一篇文章中,通过头文件声明,而调用有一个特别大的漏洞: 为什么编译器可以链接过来呢,因为默认是extern修饰的,这种类似全局作用域的功能使其可以被调用 继续加强学习: 这一次有两对C文件: fir ...
随机推荐
- Javascript十六种常用设计模式
单例模式 何为单例模式,就是无论执行多少次函数,都只会生成一个对象哈哈,看一个简单的demo function Instance(name) { this.name = name; } Instanc ...
- 滑动窗口-Substring Search Problem
2018-07-18 11:19:19 一.Minimum Window Substring 问题描述: 问题求解: public String minWindow(String s, String ...
- SpannableStringBuilder实现TextView华丽变身
前言 想要在TextView 的文本添加一些突出文字,然后点击可以进行跳转,首先想到的就是TextView拼接,但是考虑到换行后的显示又不是很合适,一番查询后发现了SpannableStringBui ...
- OpenCV-Python 模板匹配 | 三十一
目标 在本章中,您将学习 使用模板匹配在图像中查找对象 你将看到以下功能:cv.matchTemplate(),cv.minMaxLoc() 理论 模板匹配是一种用于在较大图像中搜索和查找模板图像位置 ...
- 1+1>2:MIT&IBM提出结合符号主义和连接主义的高效、准确新模型
自人工智能的概念提出以来,关于符号主义和连接主义的争论就不绝于耳.究竟哪一种方式可以实现更好的人工智能?这一问题目前还没有定论.深度学习的快速发展让我们看到连接主义在构建 AI 系统中的优势,但其劣势 ...
- adb的基本安装和介绍(一)
一,什么是adb? adb全称为Android Debug Bridge,就是起到调试桥的作用.顾名思义,adb就是android sdk 的一个工具 借助adb工具,我们可以管理设备或手机模拟器的状 ...
- 从零开始发布一个ArcGIS Server地图服务
@ 目录 一.软件环境搭建 1.数据库安装 1.1.Oracle(可选) 1.1.1.安装Oracle服务端 1.1.2.安装Oracle客户端 1.2.PostgreSQL(可选) 1.2.1.安装 ...
- -bash: syntax error near unexpected token `newline'问题解决
原因:bash语法错误,例如, 仔细查看发现语句中不能有'<'和'>',删除这两个符号即可: 问题解决!
- [JZOJ5343]健美猫<模拟>
[思路] 这个是一个非常容易看出来的模拟,但是模拟也是有技巧的 一般人的模拟思路一般就是移动元素或者下标 然后我就看到了一个有趣的思路 建立坐标轴 以i坐标为横坐标,以si为纵坐标,然后画一条斜率为1 ...
- Python常用模块之模块的使用
一 模块介绍 1.什么是模块? #常见的场景:一个模块就是一个包含了一组功能的python文件,比如spam.py,模块名为spam,可以通过import spam使用. #在python中,模块 ...