讓我們說一個用戶正在登錄一個典型的站點,輸入用戶名和密碼,然後他們輸錯了其中一項輸入。我注意到,即使不是全部,大多數站點也會顯示相同的消息(類似“用戶名或密碼無效”)。
對我來說,這似乎很容易通知用戶哪個輸入錯誤,這讓我想知道為什麼網站不這樣做。那麼,是出於安全原因嗎?還是僅僅是一些已經成為常態的事情?
讓我們說一個用戶正在登錄一個典型的站點,輸入用戶名和密碼,然後他們輸錯了其中一項輸入。我注意到,即使不是全部,大多數站點也會顯示相同的消息(類似“用戶名或密碼無效”)。
對我來說,這似乎很容易通知用戶哪個輸入錯誤,這讓我想知道為什麼網站不這樣做。那麼,是出於安全原因嗎?還是僅僅是一些已經成為常態的事情?
如果惡意用戶通過猜測常見的用戶名/密碼組合(例如admin / admin)開始攻擊網站,則攻擊者將知道該用戶名有效,因為它返回的消息為“ Password invalid”(密碼無效),而不是“ Username or password invalid”(用戶名或密碼無效)
。如果攻擊者知道用戶名有效,則可以使用SQL注入或暴力破解密碼等技術將精力集中在該特定帳戶上。
就像其他人提到的那樣,我們不希望您知道用戶名或密碼是否錯誤,以免我們受到強力或字典攻擊。
如果某些網站希望讓用戶知道哪一個失敗了,同時仍處於綠色安全狀態,則可以實施“ 蜜罐”用戶名(例如管理員,管理員等),將提醒網站管理員有人正在窺探他們的網站。如果他們試圖使用那些“ honeypot”用戶名之一登錄,甚至可以設置一些邏輯來禁止其IP地址。我知道一個人實際上擁有一個網站,並在其源代碼中添加了HTML註釋,例如“由於您一直忘記Richard:用戶名:cheese密碼:Burger123”之類的HTML註釋,目的是監視任何試圖使用的IP地址該用戶名/密碼。在開發網站時,添加這樣的監視邏輯非常有趣。
當然,記錄無效的登錄嘗試並添加適當的邏輯來處理這些IP地址也可以。我知道有些人會不同意我的觀點,但是根據網站的類型,我認為只要您添加了防止各種類型攻擊的附加安全措施,讓用戶知道就不會有太大的麻煩。
我最喜歡的安全實現是由我使用的銀行完成的。如果我正確輸入用戶名,它將顯示“ Welcome Jimbob!”。然後提示我回答安全問題(如果我從未從此計算機上的瀏覽器登錄過),請等待我正確回答安全問題,然後讓我查看安全圖像/標題並輸入密碼。如果輸入錯誤的用戶名,將會看到類似“ Welcome Bessie / Kareem / Randal!”的字樣。其中顯示的名稱非常少見-儘管對於相同的用戶名,您將始終使用相同的名稱(我通常不確定一兩個用戶名之間;錯誤的名稱始終稱我為Frenshelia)。我假定其實現為對輸入的任何用戶名的某種非加密哈希,該用戶名唯一地映射到一長串相當不常見的名稱上的一個用戶名。這可以讓合法用戶知道他們是否輸入了錯誤的用戶名(即使您使用的是不常見的名稱(例如Bessie);您隨機猜到的錯誤的用戶名也不太可能映射回您的特定的不常見名稱),而不會使嘗試使用此方法的人看到查找用戶名不存在的隨機帳戶。
順便說一句:我並不特別喜歡安全問題/安全圖像部分,該部分似乎與安全劇院接壤。進行中間人(MITM)攻擊的老練攻擊者(例如,在您的Web瀏覽器中安裝了偽證書之後;並且DNS / ARP欺騙將yourbank.com指向其IP地址)可能會等到您嘗試登錄進入站點,然後在其計算機上將自動腳本登錄到實際站點,獲取安全問題,將選擇的安全問題顯示給您,然後從其瀏覽器將答案自動發送回站點,等待獲取安全性映像,將安全映像發回給您,然後等待您從其末端輸入密碼,此時他們將使用該密碼以您的身份登錄並執行惡意操作。授予問題+圖像比通過花費大量時間將攻擊轉變為必須實時進行並可能留下可疑簽名的攻擊來使過程變得更加困難。
其他答案可以很好地了解此行為背後的安全原因。儘管它們是正確的,但我敢肯定,至少一些網站只是對授權例程進行了編程,無法以某種方式分辨出錯誤的原因-登錄名或密碼。
示例查詢:
從用戶那裡選擇COUNT(*),其中login ='john'AND hash ='2bbfcdf3f09ae8d700402f36913515cd'
這將返回 1 成功登錄嘗試,如果沒有或名稱的用戶,則輸入 0 。該用戶使用不同的密碼。無法確定條件的哪一部分失敗。因此,當顯示錯誤消息時,程序員會誠實地告訴您出了點問題,他不確定那到底是什麼。
我個人在少數基於PHP的網站中看到過類似的查詢,我可以肯定,部分原因確實來自身份驗證過程的編碼方式。
但是,還有另一種有趣的技術可以應用於執行用戶枚舉攻擊
(以及更多)。這稱為定時攻擊
。攻擊者只需衡量身份驗證請求的響應時間以及有效和無效登錄之間的區別。
其背後的安全原因是,找到有效的用戶名變得容易得多。
除了已經給出的所有出色答案之外,還有一個通用的安全原則,該原則規定您不應向未經授權的用戶提供未經請求的信息。即如果您選擇回答“您的身份驗證數據無效”或說明哪一部分無效-您應該始終選擇前者。一些非常討厭的密碼攻擊是基於實施過程中提供的最微小的錯誤信息來實現的,這些錯誤信息試圖是“有幫助的”-請參見填充oracle攻擊。因此,始終選擇洩露給未授權實體的盡可能少的信息是一個好主意-即,如果他的用戶名/密碼組合不好,您總是回答“用戶名/密碼不好”,並且從不透露任何信息數據。即使在特定情況下(例如gmail,其中用戶名是公用的)也不重要,但默認情況下採用也是一種好習慣。
假設您輸入了一個隨機的用戶名和一個同樣隨機的密碼(請注意輸入的密碼)。現在,密碼可以在n個用戶之間通用。因此,如果網站說密碼是正確的...那麼您就會知道接下來的事情..真正的用戶之間混亂不堪,因為獲取登錄名非常容易。
提供模棱兩可的答案對於防止用戶枚舉攻擊很有用。
在某些情況下,攻擊者無需破壞用戶帳戶。用戶擁有帳戶的信息就足夠了,無需任何其他操作。例如,客戶在競爭性的網上商店中擁有帳戶對於商業而言是有價值的信息。
我很欣賞上面的各種回答,因為它們講得最多,但有時應用程序也不知道用戶名或密碼有誤。在基於令牌的身份驗證的情況下,專門用於實現SSO(單點登錄),例如 IBM Tivoli Access Manager您的應用程序會收到成功的令牌或返回錯誤。
如果登錄名是電子郵件地址,則很容易發現某人已在網站上註冊-我可能不希望這樣做>>有時,當人們使用電子郵件ID作為登錄名時,他們會使用他們註冊網站的電子郵件帳戶真實密碼id:)