CVE-2026-24038CVE-2026-24038是Horilla HRMS 1.4.0版本中存在的一个高危安全漏洞,攻击者可利用OTP(一次性密码)处理逻辑中的缺陷完全绕过双因素认证机制。Horilla是一款免费开源的人力资源管理系统,广泛应用于企业环境中管理员工信息、考勤、薪资等敏感数据。该漏洞的核心问题在于OTP验证逻辑中存在不当的相等性检查:当用户请求的OTP过期时,服务器返回None值,而攻击者可以通过故意在POST请求中省略otp字段,使客户端提供的OTP值也为None,从而导致user_otp == otp的比较判定为真(None == None),系统错误地认为认证成功。这一漏洞的利用门槛极低,攻击者只需构造特定的HTTP请求即可,无需获取任何有效的OTP凭证。如果企业管理员账户被成功攻击,攻击者可以获取所有员工的敏感个人信息、薪资数据、考勤记录等机密数据,甚至可以篡改员工档案、修改薪资信息,造成严重的经济损失和声誉损害。此外,攻击者还可能以被入侵的管理员账户为跳板,进一步横向移动攻击整个系统。
漏洞存在于Horilla HRMS的OTP验证处理逻辑中,具体代码位置在双因素认证的验证流程中。当用户启用双因素认证后,系统会生成一个一次性密码并将其存储在服务器端,同时设置过期时间。正常验证流程中,服务器会比较用户提交的OTP与存储的OTP是否匹配。
问题出在以下代码逻辑:
1. 当OTP过期时,服务器端的otp变量被设置为None
2. 攻击者构造POST请求时,故意不包含otp参数
3. 此时用户提交的user_otp变量也为None
4. Python的相等性比较 None == None 返回True
5. 系统错误地认为OTP验证通过,允许登录
攻击者利用的关键是Python中None与None的相等性比较特性。在正常的代码逻辑中,应该使用严格的is None检查或者要求otp参数必须存在且非空。此外,代码缺少对otp参数存在性的验证逻辑,导致攻击者可以省略该参数。修复版本1.5.0中应该添加了对otp参数存在性的检查,并使用is None进行严格比较。