- Web漏洞搜索
- (美)彼得·亞沃斯基
- 1563字
- 2021-11-05 10:20:02
4.1 身份認證
CRSF攻擊,就像我剛才說的這個例子一樣,利用了網站用于對請求進行身份認證的進程的缺陷。當你訪問一個需要登錄(通常是以用戶名口令方式登錄)的網站時,該網站一般要對你進行身份認證。然后該網站會在瀏覽器中存儲你的身份認證信息,以便于你在訪問該網站的新網頁時不用每次都再去登錄。有兩種存儲身份認證信息的方式:使用基礎身份認證協議或cookie。
當HTTP請求中包含形如Authorization: Basic QWxhZGRpbjpPcGVuU2VzYW1l的信息頭時,該網站采用了基礎身份認證協議。上面看起來隨機的字符串是以冒號進行分隔的用戶名和口令的base64編碼。在本例中,QWxhZGRpbjpPcGVuU2VzYW1l將被解碼為Aladdin:OpenSesame。本章中我們不會聚焦于基礎身份認證,但是你在本章中學到的很多技術都可以用于挖掘采用基礎身份認證而導致的CSRF漏洞利用上。
cookie是由網站創建并存儲在用戶端瀏覽器中的小文件。網站使用cookie有很多目的,例如存儲用戶的愛好或者用戶訪問網站的歷史記錄等。cookie具有特定的被標準化為信息片的屬性。這些屬性告知瀏覽器cookie是做什么的,以及該如何處理它們。有些cookie屬性可能會包含domain、expires、max-age、secure和httponly等,在本章后面你將會學到這些。除了屬性之外,cookie也可能會包含一個名/值對,由一個標識符及其相關聯的要發往網站(cookie的domain屬性定義了信息要發往的網站)的數值構成。
瀏覽器定義網站能夠設置的cookie的數量。但是一般來說,單個網站能夠在通用瀏覽器中設置50~150個cookie,據報道,在有些瀏覽器中可以設置多達600個以上的cookie。瀏覽器通常允許網站使用每個cookie最大4KB的存儲空間。cookie的名和值沒有標準,也就是說,網站可以自由地選擇自己的名/值對及其目的地址。例如,網站可以選擇命名為sessionId的名字,以便于記住用戶是誰,而不用在用戶訪問每個網頁或進行每次操作時都要求他們重新輸入用戶名和口令。(正如在第1章所描述的那樣,HTTP請求是無狀態的。無狀態意味著網站并不知道每次HTTP請求對應的用戶是誰,因此,它必須對每次請求都重新進行用戶認證。)
作為一個例子,cookie中的名/值對可能是sessionId=9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08,并且cookie具有一個.site.com域。因此,sessionId cookie將被發送到用戶訪問的每個.<site>.com網站,例如,foo.<site>.com、bar.<site>.com、www.<site>.com等。
secure和httponly屬性告訴瀏覽器什么時候和怎樣發送和讀取cookie。這些屬性不包含取值,而是表示了在cookie中是否出現的標志。當cookie中包含secure屬性時,瀏覽器將只在訪問HTTPS網站時發送cookie。例如,如果你帶著一個secure cookie訪問http://www.<site>.com/(一個HTTP網站),你的瀏覽器將不會發送cookie到這個網站。原因就是為了保護你的個人隱私,因為HTTPS連接是加密的,而HTTP連接是不加密的。httponly屬性,當你在第7章學習跨站腳本攻擊時會覺得它非常重要,它會告訴瀏覽器只能通過HTTP或者HTTPS請求來讀取cookie。因此,瀏覽器不允許任何腳本語言,例如JavaScript,來讀取cookie的值。當cookie中沒有設置secure和httponly屬性時,這些cookie將被正常發送并且可能會被惡意讀取。沒有設置secure屬性的cookie可能被發送到一個非HTTPS網站;同樣地,沒有設置httponly屬性的cookie可能被JavaScript腳本讀取。
expires和max-age屬性表示cookie什么時候過期并被瀏覽器刪除。expires屬性簡單地告訴瀏覽器在一個確定的時間刪除cookie。例如,cookie可以設置該屬性為expires=Wed,18 Dec 2019 12:00:00 UTC(世界時間:2019年12月18日,星期三)。對應地,max-age屬性是直到cookie超時的秒數,并以一個整數(max-age=300)的形式體現。
總之,如果Bob訪問的網銀使用了cookie,那么網銀將會存儲他的身份認證信息以支持后續的處理過程。一旦Bob訪問了網銀并進行了登錄,銀行將會以一個HTTP響應回應他的HTTP請求,在該響應消息中包含了標識Bob身份的cookie。反過來,Bob的瀏覽器將會在向該銀行網站發起其他HTTP請求時自動地發送cookie信息。
當查詢完他的賬號余額后,Bob離開銀行網站時并沒有退出登錄。注意這個細節,因為當你退出登錄一個網站時,網站一般會向瀏覽器發出一個HTTP響應消息,要求其刪除cookie。因此,當你再訪問這個網站時,你將要重新進行登錄。
當Bob收取郵件并點擊了指向未知網站的鏈接后,他無意中訪問了一個惡意的網站。這個惡意網站被設計為通過引導Bob的瀏覽器發起一個到他的銀行網站的請求而執行一個CSRF攻擊。該請求將同時發送Bob瀏覽器中的cookie信息。