關於“會話標識未更新”,其實我覺得應該是頗有爭議的,為何登錄后不更新會話標識就會存在危險,是不是擔心讀取到舊會話中存在Session的取值呢?這個恕我不懂。
關於漏洞的產生
“會話標識未更新”是中危漏洞,AppScan會掃描“登錄行為”前后的Cookie,其中會對其中的JSESSIONOID(JSP)或者 ASP.NET_SessionId(ASP)進行記錄。在登錄行為發生后,如果cookie中這個值沒有發生變化,則判定為“會話標識未更新”漏洞。
修復方式
JSP的修復方法可參考這位大俠的文章,我個人沒有確認過:http://blog.csdn.net/yutan_313/article/details/6260573
ASP的修復方法可以參考以下代碼,在登錄按鈕點擊后,確認登錄前,加入3行代碼對Cookie進行清空已達到重置SessionId的效果。
protected void btnLogin_Click(object sender, EventArgs e) { //重置SessionId Session.Clear(); Session.Abandon(); Response.Cookies.Add(new HttpCookie("ASP.NET_SessionId", "")); //登錄判斷 if (check(txtName.Text,txtPassword.Text)) { FormsAuthentication.SetAuthCookie("admin", false); Response.Redirect("Default.aspx"); }
}
AppScan中,對“會話標識未更新”也提供了修改建議:
一般修訂建議 始終生成新的會話,供用戶成功認證時登錄。防止用戶操縱會話標識。請勿接受用戶瀏覽器登錄時所提供的會話標識
結果確認
使用代碼前
使用代碼后
為何會產生漏洞
有人會問這個漏洞為何會產生? 為什么有的站點會出現,有的站點沒有使用代碼卻又不會出現。寫在最后,我提供一個思路,這樣才是深入淺出的研究問題:
有時候網站登錄頁面,並不會立刻產生SessionId,例如我寫的登錄頁面,頁面中是不會出現ASP.NET_SessionId:(使用Chrome+Edit This Cookie插件)
登錄后才會出現ASP.NET_SessionId,另一個是登錄代碼中增加的驗證Cookie。
但是當我在登錄頁加載之前,添加了信息在用戶Session中(例如為了添加圖形驗證碼的需要),這時候登錄頁加載的時候就會產生SessionId
protected void Page_Load(object sender, EventArgs e) { //產生會話標識未更新漏洞 Session["useless"] = 1; }
一旦登錄前就有SessionId,那么AppScan就有了可以比較的SessionId,在登錄后比較SessionId的變化,那么也就會產生“會話標識未更新”漏洞。
寫在最后的最后,“會話標識未更新”的危害,在於攻擊者通過某種方式(如XSS)將自己的Id置入了被攻擊者的瀏覽器,將會話標識改為某個攻擊者預設的值,被攻擊者正常登陸,若服務器接收了這個預設值,那么相當於攻擊者獲得了被攻擊者登錄后的權限,因此才要求在登錄時更新會話標識。