跨域資源共享配置錯誤
跨源資源共享(Cross-Origin Resource Sharing, CORS)是一種基于瀏覽器的機(jī)制,它指示瀏覽器在其web服務(wù)器域之外加載資源的允許來源。除了提供比同源策略(SOP)更強(qiáng)的靈活性外,CORS還通過控制如何從外部域請求和加載資源來確保安全性。
然而,有幾個因素可能導(dǎo)致CORS實現(xiàn)容易受到網(wǎng)絡(luò)攻擊。其中一個原因是 CORS 策略配置不當(dāng),該策略通常用于跨域攻擊,其中威脅參與者向 Web 服務(wù)器的域發(fā)送惡意請求,作為邁向更深入的系統(tǒng)級攻擊的第一步。
什么是CORS錯誤配置?
當(dāng) Web 服務(wù)器允許第三方域通過合法用戶的瀏覽器執(zhí)行特權(quán)任務(wù)時,會發(fā)生跨源資源共享錯誤配置。由于 CORS 機(jī)制依賴于 HTTP 標(biāo)頭,因此瀏覽器會向跨域資源發(fā)出預(yù)檢請求,并檢查瀏覽器是否有權(quán)為實際請求提供服務(wù)。因此,不正確的 CORS 標(biāo)頭配置允許惡意域訪問和利用 Web 服務(wù)器的 API 端點。雖然多個標(biāo)頭定義了 CORS 策略,但以下三個標(biāo)頭對于管理安全性非常重要:
ACAO (access - control - allow - origin) -指定可以訪問web服務(wù)器資源的外部域。如果服務(wù)器動態(tài)生成此標(biāo)頭,或者如果網(wǎng)站允許使用通配符的域,服務(wù)器可能允許訪問任何域,包括攻擊者控制的網(wǎng)站的域。
訪問控制允許憑據(jù) – 指定客戶端的瀏覽器是否在請求中包含 Cookie、TLS 證書或授權(quán)標(biāo)頭。如果此標(biāo)頭設(shè)置為 true,則瀏覽器會發(fā)送包含請求的憑據(jù),攻擊者可以使用惡意腳本在傳輸過程中檢索這些憑據(jù)。
訪問控制允許方法 – 此標(biāo)頭指定用于跨域訪問的HTTP方法。如果標(biāo)頭包含不安全的 HTTP 方法,則攻擊者可以通過中繼包含不受信任的腳本、二進(jìn)制文件和圖像的請求來訪問受限資源。
如何利用 CORS 錯誤配置?
攻擊者利用CORS錯誤配置濫用web服務(wù)器、客戶端瀏覽器和受信任域之間的信任鏈。針對 CORS 錯誤配置的常見攻擊包括:
起源反射
假設(shè)這樣一個場景:允許域名cross- orig-website.com訪問來自服務(wù)器origin-website.com的內(nèi)容;外部域是在originalwebsite.com web服務(wù)器的CORS配置中使用ACAO頭指定的,如下所示:

由于CORS配置不允許開發(fā)人員在靜態(tài)列表中指定允許的域,所以開發(fā)人員要么動態(tài)生成ACAO標(biāo)頭,要么使用通配符*(如果要允許多個域)。
動態(tài)生成標(biāo)頭時,Web 服務(wù)器會讀取請求的源標(biāo)頭,然后將其寫入響應(yīng)中的訪問控制允許源標(biāo)頭。雖然這些授予對所有域的訪問權(quán)限,但黑客可以利用該方法。一種常見的漏洞利用方法是從自定義源發(fā)送 HTTP 請求,并檢查服務(wù)器是否允許對源進(jìn)行訪問控制,如下所示。

這樣的攻擊被稱為起源反射利用,web服務(wù)器在響應(yīng)的訪問控制-允許-起源標(biāo)頭中反映請求的起源標(biāo)頭。此外,響應(yīng)還公開Access-control-allow-credentials報頭被設(shè)置為true。在這種情況下,攻擊者-controlled-domain.com可以使用受害者的憑據(jù)向original-website.com發(fā)送請求,允許攻擊者通過編寫惡意腳本檢索憑據(jù)。為了通過攻擊者控制的網(wǎng)站獲取受害者的憑據(jù),攻擊者還可以在發(fā)送給毫無戒心的用戶的頁面中嵌入類似以下內(nèi)容的JavaScript:

零源漏洞利用
一些開發(fā)人員將他們的web服務(wù)器配置為允許通過一種稱為null origin的特殊起源方法進(jìn)行跨起源訪問。在這種情況下,web服務(wù)器返回如下所示的類似響應(yīng):

攻擊者利用這一點,創(chuàng)建一個描述本地HTML文件的沙箱iFrame來獲取空源。沙盒iFrame看起來類似于:

使用上述有效負(fù)載發(fā)送的請求具有空源,可用于檢索用戶憑據(jù)和其他敏感信息。
擴(kuò)展源碼漏洞
由于源標(biāo)頭的正則表達(dá)式實現(xiàn)不佳,Web 服務(wù)器可能無法驗證原始源的擴(kuò)展地址。例如,Web 服務(wù)器可以配置為接受以 original-website.com 結(jié)尾的所有域,例如 apps.original-website.com 和 mail.original-website.com.但是,由于實現(xiàn) RegEx 定位器時出錯,這些域可能會無意中允許來自任何以 original-website.com 結(jié)尾的域(包括 attackers-original-website.com)的請求。
攻擊者可以利用這種錯誤配置來創(chuàng)建類似以下內(nèi)容的格式錯誤的請求:

Web 服務(wù)器最終會提供一個包含受害者憑證信息的響應(yīng),類似于:

跨域資源共享配置錯誤影響
CORS機(jī)制主要是為了放寬同源政策的限制性要求而建立的。當(dāng) CORS 標(biāo)頭中的策略過于寬松并允許對任何源進(jìn)行跨域訪問時,就會出現(xiàn)漏洞。開發(fā)團(tuán)隊經(jīng)常忽略 CORS 錯誤配置,這使得攻擊者通常利用這種風(fēng)險來編排增強(qiáng)攻擊。盡管 CORS 是一項強(qiáng)大的技術(shù),但錯誤配置很容易被利用,因為對手只需要對標(biāo)頭規(guī)范有基本了解,并在執(zhí)行漏洞測試時多一些耐心。
成功利用CORS錯誤配置的影響包括:
操縱或竊取受害者的cookie
創(chuàng)建和執(zhí)行無效請求
在易受攻擊的web服務(wù)器中執(zhí)行惡意代碼
接觸敏感信息
安裝惡意軟件
跨站點腳本攻擊
CORS漏洞(A05:2021)被分類在OWASP前10個漏洞列表的“安全錯誤配置”中。這組漏洞的平均加權(quán)影響為6.56(中等),平均加權(quán)利用為8.12(高),平均發(fā)生率為4.52%(中等)。
CORS 和 CSRF 漏洞有什么區(qū)別?
在 CORS 標(biāo)頭配置不正確的情況下,攻擊者可以使用惡意域來利用組織的 Web 服務(wù)器的資源。CORS 漏洞通常被用于基于瀏覽器的攻擊,這些攻擊利用放寬同源策略來訪問受限制的數(shù)據(jù)和功能。
另一方面,跨站請求偽造(CSRF)是一種Web 漏洞利用,它讓毫無戒心的用戶從受信任的Web應(yīng)用程序提交未經(jīng)授權(quán)的命令。由于大多數(shù)瀏覽器在提交請求時自動包含用戶的會話信息,網(wǎng)站無法區(qū)分合法和偽造請求,最終執(zhí)行攻擊者發(fā)起的額外的操作。
防止 CORS 配置錯誤漏洞的實踐有哪些?
對訪問控制允許憑據(jù)配置設(shè)置為 true 的資源執(zhí)行身份驗證
對訪問控制允許源標(biāo)頭使用白名單而不是通配符
對需要訪問資源的所有域和子域?qū)嵤┖Y選器和驗證
進(jìn)行持續(xù)漏洞掃描和安全漏洞測試
