資安JAVA(一):Session固定攻擊

來源:John Melton's Weblog
標題:YEAR OF SECURITY FOR JAVA – WEEK 1 – SESSION FIXATION PREVENTION
作者:John Melton
內文:

What is it and why do I care?

Session 固定攻擊,屬於 Session挾持攻擊的一種。一般攻擊流程如下:

第一步,攻擊者取得網站發出的合法Session ID。
第二步,攻擊者強迫受害者使用同樣的Session ID。
第三步,攻擊者確認該Session ID已使用,且受害者已登入。攻擊者便可以用受害者身分登入。

第二步是攻擊者的主要手段,執行方式通常是攻擊者送出包含Session ID的惡意連結給受害者。當使用者A能夠存取使用者B的帳號時,很明顯的會產生嚴重問題。

What should I do about it?

還好這個問題並不難解決。作者的建議是:當使用者合法登入後,廢止登入前的 Session
而解決方法的執行流程如下:

第一步,使用者輸入正確的帳密。
第二步,系統成功的鑑別使用者身分。
第三步,任何需要保留的Session資訊將被移動到暫存區。
第四步,設定Session為失效。(HttpSession#invalidate())
第五步,產生新的Session。(新Session ID)
第六步,將暫存區的Session資訊,覆蓋到新的Session中。
第七步,使用者以新Session ID 轉向到登入成功頁面。

以下列出OWASP的 ESAPI 的程式碼,示範如何更新Session ID:
(點選資料來源,重點在changeSessionIdentifier 方法。)

public HttpSession changeSessionIdentifier(HttpServletRequest request) throws AuthenticationException
{
  // 1.get the current session
  HttpSession oldSession = request.getSession();
  // 2.make a copy of the session content
  Map temp = new ConcurrentHashMap();
  Enumeration e = oldSession.getAttributeNames();
  while (e != null && e.hasMoreElements())
  {
     String name = (String) e.nextElement();
     Object value = oldSession.getAttribute(name);
     temp.put(name, value);
  }
  // 3.kill the old session and create a new one
  oldSession.invalidate();
  HttpSession newSession = request.getSession();
  User user = ESAPI.authenticator().getCurrentUser();
  user.addSession( newSession );
  user.removeSession( oldSession );
  // 4.copy back the session content to new session
  for (Map.Entry stringObjectEntry : temp.entrySet())
  {
    newSession.setAttribute(stringObjectEntry.getKey(),  stringObjectEntry.getValue());
  }
  return newSession;
}


除此之外,還有一些技巧可以協助你:

1.確認是否某個使用者以失效的Session ID登入。(可以Least Recently Used 策略維護該ID清單。)
2.確認是否某個使用者以同樣的Session ID從不同的IP登入。(IP資料以地圖形式存放。)
3.假如你發現某些惡意行為,試著使用監視外掛(例如 OWASP 的 AppSensor)來保護你的網站,並在攻擊發生時能通知你處理。

總結以上,Session固定攻擊是很嚴重的問題,但解決辦法卻很簡單。你的最佳策略就是將適合的解決方案加入到您的企業 Framework 中(例如 OWASP 的 ESAPI ),這樣就能一次套用到所有網站。

參考資料:
TWISC@NTUST網路應用安全知識庫
https://www.owasp.org/index.php/Session_fixation
http://www.acros.si/papers/session_fixation.pdf
http://cwe.mitre.org/data/definitions/384.html
http://projects.webappsec.org/w/page/13246960/Session%20Fixation
———–———–
資安Java: 上一篇 || 下一篇
———–———–

留言

這個網誌中的熱門文章

資安JAVA(八):HTTP強制傳輸安全(HSTS)

以 SharpPcap 實作可收聽封包的 C# 程式

資安JAVA(四):Session Cookie HTTPOnly Flag