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