跨域資源共享(CORS)漏洞詳解
瀏覽器同源策略
- 同協議,同端口同域名
- 不運行別的網站訪問該網站資源
兩種跨域方法
-
JSONP跨域請求
- 原理 https://www.cnblogs.com/znyu/p/6839617.html
- jsonp利用script標簽具有跨域能力的特點,允許用戶通過script的src屬性向服務器發送請求,並傳遞一個函數名作為參數,服務端返回數據時會將這個callback函數作為函數名包裹住從服務端接收的json數據,客戶端會按照定義好的方式處理數據。舉例如下
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>JSONP 實例</title> </head> <body> <div id="list"></div> <script type="text/javascript"> function callbackFunction(result, methodName) { var html = '<ul>'; for(var i = 0; i < result.length; i++) { html += '<li>' + result[i] + '</li>'; } html += '</ul>'; document.getElementById('list').innerHTML = html; } </script> <script type="text/javascript" src="http://www.myweb.com/demo/jsonp.php?jsoncallback=callbackFunction"></script> </body> </html>
- callbackFunction函數名作為參數傳遞給服務器,服務器返回數據形式為:callbackFunction(["list1","list2"]),顯示結果會按照 callbackFunction()函數來處理。
-
CORS跨域請求
- jsonp只能發送get請求的包
CORS的安全問題
-
返回報文頭部的Access-Control-Allow-Origin根據請求報文Origin生成
-
如果Access-Control-Allow-Origin可控,且Access-Control-Allow-Credentials為true, 那么就可以利用一個可控的網站來竊取一個人的個人隱私信息
-
就可以請求一些敏感信息,請求用戶主頁等
CORS漏洞與CSRF漏洞
- 相同點:
- 都要借助第三方網站
- 都有借助ajax的異步過程
- 一般都要用戶登錄
- 不同點
- CORS可以讀取到受害者的敏感信息
- CSRF可以完成一些如轉賬類的敏感caoz
- 一般有CORS都會有CSRF
簡單的漏洞檢測方法
- 修改一下Origin的頭
- 過濾刪選
常見的漏洞點
- 互聯網廠商的api接口
- 聊天程序的的api接口
- app的api(不過有一 些請求需要帶有一 些額外的請求頭,利用起來比較困難)
- 區塊鏈廠商
● CORS的規范中還提到了"NULL"源。觸發這個源是為了網頁跳轉或者是來自本地HTML文件。目標應用可能會接收"null"源, 並且這個可能被測試者(或者攻擊者)利用,任何網站很容易使用沙盒iframe來獲取" null“源
防御
-
不要配置"Access-Control-Allow-Origin" 為通配符“*”,而且更重要的是,要嚴格效驗來自請求數據包中的"Origin" 的值。當收到跨域請求的時候,要檢查"Origin" 的值是否是一個可信的源, 還要檢查是否為null
-
避免使用"Access-Control-Allow-Credentials: true"
-
減少Access-Control- Allow-Methods所允許的方法