失效的身份認(rèn)證和會話管理
與身份認(rèn)證和回話管理相關(guān)的應(yīng)用程序功能往往得不到正確的實現(xiàn),這就導(dǎo)致了攻擊者破壞密碼熙涤、密鑰舔哪、會話令牌或攻擊其他的漏洞去冒充其他用戶的身份(暫時或永久的)穴豫。
我存在會話劫持漏洞嗎?
如何能夠保護用戶憑證和會話ID等會話管理資產(chǎn)呢渤滞?以下情況可能產(chǎn)生漏洞:
1.用戶身份驗證憑證沒有使用哈希或加密保護因俐。
2.認(rèn)證憑證可猜測拇惋,或者能夠通過薄弱的的帳戶管理功能(例如賬戶創(chuàng)建、密碼修改抹剩、密碼恢復(fù), 弱會話ID)重寫撑帖。
3.會話ID暴露在URL里(例如, URL重寫)。
4.會話ID容易受到會話固定(session fixation)的攻擊澳眷。
5.會話ID沒有超時限制磷仰,或者用戶會話或身份驗證令牌特別是單點登錄令牌在用戶注銷時沒有失效。
6.成功注冊后,會話ID沒有輪轉(zhuǎn)境蔼。
7.密碼灶平、會話ID和其他認(rèn)證憑據(jù)使用未加密連接傳輸。
攻擊案例場景
- 場景#1:機票預(yù)訂應(yīng)用程序支持URL重寫箍土,把會話ID放在URL里:
http://example.com/sale/saleitems;jsessionid=2P0OC2JDPXM0OQSNDLPSKHCJUN2JV?dest=Hawaii
該網(wǎng)站一個經(jīng)過認(rèn)證的用戶希望讓他朋友知道這個機票打折信息逢享。他將上面鏈接通過郵件發(fā)給他朋友們,并不知道自己已經(jīng)泄漏了自己的會話ID吴藻。當(dāng)他的朋友們使用上面的鏈接時瞒爬,他們將會使用他的會話和信用卡。 - 場景#2:應(yīng)用程序超時設(shè)置不當(dāng)。用戶使用公共計算機訪問網(wǎng)站侧但。離開時矢空,該用戶沒有點擊退出,而是直接關(guān)閉瀏覽器禀横。攻擊者在一個小時后能使用相同瀏覽器通過身份認(rèn)證屁药。鹽
- 場景#3:內(nèi)部或外部攻擊者進入系統(tǒng)的密碼數(shù)據(jù)庫。存儲在數(shù)據(jù)庫中的用戶密碼沒有被哈希和加鹽, 所有用戶的密碼都被攻擊者獲得柏锄。
如何防止?
1酿箭、區(qū)分公共區(qū)域和受限區(qū)域
站點的公共區(qū)域允許任何用戶進行匿名訪問。受限區(qū)域只能接受特定用戶的訪問趾娃,而且用戶必須通過站點的身份驗證缭嫡。考慮一個典型的零售網(wǎng)站抬闷。您可以匿名瀏覽產(chǎn)品分類妇蛀。當(dāng)您向購物車中添加物品時,應(yīng)用程序?qū)⑹褂脮挊?biāo)識符驗證您的身份笤成。最后讥耗,當(dāng)您下訂單時,即可執(zhí)行安全的交易疹启。這需要您進行登錄,以便通過SSL 驗證交易蔼卡。
將站點分割為公共訪問區(qū)域和受限訪問區(qū)域喊崖,可以在該站點的不同區(qū)域使用不同的身份驗證和授權(quán)規(guī)則,從而限制對 SSL 的使用雇逞。使用SSL 會導(dǎo)致性能下降荤懂,為了避免不必要的系統(tǒng)開銷,在設(shè)計站點時塘砸,應(yīng)該在要求驗證訪問的區(qū)域限制使用 SSL节仿。
2、對最終用戶帳戶使用帳戶鎖定策略
當(dāng)最終用戶帳戶幾次登錄嘗試失敗后掉蔬,可以禁用該帳戶或?qū)⑹录懭肴罩纠认堋H绻褂?Windows 驗證(如 NTLM 或Kerberos協(xié)議),操作系統(tǒng)可以自動配置并應(yīng)用這些策略女轿。如果使用表單驗證箭启,則這些策略是應(yīng)用程序應(yīng)該完成的任務(wù),必須在設(shè)計階段將這些策略合并到應(yīng)用程序中蛉迹。
請注意傅寡,帳戶鎖定策略不能用于抵制服務(wù)攻擊。例如,應(yīng)該使用自定義帳戶名替代已知的默認(rèn)服務(wù)帳戶(如IUSR_MACHINENAME)荐操,以防止獲得 Internet 信息服務(wù) (IIS) Web服務(wù)器名稱的攻擊者鎖定這一重要帳戶芜抒。
3、支持密碼有效期
密碼不應(yīng)固定不變托启,而應(yīng)作為常規(guī)密碼維護的一部分宅倒,通過設(shè)置密碼有效期對密碼進行更改。在應(yīng)用程序設(shè)計階段驾中,應(yīng)該考慮提供這種類型的功能唉堪。
4、能夠禁用帳戶
如果在系統(tǒng)受到威脅時使憑證失效或禁用帳戶肩民,則可以避免遭受進一步的攻擊唠亚。5、不要在用戶存儲中存儲密碼
如果必須驗證密碼持痰,則沒有必要實際存儲密碼灶搜。相反,可以存儲一個單向哈希值工窍,然后使用用戶所提供的密碼重新計算哈希值割卖。為減少對用戶存儲的詞典攻擊威脅,可以使用強密碼患雏,并將隨機salt 值與該密碼結(jié)合使用鹏溯。
5、要求使用強密碼
不要使攻擊者能輕松破解密碼淹仑。有很多可用的密碼編制指南丙挽,但通常的做法是要求輸入至少 8位字符,其中要包含大寫字母匀借、小寫字母颜阐、數(shù)字和特殊字符。無論是使用平臺實施密碼驗證還是開發(fā)自己的驗證策略吓肋,此步驟在對付粗暴攻擊時都是必需的凳怨。在粗暴攻擊中,攻擊者試圖通過系統(tǒng)的試錯法來破解密碼是鬼。使用常規(guī)表達式協(xié)助強密碼驗證肤舞。
6、不要在網(wǎng)絡(luò)上以純文本形式發(fā)送密碼
以純文本形式在網(wǎng)絡(luò)上發(fā)送的密碼容易被竊聽均蜜。為了解決這一問題萨赁,應(yīng)確保通信通道的安全,例如兆龙,使用 SSL 對數(shù)據(jù)流加密杖爽。
7敲董、保護身份驗證 Cookie
身份驗證 cookie被竊取意味著登錄被竊取∥堪玻可以通過加密和安全的通信通道來保護驗證票證腋寨。另外,還應(yīng)限制驗證票證的有效期化焕,以防止因重復(fù)攻擊導(dǎo)致的欺騙威脅萄窜。在重復(fù)攻擊中,攻擊者可以捕獲cookie撒桨,并使用它來非法訪問您的站點查刻。減少 cookie 超時時間雖然不能阻止重復(fù)攻擊,但確實能限制攻擊者利用竊取的 cookie來訪問站點的時間凤类。
8穗泵、使用 SSL 保護會話身份驗證 Cookie
不要通過 HTTP 連接傳遞身份驗證 cookie。在授權(quán) cookie 內(nèi)設(shè)置安全的 cookie 屬性谜疤,以便指示瀏覽器只通過HTTPS 連接向服務(wù)器傳回 cookie佃延。
9、對身份驗證 cookie 的內(nèi)容進行加密
即使使用 SSL夷磕,也要對 cookie 內(nèi)容進行加密履肃。如果攻擊者試圖利用 XSS 攻擊竊取cookie,這種方法可以防止攻擊者查看和修改該 cookie坐桩。在這種情況下尺棋,攻擊者仍然可以使用 cookie 訪問應(yīng)用程序,但只有當(dāng)cookie 有效時绵跷,才能訪問成功膘螟。
10、限制會話壽命
縮短會話壽命可以降低會話劫持和重復(fù)攻擊的風(fēng)險抖坪。會話壽命越短,攻擊者捕獲會話 cookie并利用它訪問應(yīng)用程序的時間越有限闷叉。
11擦俐、避免未經(jīng)授權(quán)訪問會話狀態(tài)
考慮會話狀態(tài)的存儲方式。為獲得最佳性能握侧,可以將會話狀態(tài)存儲在 Web 應(yīng)用程序的進程地址空間蚯瞧。然而這種方法在 Web場方案中的可伸縮性和內(nèi)涵都很有限,來自同一用戶的請求不能保證由同一臺服務(wù)器處理品擎。在這種情況下埋合,需要在專用狀態(tài)服務(wù)器上進行進程外狀態(tài)存儲,或者在共享數(shù)據(jù)庫中進行永久性狀態(tài)存儲萄传。ASP.NET支持所有這三種存儲方式甚颂。
對于從 Web 應(yīng)用程序到狀態(tài)存儲之間的網(wǎng)絡(luò)連接,應(yīng)使用 IPSec 或 SSL 確保其安全,以降低被竊聽的危險振诬。另外蹭睡,還需考慮Web 應(yīng)用程序如何通過狀態(tài)存儲的身份驗證。
在可能的地方使用 Windows驗證赶么,以避免通過網(wǎng)絡(luò)傳遞純文本身份驗證憑據(jù)肩豁,并可利用安全的 Windows帳戶策略帶來的好處。
補充:
- 1. 設(shè)置httponly屬性.
httponly是微軟對cookie做的擴展,該值指定 Cookie 是否可通過客戶端腳本訪問, 解決用戶的cookie可能被盜用的問題,減少跨站腳本攻擊,主流的大多數(shù)瀏覽器已經(jīng)支持此屬性辫呻。
- asp.net全局設(shè)置:
//global中設(shè)置有所的cookie只讀
protected void Application_EndRequest(Object sender, EventArgs e)
{
foreach(string sCookie in Response.Cookies)
{
Response.Cookies[sCookie].HttpOnly = true;
Response.Cookies[sCookie].Secure = true;
}
}
- JAVA
httpOnly是cookie的擴展屬性清钥,并不包含在servlet2.x的規(guī)范里,因此一些javaee應(yīng)用服務(wù)器并不支持httpOnly放闺,針對tomcat祟昭,>6.0.19或者>5.5.28的版本才支持httpOnly屬性,具體方法是在conf/context.xml添加httpOnly屬性設(shè)置
<Context useHttpOnly="true"> ... </Context>
另一種設(shè)置httpOnly的方式是使用Tomcat的servlet擴展直接寫header
response.setHeader( "Set-Cookie", "name=value; HttpOnly");
- 2. 驗證成功后更換sessionID
在登錄驗證成功后雄人,通過重置session从橘,使之前的匿名sessionId失效,這樣可以避免使用偽造的sessionId進行攻擊础钠。代碼如下
protected void doPost(HttpServletRequest request, HttpServletResponse response) throwsServletException, IOException {
String username=request.getParameter("username");
Stringpassword=request.getParameter("password");
if("admin".equals(username) &&"pass".equals(password)){ //使之前的匿名session失效
request.getSession().invalidate();
request.getSession().setAttribute("login", true);
response.sendRedirect("hello.jsp");
}
else{
response.sendRedirect("login.jsp");
}
}