摘要: Java作为企业主流开发语言已流行多年,各种java安全编码规范也层出不穷,本文将从实践角度出发,整合工作中遇到过的多种常见安全漏洞,给出不同场景下的安全编码方式。
Java通用权限框架(shiro)
进行增删改查操作时采用无法遍历的序号
对于敏感信息,应该进行掩码设置屏蔽关键信息。
垂直越权
角色权限矩阵
限制匿名用户和低权限用户,执行操作前检查用户登录状态和权限清单
正确写法(判断用户权限清单是否包含请求的权限):
漏洞修复验证
水平越权:
操作前判断下当前用户是否有对应数据权限,修复后修复前两次验证,通过返回长度不同可看到水平越权问题已解决。
url重定向
对于白名单内的地址,用户可无感知跳转,不在白名单内的地址给用户风险提示,用户选择是否跳转
正确写法:
漏洞修复验证
Ssrf
漏洞利用验证:
正确写法(限制请求协议,设置白名单域名,避免内网地址探测):
漏洞修复验证
正则表达式拒绝服务,这种漏洞需要通过白盒审计发现,黑盒测试比较难发现。
错误写法(正则匹配时未考虑极端情况的资源消耗)
漏洞利用验证,随着字符长度增加,响应时间会越来越长,cpu满负荷运转
正确写法(运行超过2秒就中止匹配):
漏洞修复验证:
需要通过白盒审计发现漏洞,直接黑盒测试比较难。
错误写法:使用ECB模式,相同明文生成相同密文
漏洞利用验证(使用选定明文攻击从后向前按位猜解):
正确写法:使用CBC模式,相同明文生成不同密文
Cipher cipher =Cipher.getInstance("AES/CBC/PKCS5Padding");
需要通过白盒审计发现漏洞,直接黑盒测试比较难。
错误写法:使用伪随机,相同种子生成相同随机数序列
漏洞利用验证:
需要通过java生成前后2000毫秒内的随机数,然后使用python调用这些随机数尝试暴破
正确写法:使用Securerandom
漏洞修复验证(Securerandom不能指定seed,避免伪随机):
Servlet的单例模式容易导致条件竞争,也是推荐白盒方式审计漏洞。
错误写法:初始积分100个,每天限制签到1次领取1积分
漏洞利用验证(10个并发可实现多次签到,这里多并发跟业务功能复杂度和服务器性能有关,如果想必现漏洞,可以在读取签到次数和增加签到次数之间增加2秒延时,可以保证漏洞复现。)
正确写法:使用线程同步
漏洞修复验证:
修复后返回数据包速度明显变慢,不能再重复签到领积分
原文地址:https://www.freebuf.com/vuls/240172.html