CORS跨域资源共享漏洞

CORS漏洞其中已经存在很久了,但是国内了解的人不是很多,文章更是少只有少,漏洞平台也没有此分类。

在DefConChina之后写了一篇算是小科普的文章。

定义
CORS,Cross-Origin Resource Sharing,跨源资源共享。
CORS是W3C出的一个标准,其思想是使用自定义的HTTP头部让浏览器与服务器进行沟通。因为开发者需要进行跨域进行获取资源,应用场景,在a.com,想获取b.com中的数据,常用的2种方法进行跨域
一种为JSONP,一种为CORS.前者再次不在描述,常见的为JSONP劫持。

CORS请求示例:
b.com想获取www.a.com/1.jpg的图片资源。
代码如下:

<!DOCTYPE html> 
<html>
    <head>CORS Test</head>
    <body>
        <div id="img_Div"></div>
    <script type="text/javascript">  
        //XmlHttpRequest对象  
        function createXmlHttpRequest(){  
            if(window.ActiveXObject){ //如果是IE浏览器  
                return new ActiveXObject("Microsoft.XMLHTTP");  
            }else if(window.XMLHttpRequest){ //非IE浏览器  
                return new XMLHttpRequest();  
            }  
        }  

        function getFile() {
            var img_Container = document.getElementById("img_Div");
            var xhr = createXmlHttpRequest();
            xhr.open('GET', 'http://oss.youkouyang.com/1.jpg', true);
            xhr.setRequestHeader('Content-Type', 'image/jpeg');
            xhr.responseType = "blob";
            xhr.onload = function() {
                if (this.status == 200) {
                    var blob = this.response;
                    var img = document.createElement("img");
                    img.onload = function(e) {
                        window.URL.revokeObjectURL(img.src); 
                    };
                    img.src = window.URL.createObjectURL(blob);
                    img_Container.appendChild(img);    
                }
            }
            xhr.send(null);
        }
    </script>
    <div class="row">
        <input type="button" onclick="getFile()" value="Get" />
    </div>
    </body>
</html>

CORS安全机制
在CORS中,相关的标准和浏览器厂商也推出了很多防范的相关标准。例如SOP等等。

简单请求

在简单请求中,如果请求符合2个标准,则会进行异步请求:
1,GET、POST、HEAD..
2,Content-Type验证,pplication/x-www-form-urlencoded;multipart/form-data;text/plain

在简单请求中,浏览器进行跨域请求,会在请求中携带Origin,表面这是一个跨域。服务端会在接收中,通过自己的跨域规则进行验证。
通过access-Control-Allow-Origin和Access-Control-Allow-Methods 如果验证成功,则会返回资源内容,如果验证失败,则返回403状态。

预先请求
在请求中,满足下面任意一个请求中,浏览器会首先发出OPTION请求,再去验证是否符合。


在OWASP TOP 10中也有更详细的说明:
http://blog.securelayer7.net/owasp-top-10-security-misconfiguration-5-cors-vulnerability-patch/
在DefConChina中,陈建军分享的议题中解释的更清楚,有意向的可以找PPT或者视频

实战请求COS之前发过一次CORS的蠕虫:
http://evilcos.me/?p=590

防御:
在防御过程中,存在很多配置不当,或者配置错误的情况,例如使用*,或者使用多个域名list,或者使用null,或者nginx配置规则存在错误等等。

相关工具:
CORScanner // github

参考:

https://blog.csdn.net/saytime/article/details/51549888 

原文地址:https://www.cnblogs.com/sevck/p/9035422.html