什么是會話固定攻擊?
會話固定攻擊(session fixation attack)是利用應用系統在服務器的會話ID固定不變機制,借助他人用相同的會話ID獲取認證和授權,然后利用該會話ID劫持他人的會話以成功冒充他人,造成會話固定攻擊。
會話固定也是會話劫持的一種類型。會話劫持是攻擊者偷走受害者與服務器建立鏈接的會話,而會話固定是攻擊者事先建立一個會話,然后誘使受害者使用此會話進行登錄,如圖10-7所示。
看下面Session Fixation攻擊的一個簡單例子:
整個攻擊流程是:
1、攻擊者Attacker以一個合法的用戶身份登錄www.website.com。
2、服務器與攻擊者Attacker建立了一個會話,sessionid為1234567(這里只是一個示例,大家不要在乎sessionid的位數對不對)。應用網站服務器返回一個會話ID給他;
3、攻擊者Attacker用該會話ID構造了一個URL:http://www.website.com/login.jsp?sessionid=1234567,發給了受害者Alice ;
4- 受害者Victim點擊該鏈接,進行了登錄;
5、受害者Victim輸入她的合法用戶名和密碼,正常登錄了該網站,會話成功建立(注意,由於此時的sessionid預先已經被Bob設置為1234567了);
6、攻擊者Attacker用該會話ID成功冒充並劫持了受害者Victim的會話,這時攻擊者Attacker如果輸入http://www.website.com/viewprofile.jsp?sessionid=1234567,就可以看到受害者Victim的個人信息(profile)了,因此sessionid此時就是代表了Victim;
更多攻擊例子參考:https://owasp.org/www-community/attacks/Session_fixation
一般來說,會話固定可以通過下面幾種方式實現。
(1)在URL中注入Session ID,這是最簡單的一種方式,當然也最容易被檢測到。
(2)用隱藏的表單字節。攻擊者可以構造一個很像登錄方式的登錄表單並設定Session ID,然后誘惑用戶登錄。
(3)通過跨站腳本用客戶端腳本來設定Cookie,如攻擊者可以構造一個鏈接如下:http://www.buybook.com/viewprofile.jsp?p=30。
(4)通過跨站腳本用標簽進行設定,如攻擊者可以構造一個鏈接如下:http://www. buybook.com/viewprofile.jsp?p=30。
會話ID(SID):由服務器產生並返回給瀏覽器的請求,並且在瀏覽器中存儲(通常來說是Cookie),它用來標識瀏覽器與服務器會話的唯一值。
攻擊分析
攻擊的整個過程,會話ID是沒變過的,所以導致此漏洞。
攻擊修復
1、登錄重建會話
每次登錄后都重置會話ID,並生成一個新的會話ID,這樣攻擊者就無法用自己的會話ID來劫持會話,核心代碼如下。
2、禁用客戶端訪問Cookie
此方法也避免了配合XSS攻擊來獲取Cookie中的會話信息以達成會話固定攻擊。在Http響應頭中啟用HttpOnly屬性,或者在tomcat容器中配置。