1. 攻擊場景
session fixation會話偽造攻擊是一個蠻婉轉的過程。
比如,當我要是使用session fixation攻擊你的時候,首先訪問這個網站,網站會創建一個會話,這時我可以把附有jsessionid的url發送給你。
http://unsafe/index.jsp;jsessionid=1pjztz08i2u4i
你使用這個網址訪問網站,結果你和我就會公用同一個jsessionid了,結果就是在服務器中,我們兩人使用的是同一個session。
這時我只要祈求你在session過期之前登陸系統,然后我就可以使用jsessionid直接進入你的后台了,然后可以使用你在系統中的授權做任何事情。
簡單來說,我創建了一個session,然后把jsessionid發給你,你傻乎乎的就使用我的session進行了登陸,結果等於幫我的session進行了授權操作,結果就是我可以使用一開始創建的session進入系統做任何事情了。
與會話偽造的詳細信息可以參考http://en.wikipedia.org/wiki/Session_fixation。
2. 解決會話偽造
解決session fix的問題其實很簡單,只要在用戶登錄成功之后,銷毀用戶的當前session,並重新生成一個session就可以了。
Spring Security默認就會啟用session-fixation-protection,這會在登錄時銷毀用戶的當前session,然后為用戶創建一個新session,並將原有session中的所有屬性都復制到新session中。
如果希望禁用session-fixation-protection,可以在http中將session-fixation-protection設置為none。
<http auto-config='true'>
<intercept-url pattern="/admin.jsp" access="ROLE_ADMIN" />
<intercept-url pattern="/**" access="ROLE_USER" />
<session-management session-fixation-protection="none"/>
</http>
session-fixation-protection的值共有三個可供選擇,none,migrateSession和newSession。默認使用的是migrationSession,如同我們上面所講的,它會將原有session中的屬性都復制到新session中。上面我們也見到了使用none來禁用session-fixation功能的場景,最后剩下的newSession會在用戶登錄時生成新session,但不會復制任何原有屬性。