CORS
(Cross-OriginResource Sharing,跨源資源共享)
其思想是使用自定義的HTTP頭部讓瀏覽器與服務器進行溝通。因爲開發者需要進行跨域進行獲取資源,應用場景,在a.com,想獲取b.com中的數據,常用的2種方法進行跨域一種爲JSONP,一種爲CORS.還有html標籤也能跨域,有以下幾種img, iframe,ink, script等。
簡單流程
假設用戶登陸一個含有CORS配置網站A,同時又訪問了攻擊者提供的一個鏈接B。B的網站向A這個網站發起請求獲取敏感數據,瀏覽器能否接收信息取決於A的配置。
如果A配置了Access-Control-Allow-Origin頭且爲預期,那麼允許接收,否則瀏覽器會因爲同源策略而不接收。
流程圖如下:
(假設A網站爲aufeng.com, B網站爲testcors.com)
- aufeng.com端
其中www.aufeng.com新建一個feng.php,內容爲
<?php
echo "username: admin; password:123456";
?>
那麼訪問http://www.aufeng.com/feng.php就會如下圖所示
- 在testcors.com端進行如下配置
<!DOCTYPE>
<html>
<h1>Hello ,cors test. </h1>
<script type="text/javascript">
function loadXMLDoc()
{
var xhr = new XMLHttpRequest();
xhr.onreadystatechange=function()
{
if(xhr.readyState == 4 && xhr.status == 200) //if receive xhr response
{
var datas=xhr.responseText;
alert(datas);
}
}
//request vuln page
xhr.open("GET","http://www.aufeng.com/feng.php","true")
xhr.send();
}
loadXMLDoc();
</script>
</html>
然後我們打開http://www.testcors.com/cors.html,html代碼的意思是通XMLHttpRequest訪問www.aufeng.com,然後將獲取到的內容彈框出來。
但是根據同源策略,這是不允許的,如下圖所示:
打開查看器也會有提示
那麼我們怎麼使用CORS使其可以跨域訪問呢,接下來我們改一下feng.php:
添加header(“Access-Control-Allow-Origin:http://www.testcors.com”);
然後訪問http://www.testcors.com/cors.html,發現aufeng.com的敏感信息彈出來了,實現了跨域資源的請求。
漏洞原因
由於配置不當,服務器並沒有對Origin源進行一個嚴格的判斷,從而造成跨域問題。
只要關注Origin即可。當我們把Origin設置爲testcors.com時,返回包的Access-Control-Allow-Origin也爲testcors.com,也就是testcors.com可以跨域獲取aufeng.com的資源。從而產生了CORS配置不當的漏洞
- 漏洞的請求包
GET /feng.php HTTP/1.1
Host: aufeng.com
User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:46.0) Gecko/20100101 Firefox/46.0
Accept: */*
Accept-Language: zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3
Content-Type: application/json
origin: http://testcors.com
- 響應包
HTTP/1.1 304 Not Modified
Connection: close
ETag: "ba948d94315604d965963bffecb2582a"
Cache-Control: max-age=0, private, must-revalidate
Access-Control-Allow-Origin: http://testcors.com
Access-Control-Allow-Methods: GET, POST, PUT, OPTIONS, DELETE
Access-Control-Expose-Headers:
Access-Control-Max-Age: 1728000
Access-Control-Allow-Credentials: true
Vary: Origin
Referrer-Policy: origin-when-cross-origin
X-Content-Type-Options: nosniff
X-Download-Options: noopen
X-Frame-Options: SAMEORIGIN
X-Permitted-Cross-Domain-Policies: none
X-XSS-Protection: 1; mode=block
Access-Control-Allow-Origin這個字段的意思是允許跨域訪問的網站,他有可能是一個具體的值,如果是一個*號,那麼表示接受任意域名的請求。
Access-Control-Allow-Credentials: true這個設置是請求包中是否攜帶cookie。
修復建議
對於orgin域名進行嚴格限制,可信域名限制。
不要配置Origin:*和Credentials: true