:密碼登錄、用戶枚舉與暴力破解防護(hù)缺陷)
身份驗證是應(yīng)用安全邊界的入口。它決定請求者是誰授權(quán)則在身份確認(rèn)之后決定該用戶可以訪問哪些數(shù)據(jù)、執(zhí)行哪些操作。本章圍繞密碼登錄展開重點分析三類問題攻擊者如何識別有效用戶名、如何提高密碼猜測效率以及限速與賬戶鎖定為什么可能因邏輯缺陷而失效。PortSwigger Lab 只用于驗證這些通用機制重點不在記憶具體操作而在理解認(rèn)證系統(tǒng)暴露了哪些可觀察差異。一、身份驗證的安全邊界1. 什么是身份驗證身份驗證Authentication是確認(rèn)用戶或客戶端真實身份的過程。常見認(rèn)證因素分為三類知識因素用戶知道的信息例如密碼、安全問題答案。持有因素用戶持有的實體例如手機、硬件令牌。固有因素用戶自身的特征例如生物識別或行為模式。只使用密碼屬于單因素認(rèn)證。系統(tǒng)一旦將“知道密碼”等同于“身份可信”密碼的泄露、猜中或驗證邏輯繞過就會直接導(dǎo)致賬戶失陷。2. Authentication 與 Authorization兩者保護(hù)的是不同階段Authentication 確認(rèn)“你是誰” ↓ Authorization 確認(rèn)“你能做什么”例如系統(tǒng)首先驗證登錄者是否確實為Carlos123然后再根據(jù)該賬戶的權(quán)限判斷其能否讀取其他用戶資料、刪除賬戶或進(jìn)入管理后臺。認(rèn)證漏洞與越權(quán)漏洞不能混為一談未登錄卻進(jìn)入賬戶屬于認(rèn)證繞過。已登錄普通用戶執(zhí)行管理員操作屬于授權(quán)缺陷。攻擊者獲取管理員憑據(jù)后正常登錄則是認(rèn)證系統(tǒng)失陷后獲得高權(quán)限。3. 身份驗證漏洞如何產(chǎn)生身份驗證漏洞通常來自兩類問題。第一類是認(rèn)證憑據(jù)強度不足或暴力破解防護(hù)薄弱例如沒有限速、密碼可預(yù)測、賬戶鎖定機制容易繞過。第二類是實現(xiàn)中的邏輯錯誤使攻擊者能夠跳過正常認(rèn)證流程也就是 Broken Authentication。身份驗證位于所有登錄后功能之前因此即使是很小的響應(yīng)差異或計數(shù)錯誤也可能被放大為完整的賬戶接管。4. 漏洞影響高權(quán)限賬戶被接管后攻擊者可能控制整個應(yīng)用甚至進(jìn)一步接觸內(nèi)部基礎(chǔ)設(shè)施。低權(quán)限賬戶同樣具有安全價值可以暴露用戶隱私或商業(yè)數(shù)據(jù)可以進(jìn)入公開頁面無法訪問的內(nèi)部功能可以提供更大的后續(xù)攻擊面泄露的憑據(jù)可能在其他系統(tǒng)中被重復(fù)使用。因此評估認(rèn)證漏洞時不能只看當(dāng)前賬戶擁有多少敏感數(shù)據(jù)還要分析登錄后新增的功能和信任關(guān)系。二、密碼認(rèn)證與暴力破解密碼登錄的基本假設(shè)是用戶名標(biāo)識賬戶 只有賬戶所有者知道正確密碼 登錄者身份可信只要攻擊者能夠獲得或猜中一組有效憑據(jù)這個假設(shè)就會失效。暴力破解并不只是遍歷所有可能字符。實際攻擊通常結(jié)合公開信息、常見用戶名、密碼泄露數(shù)據(jù)和用戶行為規(guī)律以縮小搜索范圍。1. 用戶名為什么容易預(yù)測企業(yè)用戶名經(jīng)常遵循固定格式例如firstname.lastnameexample.com管理員賬戶還可能直接使用admin administrator support應(yīng)用自身也可能公開用戶名線索例如無需登錄即可訪問的用戶資料頁面作者名稱與登錄用戶名相同HTTP 響應(yīng)中包含員工郵箱管理員或技術(shù)支持人員的信息被公開展示。用戶名本身不一定被視為秘密但一旦確認(rèn)某個用戶名有效后續(xù)密碼攻擊的范圍就從“用戶名和密碼的組合”縮小為“只猜密碼”。2. 強制復(fù)雜密碼不等于不可預(yù)測密碼策略通常要求達(dá)到最低長度同時包含大小寫字母包含數(shù)字包含特殊字符。問題在于用戶通常不會真正隨機生成密碼而是把容易記憶的密碼修改到符合規(guī)則例如mypassword Mypassword1! Myp4$$w0rd強制定期修改密碼還可能產(chǎn)生可預(yù)測變化Mypassword1! Mypassword1? Mypassword2!因此密碼字典的價值不只是收錄常用密碼還在于模擬人類滿足密碼策略時形成的變形規(guī)律。三、用戶名枚舉從響應(yīng)差異識別有效賬戶用戶名枚舉是指攻擊者通過應(yīng)用行為差異判斷某個用戶名是否存在。理想的登錄接口應(yīng)當(dāng)讓以下情況表現(xiàn)一致用戶名不存在 用戶名存在但密碼錯誤如果兩者在狀態(tài)碼、錯誤信息、響應(yīng)長度或處理時間上出現(xiàn)穩(wěn)定差異攻擊者就可能篩選出有效用戶名。1. 不同錯誤信息典型的不安全實現(xiàn)可能分別返回Invalid username Incorrect password這直接暴露了認(rèn)證流程執(zhí)行到了哪一步Invalid username → 用戶查詢階段失敗 Incorrect password → 用戶存在但密碼校驗失敗PortSwigger 的“Username enumeration via different responses”實驗就是通過明顯不同的登錄響應(yīng)先確認(rèn)用戶名再固定該用戶名測試候選密碼。實驗揭示的通用問題是服務(wù)器把內(nèi)部認(rèn)證失敗原因原樣暴露給了客戶端。2. 細(xì)微的響應(yīng)差異有些應(yīng)用表面上使用了相同錯誤信息但實際上可能存在句號差異大小寫差異多余空格不可見字符HTML 結(jié)構(gòu)或響應(yīng)長度不同。瀏覽器渲染后的頁面看起來可能完全一致但 Burp 可以比較原始響應(yīng)和響應(yīng)長度?!癠sername enumeration via subtly different responses”實驗的重點不是尋找某個固定字符串而是建立對照大量無效用戶名 → 響應(yīng)模式基本相同 某個用戶名 → 出現(xiàn)穩(wěn)定的細(xì)微差異只有可重復(fù)出現(xiàn)的差異才能作為用戶名有效的證據(jù)單次長度波動或網(wǎng)絡(luò)異常不能直接證明結(jié)論。3. 不同 HTTP 狀態(tài)碼如果大多數(shù)錯誤請求返回同一個狀態(tài)碼而某個用戶名返回不同狀態(tài)碼也可能說明應(yīng)用進(jìn)入了不同認(rèn)證分支。例如無效用戶名200 OK 有效用戶名302 Found狀態(tài)碼差異不一定意味著已經(jīng)登錄成功也可能只是錯誤處理方式不同。需要繼續(xù)檢查Location、響應(yīng)正文和后續(xù)頁面。4. 響應(yīng)時間差異一種常見后端邏輯是查詢用戶名 ├─ 不存在 → 立即返回 └─ 存在 → 繼續(xù)驗證密碼 → 返回有效用戶名需要額外執(zhí)行密碼驗證因此響應(yīng)時間可能稍長。PortSwigger 的“Username enumeration via response timing”實驗使用超長錯誤密碼是為了放大這條分支的處理成本無效用戶名 → 不執(zhí)行完整密碼處理 → 超長密碼影響較小 有效用戶名 → 執(zhí)行密碼處理 → 超長輸入使時間差更明顯普通錯誤密碼理論上也可能產(chǎn)生時間差但差異可能只有幾毫秒容易被網(wǎng)絡(luò)抖動覆蓋。超長密碼的作用不是改變驗證結(jié)果而是放大有效用戶名分支的計算開銷。這種方法不是所有系統(tǒng)都適用。只有當(dāng)密碼處理成本確實受輸入長度影響并且無效用戶名與有效用戶名走不同分支時超長密碼才有意義。測試時間差時還需要對同一用戶名重復(fù)請求比較平均值或中位數(shù)控制并發(fā)、網(wǎng)絡(luò)波動和限速不根據(jù)一次異常響應(yīng)下結(jié)論。四、Burp 中的測試方法用戶名枚舉和密碼爆破應(yīng)拆成兩個階段而不是直接測試用戶名與密碼的全部組合。1. 第一階段確定有效用戶名固定一個錯誤密碼只把用戶名設(shè)置為 payload 位置username§candidate§passwordknown-wrong-password然后比較Status codeResponse length錯誤信息重定向位置Response received 時間。2. 第二階段驗證候選密碼確認(rèn)用戶名后將用戶名固定只替換密碼usernamecarlospassword§candidate§這樣可以顯著減少請求數(shù)量并避免無意義的用戶名與密碼笛卡爾積。3. Intruder 攻擊類型的含義Sniper使用一個 payload 集依次測試位置適合只改變用戶名或密碼。Battering ram把同一個 payload 同時填入多個位置。Pitchfork多個 payload 集按相同行號并行組合。Cluster bomb測試不同 payload 集的全部組合。如果有 100 個用戶名和100 個密碼Cluster bomb 會產(chǎn)生100 × 100 10,000 次請求更合理的策略是先用約100次請求找到用戶名再用約100次請求測試密碼。五、暴力破解防護(hù)為什么會失效常見防護(hù)有兩類對被反復(fù)嘗試的賬戶進(jìn)行鎖定對短時間發(fā)送大量請求的客戶端 IP 進(jìn)行封禁。兩者都能增加攻擊成本但如果計數(shù)維度、重置條件或代理配置存在錯誤仍然可能被繞過。1. IP 封禁的重置邏輯缺陷某些系統(tǒng)在同一 IP 連續(xù)登錄失敗后封禁該 IP但只要該 IP 成功登錄一次就會重置失敗計數(shù)器。攻擊者可以在密碼字典中定期插入自己的正確憑據(jù)嘗試受害者密碼 1 嘗試受害者密碼 2 使用自己的賬戶成功登錄 嘗試受害者密碼 3 嘗試受害者密碼 4 使用自己的賬戶成功登錄在對應(yīng) PortSwigger Lab 中wiener:peter的作用不是攻擊目標(biāo)賬戶而是周期性觸發(fā)成功登錄從而清空當(dāng)前 IP 的失敗計數(shù)。漏洞根因是防護(hù)系統(tǒng)把“任意賬戶登錄成功”錯誤地當(dāng)成當(dāng)前來源不再可疑而沒有分別記錄每個目標(biāo)賬戶的失敗行為。Burp 本身沒有一個專門表示“每隔固定數(shù)量自動插入同一值”的攻擊模式??梢灶A(yù)先生成交錯的用戶名和密碼列表再使用 Pitchfork 按行配對發(fā)送。2. 修改X-Forwarded-For如果應(yīng)用錯誤信任客戶端提供的X-Forwarded-For: 198.51.100.10攻擊者可能通過不斷修改這個值偽造來源 IP。但這不是通用繞過方式。只有后端沒有正確區(qū)分可信反向代理添加的請求頭和客戶端直接提交的請求頭時才成立。正確的系統(tǒng)應(yīng)只信任已配置代理寫入的最末端地址并刪除外部傳入的偽造值。3. 賬戶鎖定與用戶名枚舉賬戶鎖定可以限制針對單個賬戶的大量密碼猜測但鎖定行為本身也可能暴露用戶名。例如無效用戶名連續(xù)嘗試 → 始終返回普通錯誤 有效用戶名連續(xù)嘗試 → 返回賬戶已鎖定攻擊者可以通過“是否觸發(fā)鎖定”判斷用戶名是否存在。賬戶鎖定還容易被用于拒絕服務(wù)攻擊者不需要知道受害者密碼只要反復(fù)提交錯誤密碼就可能讓受害者無法登錄。4. Password Spraying假設(shè)系統(tǒng)允許每個賬戶失敗三次攻擊者就不應(yīng)針對一個賬戶嘗試大量密碼而可以選擇不超過三組高概率密碼對大量用戶名分別測試password1 → 測試所有候選用戶 password2 → 測試所有候選用戶 password3 → 測試所有候選用戶每個賬戶只發(fā)生少量失敗不一定觸發(fā)賬戶鎖定攻擊者只需要某個用戶使用其中一個常見密碼即可。這說明賬戶鎖定主要限制針對單個賬戶的縱向爆破卻不一定阻止針對大量賬戶的橫向密碼噴灑。5. Credential StuffingCredential stuffing 使用數(shù)據(jù)泄露中已經(jīng)出現(xiàn)的真實username:password組合登錄其他網(wǎng)站。由于每個賬戶可能只被嘗試一次賬戶鎖定通常不會觸發(fā)。其利用的是用戶跨站復(fù)用密碼而不是單純猜測密碼。六、User Rate Limiting 的邊界User rate limiting 通常按照一段時間內(nèi)來自某個 IP 的請求數(shù)量進(jìn)行限制。超過閾值后IP 可能通過以下方式解除封禁等待固定時間管理員手動解除完成 CAPTCHA通過其他人工驗證。與賬戶鎖定相比IP 限速不容易被直接用于鎖死指定賬戶也較少通過鎖定提示暴露用戶名但仍存在兩個主要問題。第一服務(wù)器可能錯誤識別客戶端 IP例如不安全地信任X-Forwarded-For。第二限速器可能統(tǒng)計 HTTP 請求數(shù)量而認(rèn)證邏輯在一個請求中執(zhí)行多次密碼驗證。例如某個接口允許數(shù)組、批處理或 GraphQL 請求限速器記錄1 次 HTTP 請求 認(rèn)證代碼執(zhí)行多個密碼檢查這種繞過要求應(yīng)用確實存在批處理或參數(shù)解析缺陷普通登錄表單并不會自動支持一個請求猜測多個密碼。因此防護(hù)系統(tǒng)需要統(tǒng)計實際認(rèn)證行為而不只是進(jìn)入登錄接口的 HTTP 請求數(shù)量。七、HTTP Basic AuthenticationHTTP Basic Authentication 的典型流程是客戶端訪問受保護(hù)資源 ↓ 服務(wù)器返回 401 WWW-Authenticate: Basic realm... ↓ 瀏覽器獲取用戶名和密碼 ↓ 拼接 username:password ↓ Base64 編碼 ↓ 發(fā)送 Authorization 請求頭例如Authorization: Basic d2llbmVyOnBldGVy其中 Base64 解碼后的內(nèi)容為wiener:peterBase64 只是編碼不是加密。Basic Authentication 發(fā)送的不是隨機 Session ID而是用戶名和密碼的可逆表示。其格式由 RFC 7617定義。瀏覽器通常會緩存憑據(jù)并在相應(yīng)的認(rèn)證保護(hù)范圍內(nèi)重復(fù)發(fā)送。因此它存在以下風(fēng)險每個請求都攜帶等價于真實密碼的靜態(tài)憑據(jù)如果沒有 HTTPS憑據(jù)可能被中間人截獲缺少 HSTS 會增加首次使用 HTTP 或協(xié)議降級的風(fēng)險實現(xiàn)經(jīng)常缺少完善的限速和異常登錄監(jiān)控瀏覽器自動附加憑據(jù)因此 Basic Authentication 本身不能防止 CSRF泄露的密碼可能被用于其他復(fù)用相同憑據(jù)的系統(tǒng)。HSTS 不負(fù)責(zé)加密請求真正提供傳輸機密性的是 TLS。HSTS 的作用是要求瀏覽器持續(xù)使用 HTTPS相關(guān)機制由 RFC 6797定義。Cookie 的SameSite屬性不能保護(hù) Basic Authentication因為身份憑據(jù)并不存儲在 Cookie 中。敏感操作仍應(yīng)驗證 CSRF Token、Origin或Referer并限制請求方法和內(nèi)容類型。八、統(tǒng)一理解這些漏洞本章涉及的攻擊方式雖然不同但都在利用認(rèn)證系統(tǒng)暴露的狀態(tài)差異或防護(hù)邏輯錯誤服務(wù)器對不同認(rèn)證狀態(tài)執(zhí)行不同處理 ↓ 狀態(tài)碼、錯誤內(nèi)容、時間或鎖定行為出現(xiàn)差異 ↓ 攻擊者識別有效用戶名 ↓ 結(jié)合字典和用戶密碼規(guī)律縮小猜測范圍 ↓ 利用計數(shù)、重置或來源識別缺陷繞過防護(hù) ↓ 獲得有效憑據(jù)并進(jìn)入目標(biāo)賬戶用戶名枚舉本身通常不會直接接管賬戶但它會降低密碼攻擊的搜索空間。限速或賬戶鎖定也不一定存在單獨的“開關(guān)型漏洞”真正需要分析的是防護(hù)按照什么維度計數(shù)哪些事件會重置計數(shù)器鎖定結(jié)果是否泄露賬戶狀態(tài)服務(wù)端如何識別請求來源一次請求實際執(zhí)行多少次認(rèn)證判斷多個防護(hù)措施是否能夠相互補充。九、防御思路可靠的認(rèn)證防護(hù)不能只依賴某一個計數(shù)器應(yīng)組合使用對外統(tǒng)一認(rèn)證失敗狀態(tài)碼、錯誤信息和響應(yīng)結(jié)構(gòu)。盡量統(tǒng)一有效與無效用戶名的處理路徑和時間特征。同時從賬戶、IP、設(shè)備和全局異常行為等維度進(jìn)行限速。記錄實際認(rèn)證檢查次數(shù)而不只是 HTTP 請求數(shù)量。使用漸進(jìn)式延遲降低持續(xù)自動化攻擊效率。謹(jǐn)慎設(shè)置賬戶鎖定避免被用于用戶名枚舉和拒絕服務(wù)。正確配置反向代理只信任可信代理提供的客戶端地址。對高價值賬戶和敏感操作啟用 MFA。檢測 Password Spraying、Credential Stuffing 和分布式低速嘗試。使用 HTTPS并配置 HSTS 降低協(xié)議降級風(fēng)險。不依賴 Basic Authentication 保護(hù)高價值功能如必須使用也要補充限速、監(jiān)控和 CSRF 防護(hù)。阻止已泄露密碼和常見弱密碼同時避免誘導(dǎo)用戶形成可預(yù)測的周期性密碼變體??偨Y(jié)身份驗證漏洞的核心不只是“密碼是否足夠復(fù)雜”而是整個認(rèn)證流程是否向外暴露了可利用的信息以及防護(hù)系統(tǒng)是否準(zhǔn)確記錄了攻擊行為。用戶名枚舉利用的是不同賬戶狀態(tài)之間的可觀察差異暴力破解利用的是密碼可預(yù)測性Password Spraying 和 Credential Stuffing 繞過的是以單賬戶失敗次數(shù)為中心的防護(hù)IP 限速繞過則通常源于來源識別、計數(shù)方式或重置邏輯錯誤。分析認(rèn)證系統(tǒng)時應(yīng)始終沿著下面的順序檢查輸入了什么憑據(jù) → 服務(wù)器執(zhí)行了哪條認(rèn)證分支 → 客戶端能夠觀察到什么差異 → 防護(hù)按照什么維度計數(shù) → 什么條件會重置或繞過防護(hù) → 獲得憑據(jù)后能夠進(jìn)入哪些功能真正可靠的認(rèn)證機制需要同時控制信息泄露、密碼質(zhì)量、嘗試頻率、賬戶風(fēng)險、憑據(jù)傳輸和登錄后的權(quán)限邊界。