用户相关安全问题
一、需求背景
问题编号 |
问题描述 |
整改建议 |
问题级别 |
解决方式 |
SM-01-0001 |
系统不具备密码复杂度和有效期安全策略要求。 |
建议系统增加密码复杂度和有效期安全策略机制。 |
中危 |
1.修改现有密码为大小写+数字+特殊字符 2.密码有效期90天到期后强制跳转到修改密码界面 |
SM-01-0002 |
具有会话超时功能,但不具备登录失败处理功能,存在被口令爆破的风险。 |
建议系统增加登录失败处理安全机制和图形验证码,防止口令被暴力破解。 |
中危 |
尝试输错5次密码提示账号锁定十分钟;并可以通过重置密码进行手工解锁 |
SM-01-0004 |
系统本身只能通过用户名、口令登录,但访问应用还需先登录堡垒机,堡垒机具备双因子认证(密码+OTP)。 |
建议系统前后台登录,除通过用户名和口令外,还需添加第三种身份鉴别方式,如证书、生物识别、动态口令等。 |
高危 |
待数美确认是否使用数研所侧短信平台或自行开发OTP |
SM-01-0005 |
系统存在默认账户,无法重命名或删除默认用户 |
系统初始化后,建议对默认账户进行重命名或删除默认用户。 |
低危 |
系统初始化后,对默认账户进行重命名或删除默认用户。 增加修改或删除默认用户的功能 |
SM-01-0006 |
后台系统操作日志包括功能、操作方式、请求数据、操作时间、修改人等。前台系统的历史记录包括流水号、账号、识别结果、风险类型、IP、发生时间、操作等,系统日志文件中,记录了用户操作行为,但口令等敏感信息在日志文件中是明文显示 |
建议口令等敏感信息,在日志文件中进行密文显示。 |
中危 |
日志里的密码进行加密 |
SM-01-0008 |
系统前后台访问采用http方式,无法保证传输过程中的安全。 |
建议访问前后台,采用https方式 |
中危 |
使用https方式 |
SM-01-0009 |
系统鉴别数据保存在数据库中,使用MD5加密,但未进行加盐处理。 |
建议对鉴别信息进行MD5和加盐处理,提高安全性。 |
中危 |
添加用户 |
SM-01-0010 |
JAVA应用内存会回收,用户退出系统会清空session,但如果直接关闭浏览器,并未立即清空session。 |
建议在关闭浏览器时,系统也能立即清空session信息。 |
低危 |
关闭浏览器时系统立即清空session信息。 |
SM-01-0007 |
系统前后台均未对输入内容进行过滤和校验。 |
建议系统前后台对输入内容进行过滤和校验,如字符、特殊符号等,防止SQL注入、跨站攻击等恶意行为。 |
高危 |
关闭8081端口 |
sentry:
安全问题 | 解决办法 | 影响点 | 解决人 | 状态 |
缺少暴力破解攻击预防,建议加入CAPTCHA(图片验证码) | 增加图形验证码 |
登录输入正确的验证码可以登录 错误的验证码不能登录 |
张耀凯 唐健 |
提测 |
访问控制不当(普通用户可以通过修改URL越权) | 添加对应路由的权限验证 | 唐健 | 提测 | |
会话固定(用户成功登录应用后,会话cookie没有改变,cookie易被窃取,用户登录后应重置cookie) | 登录后重新生成一个cookie | 私有化sentry后台正常登录,登录前后的PHPSESSION的cookie值不一样 | 张耀凯 | 提测 |
密码复杂度要求较低(用户重置密码时弹出密码复杂度提示与欧莱雅密码复杂度需求标准不一致,具体标准见报告) | 密码提示和限制改为:不少15位字符(需包含至少1个大写、1个小写、1个数字) 修复步骤: 密码复杂度等级校验修改 |
密码登录 重置密码 |
张耀凯 唐健 |
提测 |
saas:
安全问题 | 解决办法 | 影响点 | 解决人 | 状态 |
缺少暴力破解攻击预防,建议加入CAPTCHA(图片验证码) | 增加图形验证码 |
登录输入正确的验证码可以登录 错误的验证码不能登录 |
张耀凯 唐健 |
提测 |
访问控制不当(普通用户可以通过修改URL越权) |
添加对应的权限验证 用户管理 API密钥 API调用名单 |
非超级管理员访问这几个页面的url会报错,提示无权限操作 非超级管理员登录进去点各个页面不会有权限报错 |
张耀凯 | 提测 |
未经授权的数据传输出欧莱雅环境(http请求域名被解析为一个非欧莱雅服务器:https://fp-it.fengkongcloud.com/v3/profile/web) | 修改前端配置文件的fp-it.fengkongcloud.com域名 | 唐健 | ||
密码复杂度要求较低(用户重置密码时弹出密码复杂度提示与欧莱雅密码复杂度需求标准不一致,具体标准见报告) | 密码提示和限制改为:不少15位字符(需包含至少1个大写、1个小写、1个数字) 修复步骤: 1.去掉js代码里列出的shumei 的账号 2.重置密码 密码复杂度等级修改 |
密码登录 重置密码 |
张耀凯 唐健 |
提测 |
敏感信息通过URL明文传递(敏感信息如用户名和密码、tokens等在请求URL中明文传输,仅通过https方式无法解决此漏洞,建议将敏感信息放在post的data中) | 修复:get请求改为post | 密码登录 | 张耀凯 唐健 |
提测 |
跨站脚本("XSS") 显示,建议确保在受影响的函数中对输入参数和URL进行适当的输入验证(例如,恶意脚本过滤),并对输出进行编码,以防止其被解释为活动内容 | 修复:对输入参数和URL进行适当的输入验证 | 提测 | ||
会话固定(用户成功登录应用后,会话cookie没有改变,cookie易被窃取,用户登录后应重置cookie) | 修复步骤:登录后重置cookie | 私有化console后台正常登录,登录前后的PHPSESSION的cookie值不一样 | 张耀凯 | 提测 |
二、方案描述
1.修改当前密码为大小写+数字+特殊字符
2.修改密码的时候更新密码修改时间(saas_user 增加ext扩展字段),登录接口判断如果修改时间距离现在的时间超过90天,则跳转到修改密码页面(所有页面都是跳转吗?)
3. 尝试输错5次密码提示账号锁定十分钟
登录接口判断账号密码错误,则使用redis计数,key为password_maxtry_{account} ,过期时间为10min(可配置) 提示:错误次数超过5次,账号被锁定10分钟,请稍后重试
如果账号密码是正确的,则清空key 的计数
4. 登录,修改密码的时候将密码信息打印参数日志的时候加密打印
5. 添加用户,修改密码,登录 将密码的值加盐再md5 存储,同时修改初始化账号密码时的密码值
6.前端调研,监听关闭浏览器的事件,关闭的时候触发调用退出接口,执行清空session信息
三、关键技术
核心2个内容
-
- 关键技术决策。如果要达成该技术方案的核心目标(如,系统规模化,成本,安全,性能首要矛盾,或者核心需求)我们需要采取关键技术设计思路,技术选型决策,进行高亮总结,锐化技术观点。以让协同方了解自己整个设计的初衷。
- 技术债务梳理。采用这些技术决策,可能导致未来要偿还的技术债务。
1.密码加盐采用可信的随机算法生成,并存储在数据库做校验,短盐值会导致盐值被枚举,盐值重复会导致攻击者拿到盐值加盐无用,以随机字符串作为盐对密码进行加盐仅仅是增加破解密码的难度,假如目前有30w的用户数据,那么就会有30w个盐,利用600w的索引表去比对的话,需要创造出30w*600w的数据来一一比对,这样会增加攻击者的成本,
计划采用安全的随机字符串作为盐,并和密码一起存储
2. 加盐使攻击者无法采用特定的查询表和彩虹表快速破解大量哈希值,但是却不能阻止他们使用字典攻击或暴力攻击,场景的解决办法是:
1.使用慢哈希函数 哈希函数大约耗费0.5秒的值。这样,你的程序就可以尽可能保证安全,而又不影响到用户体验
2. 防止暴力破解,如重试5次提示锁定,不再校验密码是否正确(数研所要求)
3. 日志脱敏
java的log4j支持按配置进行日志脱敏,php的日志库里没有配置,但是可以模仿java开发一个公共的脱敏方法,支持配置 dCard,tel,password等,对这些内容进行加*处理
因为是一个老版本,并且只有登录和修改密码设计到密码暴漏的问题,简单的方案是,前端传参数的时候将手机号进行加密传输,日志里也自动是加密啊的,这样解决了传输和日志加密的问题
四、功能设计
1.修改部署的密码和密码要求为 大小写+数字+特殊字符: 如admin@COMMON#123
/^(?=.*[0-9])(?=.*[A-Z])(?=.*[a-z])(?=#@_!%).{15,}$/
2. 尝试输错5次密码提示账号锁定十分钟
登录接口判断账号密码错误,则使用redis计数,key为password_maxtry_{account} ,过期时间为10min(可配置) 提示:错误次数超过5次,账号被锁定10分钟,请稍后重试
如果账号密码是正确的,则清空key 的计数
3. 90天修改密码提醒
1.修改密码的时候更新密码修改时间,
|
2. 登录接口判断如果修改时间距离现在的时间超过90天,则跳转到修改密码页面(所有页面都是跳转吗?)
4. 登录,修改密码的时候密码md5加密传输, 密码在传输和日志里都是加密的格式了
5. 添加用户,修改密码,登录 将密码的值加盐再md5 存储,同时修改初始化账号密码时的密码值
1.存储密码的步骤
- 使用CSPRNG生成一个长度足够的盐值
- 将盐值混入密码,并使用标准的加密哈希函数进行加密
- 把哈希值和盐值一起存入数据库中对应此用户的那条记录
2. 校验密码的步骤
- 从数据库取出用户的密码哈希值和对应盐值
- 将盐值混入用户输入的密码,并且使用同样的哈希函数进行加密
- 比较上一步的结果和数据库储存的哈希值是否相同,如果相同那么密码正确,反之密码错误
6.前端调研,监听关闭浏览器的事件,关闭的时候触发调用退出接口,执行清空session信息@邹家志