一、跨域資源共享漏洞驗證
跨域資源共享漏洞(Cross-Origin Resource Sharing, CORS)是由於瀏覽器的實現機制導致的,它的本質是瀏覽器允許網頁上的JavaScript代碼向跨域服務器發送HTTP請求,從而獲取數據。但由此也帶來了安全風險。
驗證CORS是否存在漏洞的方法有很多,其中較常用的幾種如下:
1. Burpsuite
使用Burpsuite可以抓取請求,然後進行修改,模擬跨域請求。如果跨域資源共享漏洞存在,我們就可以得到源站的信息和資源。
POST /login HTTP/1.1
Host: abc.com
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:91.0) Gecko/20100101 Firefox/91.0
Accept: */*
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Content-Type: application/x-www-form-urlencoded; charset=UTF-8
X-Requested-With: XMLHttpRequest
Content-Length: 23
Origin: http://www.xyz.com
Connection: close
name=admin&password=123
2. 自建跨域資源共享測試網站
可以自建一個測試網站,測試跨域請求有沒有成功。例如,我們自建的跨域資源共享測試網站是http://www.cors-test.com/,其頁面上為一個JavaScript鏈接,如果該域名允許跨域訪問,即可正常打開JavaScript頁面。
<html>
<head>
<script src="http://www.cors-test.com/load-script.js">
</script>
</head>
<body>
<p>Hello, World!</p>
</body>
</html>
3. 瀏覽器的開發者工具
通過開發者工具可以方便地查看HTTP請求和響應,並進行修改和添加。例如,可以使用Chrome的開發者工具,選擇Network標籤頁,找到發送請求的地址,查看響應報文,如果 Access-Control-Allow-Origin 是 *,表示該站點存在 CORS 漏洞。
二、跨域資源共享漏洞修復
跨域資源共享漏洞的修復方法如下:
1. 同源策略
瀏覽器的同源策略禁止不同源網頁間的 cookie、localStorage 和 IndexDB 等數據相互訪問,而通過這些方式能夠獲取其他網頁 valuable 的信息,可以減少攻擊者對網頁的攻擊,防止一些不必要的資源泄露。
2. 服務器設置CORS
可以通過在響應頭(Response Header)字段里設置 Access-Control-Allow-Origin,來令指定來源訪問該資源,指定來源後將禁止其他來源對資源的訪問,可以避免跨站請求攻擊(CSRF)。例如,若網站http://www.abc.com允許http://www.xyz.com和http://www.klm.com進行跨域資源請求,則在www.abc.com的響應頭中應增加如下內容:
Access-Control-Allow-Origin: http://www.xyz.com
Access-Control-Allow-Methods: POST, GET
Access-Control-Allow-Credentials: true
Access-Control-Allow-Headers: Content-Type, *
3. 使用Token傳遞數據
使用Token傳遞數據是跨域訪問的一種方案,Token是用戶的身份令牌,可以直接翻看該身份令牌從而克服跨站請求攻擊(CSRF)。
三、跨域資源共享CORS詳解
1. CORS的類型
CORS請求分為兩類:簡單請求(Simple Request)和非簡單請求(Non-simple Request)。
簡單請求需同時滿足以下四個條件:
- 使用 HTTP 方法為:GET、HEAD 或 POST
- Content-Type 為text/plain、multipart/form-data、application/x-www-form-urlencoded中的一種
- 請求中的任意 XMLHttpRequestUpload 對象均沒有註冊任何事件監聽器
- 請求中沒有使用不安全的標頭(如Cookie、Authorization等)或者是之前已經通過Access-Control-Allow-Headers設置了
非簡單請求滿足以下任意一個:
- 使用PUT、DELETE方法,或者是使用其他請求方法,POST請求Content-Type不是text/plain、multipart/form-data、application/x.www.form-urlencoded之一
- 請求中的任意 XMLHttpRequestUpload 對象均註冊了事件監聽器
- 請求中使用了之前沒有用過的自定義標頭
2. CORS流程
CORS流程如下:
- 瀏覽器發現AJAX請求是跨源的,就會為該請求添加origin字段,標明來源,例如,origin: http://www.abc.com
- 服務器如果接受跨源請求,就需要在響應頭中添加 Access-Control-Allow-Origin,指定允許的源,例如,Access-Control-Allow-Origin: http://*.xyz.com 表示允許以 xyz.com Qualified Name Label 結尾的任何請求跨源訪問。如果要允許所有源訪問該資源,則可以設置為 Access-Control-Allow-Origin:*
- 完成以上兩步後,瀏覽器會對響應頭進行檢查,如果 origin 在 Access-Control-Allow-Origin 允許的列表中,就將響應返回給前端,否則便會停止請求,也就是將響應取消。
3. CORS的安全性
CORS通過在跨域請求時加入origin頭,在服務器端進行判別,只有同意情況下才能發生跨域請求,避免了一些跨域危害。同時,設置 Access-Control-Allow-Origin 的時候千萬不能設置為 *,這個時候服務器允許所有站點跨域請求,這將導致嚴重的安全問題。
原創文章,作者:CHCNU,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/316528.html