CORS跨域漏洞淺析

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

高級利用:

https://www.freebuf.com/articles/web/204023.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章