【AppScan深入淺出】修復漏洞:會話標識未更新(中危)
關於“會話標識未更新”,其實我覺得應該是頗有爭議的,為何登入後不更新會話標識就會存在危險,是不是擔心讀取到舊會話中存在Session的取值呢?這個恕我不懂。
關於漏洞的產生
“會話標識未更新”是中危漏洞,AppScan會掃描“登入行為”前後的Cookie,其中會對其中的JSESSIONOID(JSP)或者 ASP.NET_SessionId(ASP)進行記錄。在登入行為發生後,如果cookie中這個值沒有發生變化,則判定為“會話標識未更新”漏洞。
修復方式
ASP的修復方法可以參考以下程式碼,在登入按鈕點選後,確認登入前,加入3行程式碼對Cookie進行清空已達到重置SessionId的效果。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
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" );
}
|
1 |
}
|
AppScan中,對“會話標識未更新”也提供了修改建議:
一般修訂建議 始終生成新的會話,供使用者成功認證時登入。防止使用者操縱會話標識。請勿接受使用者瀏覽器登入時所提供的會話標識
結果確認
使用程式碼前
使用程式碼後
為何會產生漏洞
有人會問這個漏洞為何會產生? 為什麼有的站點會出現,有的站點沒有使用程式碼卻又不會出現。寫在最後,我提供一個思路,這樣才是深入淺出的研究問題:
有時候網站登入頁面,並不會立刻產生SessionId,例如我寫的登入頁面,頁面中是不會出現ASP.NET_SessionId:(使用Chrome+Edit This Cookie外掛)
登入後才會出現ASP.NET_SessionId,另一個是登入程式碼中增加的驗證Cookie。
但是當我在登入頁載入之前,添加了資訊在使用者Session中(例如為了新增圖形驗證碼的需要),這時候登入頁載入的時候就會產生SessionId
1 2 3 4 5 |
protected void Page_Load( object sender,
EventArgs e)
{
//產生會話標識未更新漏洞
Session[ "useless" ]
= 1;
}
|
一旦登入前就有SessionId,那麼AppScan就有了可以比較的SessionId,在登入後比較SessionId的變化,那麼也就會產生“會話標識未更新”漏洞。
寫在最後的最後,“會話標識未更新”的危害,在於攻擊者通過某種方式(如XSS)將自己的Id置入了被攻擊者的瀏覽器,將會話標識改為某個攻擊者預設的值,被攻擊者正常登陸,若伺服器接收了這個預設值,那麼相當於攻擊者獲得了被攻擊者登入後的許可權,因此才要求在登入時更新會話標識。