1. 程式人生 > >【AppScan深入淺出】修復漏洞:會話標識未更新(中危)

【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中,對“會話標識未更新”也提供了修改建議:

一般修訂建議 始終生成新的會話,供使用者成功認證時登入。防止使用者操縱會話標識。請勿接受使用者瀏覽器登入時所提供的會話標識

結果確認

使用程式碼前

clip_image002

使用程式碼後

clip_image002[12]

為何會產生漏洞

有人會問這個漏洞為何會產生? 為什麼有的站點會出現,有的站點沒有使用程式碼卻又不會出現。寫在最後,我提供一個思路,這樣才是深入淺出的研究問題:

有時候網站登入頁面,並不會立刻產生SessionId,例如我寫的登入頁面,頁面中是不會出現ASP.NET_SessionId:(使用Chrome+Edit This Cookie外掛)

image

登入後才會出現ASP.NET_SessionId,另一個是登入程式碼中增加的驗證Cookie。

image

但是當我在登入頁載入之前,添加了資訊在使用者Session中(例如為了新增圖形驗證碼的需要),這時候登入頁載入的時候就會產生SessionId

1 2 3 4 5 protected void Page_Load(object sender, EventArgs e) { //產生會話標識未更新漏洞 Session["useless"] = 1; }

image

一旦登入前就有SessionId,那麼AppScan就有了可以比較的SessionId,在登入後比較SessionId的變化,那麼也就會產生“會話標識未更新”漏洞。

寫在最後的最後,“會話標識未更新”的危害,在於攻擊者通過某種方式(如XSS)將自己的Id置入了被攻擊者的瀏覽器,將會話標識改為某個攻擊者預設的值,被攻擊者正常登陸,若伺服器接收了這個預設值,那麼相當於攻擊者獲得了被攻擊者登入後的許可權,因此才要求在登入時更新會話標識。