iT邦幫忙

1

ASP.net 使用者登入 重新生成SessionID

  • 分享至 

  • xImage

抱歉 雖然在其他論壇上有些人給我了一些建議,但有點複雜,來這邊問問看有沒有什麼其他的方法能解決。
關於 Session Fixationx漏洞 他的修復方法有>用戶登入後重置SessionID(ASP.net 是叫做ASP.net_SessionID 沒錯吧?)

我的網頁登入畫面,一進入就有生成ASP.net_SessionID(F12看的
那這個漏洞修復方法應該就是登入進去後 ASP.net_SessionID 要改變對吧?
但我也有看了其他文章,他們都在Login按鈕裡寫上:

Session.Clear();
Session.Abandon();
Response.Cookies.Add(new HttpCookie("ASP.NET_SessionID",""));

我也在我的登入按鈕中加入,但這樣沒辦法登入,應該如何解決呢?

froce iT邦大師 1 級 ‧ 2021-12-15 09:14:30 檢舉
你的code看起來就只是logout而已...
並不是你說的重給session。
Homura iT邦高手 1 級 ‧ 2021-12-15 11:53:45 檢舉
sessioncookie不用清掉吧...
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 個回答

1
Samuel
iT邦好手 1 級 ‧ 2021-12-15 12:36:55

Session Fixation(固定 Session ID)
通常攻擊者會藉由以下資源再進行存取
URL
cookie
hidden field
取得有效的session id後就能駭入

防範方案
1.禁用GET (URL)傳遞Session ID
2.登入後要記得更新session id

在asp.net技術中
當使用者登入進系統會多存一個
叫"ASP.NET_SessionId"的cookie
在client side browser
所以你在logout事件無論是執行下列何種方法
Session.Abandon()
Session.Clear()
Session.RemoveAll()
都不會把client side的cookie存的session id清掉
這些都只是從server side記憶體清除的
所以不能只有做這幾個動作

還要記得去判斷Request.Cookies["ASP.NET_SessionId"] 是否為空
將其清掉設空字串之類的或設置有效期限
Response.Cookies["ASP.NET_SessionId"].Value = "";
Response.Cookies["ASP.NET_SessionId"].Expires = DateTime.Now.AddDays(-1d);

建議在登入跟登出都多增加一個唯一性隨機產生的AuthToken
Cookies加上去也可以

可參考如下做法
https://www.c-sharpcorner.com/UploadFile/ajyadav123/session-fixation-vulnerability-detection-in-Asp-Net/

看更多先前的回應...收起先前的回應...

請問 登入後如何更新 SessionID呢?

Samuel iT邦好手 1 級 ‧ 2021-12-15 13:20:14 檢舉

做在logout事件
第一種.
Response.Cookies.Add(new HttpCookie("ASP.NET_SessionId", ""));
第二種.
Response.Cookies["ASP.NET_SessionId"].Value = "";

Samuel iT邦好手 1 級 ‧ 2021-12-15 13:32:07 檢舉

登入事件中不能call這幾個method這樣你session都被清光了
Session.Abandon()
Session.Clear()
Session.RemoveAll()
至於重新更新session id是在其他程式語言特性實作方式不同
https://ithelp.ithome.com.tw/articles/10246787?sc=iThelpR

Samuel iT邦好手 1 級 ‧ 2021-12-15 13:33:57 檢舉

Session Fixation在其他程式語言或框架處理機制都不同
有些說更新session id是因為他們有支援這種機制

asp.net裡面沒有像php這種方便機制
https://stackoverflow.com/questions/38138682/how-to-change-sessionid-after-login-in-net

通常就只會在登出時把SessionID清除而已
當然更嚴謹一點可到config 設定sessionState timeout

froce iT邦大師 1 級 ‧ 2021-12-15 14:39:30 檢舉

這種時候就得吹一下Django了,都幫你包在logout這函式裡。

能問一下這篇文章的示例嗎
https://www.codeproject.com/Articles/210993/Session-Fixation-vulnerability-in-ASP-NET
他的方法 在登入時給一個GUID 存在cookie中 之後去做比對
那我想問的是 我要如何拿驗證過的ASP.net_Session去做登入的動作呢?

Samuel iT邦好手 1 級 ‧ 2021-12-15 15:10:35 檢舉

它那種多綁定一個自己每次登入隨機產生的token做法
就是多加一道密碼鎖概念
怕今天session id已經被拿到
但是因為PageLoad 每次Postback事件都會去多比對那個 token
所以不再是只有比對session id
因為每一次登入都會多隨機產生一個GUID存在Server
這樣子也可以讓其他台電腦可能已經竊取session id登入的失效
因為不知道現在server上存的token在新一次登入後產生的結果為何,也是另一種形式的CSRF

有什麼方法能用已驗證過的 ASP.net_SessionId 去測試看看嗎

我要發表回答

立即登入回答