會話固定(Session fixation)是一種誘騙受害者使用攻擊者指定的會話標識(SessionID)的攻擊手段。這是攻擊者獲取合法會話標識的最簡單的方法。會話固定也可以看成是會話劫持的一種類型,原因是會話固定的攻擊的主要目的同樣是獲得目標用戶的合法會話,不過會話固定還可以是強迫受害者使用攻擊者設定的一個有效會話,以此來獲得用戶的敏感信息。
1、 攻擊者通過某種手段重置目標用戶的SessionID,然后監聽用戶會話狀態;
2、 目標用戶攜帶攻擊者設定的Session ID登錄站點;
3、 攻擊者通過Session ID獲得合法會話。
** 攻擊者重置SessionID的方式:**
重置Session ID的方法同樣也有多種,可以是跨站腳本攻擊,如果是URL傳遞Session ID,還可以通過誘導的方式重置該參數,比如可以通過郵件的方式誘導用戶去點擊重置Session ID的URL,使用Cookie傳遞可以避免這種攻擊。
使用Cookie來存放Session ID,攻擊者可以在以下三種可用的方法中選擇一種來重置Session ID。
- 1、 使用客戶端腳本來設置Cookie到瀏覽器。大多數瀏覽器都支持用客戶端腳本來設置Cookie的,例如document.cookie=”sessionid=123”,這種方式可以采用跨站腳本攻擊來達到目的。防御方式可以是設置HttpOnly屬性,但有少數低版本瀏覽器存在漏洞,即使設置了HttpOnly,也可以重寫Cookie。所以還需要加其他方式的校驗,如User-Agent驗證,Token校驗等同樣有效。
<script type='text/javascript'>document.cookie='PHPSESSID=ba9saokf601jodg9nt0ui29bq5'</script>
- 2、 使用HTML的標簽加Set-Cookie屬性。服務器可以靠在返回的HTML文檔中增加標簽來設置Cookie。例如<meta http-equiv=Set-Cookiecontent=”sessionid=123”>,與客戶端腳本相比,對標簽的處理目前還不能被瀏覽器禁止。
<meta http-equiv='Set-Cookie' content='PHPSESSID=ba9saokf601jodg9nt0ui29bq5'>
-
3、 使用Set-Cookie的HTTP響應頭部設置Cookie。攻擊者可以使用一些方法在Web服務器的響應中加入Set-Cookie的HTTP響應頭部。如會話收養,闖入目標服務器所在域的任一主機,或者是攻擊用戶的DNS服務器。
-
4、如果是URL中傳遞的(基本上沒有了)可以直接:
http://URL/index.php?PHPSESSID=ba9saokf601jodg9nt0ui29bq5
這里還有一點需要注意,攻擊者如果持有的是有效的SessionID,那么防御措施就一定得校驗驗證。如攻擊者可以先到目標站點登錄,獲得有效的Session ID,然后再拿這個Session ID去重置目標用戶的會話標識,那么這時候用戶將會在不知情的情況下訪問攻擊者設定的合法會話(實際上登錄的是攻擊者的賬號了)中,從而攻擊者將有可能獲取到目標用戶的敏感信息。
** 防御方法:**
1、 用戶登錄時生成新的Session ID。如果攻擊者使用的會話標識符不是有效的,那么這種方式將會非常有效。如果不是有效的會話標識符,服務器將會要求用戶重新登錄。如果攻擊者使用的是有效的Session ID,那么還可以通過校驗的方式來避免攻擊。
2、 大部分防止會話劫持的方法對會話固定攻擊同樣有效。如設置HttpOnly,關閉透明化Session ID,User-Agent驗證,Token校驗等。