Java 认证与配置安全源码审计
Java 后端项目中认证、授权与安全配置是最高频的漏洞产出面。本 skill 提供 6 大类白盒审计的完整检测思路,适用于 Spring Boot/Spring Security、Apache Shiro 及自定义框架。
相关 Skill
java-framework-audit— Spring/Struts/MyBatis 框架审计java-injection-audit— SQL/OGNL/EL 注入审计java-serialization-audit— 反序列化漏洞审计idor-methodology— 黑盒 IDOR 测试方法论
深入参考
- 6 类漏洞详细模式(危险代码/安全代码/EVID 证据)-> references/auth-config-patterns.md
6 类风险速查表
| # | 类别 | 关键搜索入口 | 危害等级 |
|---|---|---|---|
| 1 | 认证绕过 | SecurityConfig, ShiroFilterFactory, doFilter |
严重 |
| 2 | 越权 | DAO/Mapper 查询语句, @PreAuthorize, Controller 参数 |
高 |
| 3 | JWT 安全 | Jwts.parser(), Algorithm.HMAC, SECRET_KEY |
高 |
| 4 | 加密配置 | MessageDigest, Cipher.getInstance, new Random() |
高 |
| 5 | 信息泄露 | application.yml Actuator 配置, @ExceptionHandler |
中 |
| 6 | 业务逻辑 | 余额/库存操作, 状态机流转, 支付回调 | 高 |
1. 认证绕过审计要点
- Spring Security: 检查
FilterChainProxy匹配规则,AntPathRequestMatcher与MvcRequestMatcher差异(尾部斜杠/路径后缀);requestMatchers顺序——宽松规则permitAll()在前会覆盖后续拦截;permitAll()是否过度开放(如/api/**) - Shiro: URI 解析差异导致绕过——
/admin/vs/adminvs/admin/..;/;CVE-2020-1957 / CVE-2020-11989 / CVE-2020-13933 等 path normalization 系列绕过 - 自定义 Filter:
doFilter()中 early return 导致后续 chain 未执行;白名单正则不严谨(如startsWith("/public")可被/publicevil匹配)
2. 越权审计要点
- 水平越权: 接口仅校验登录态未校验资源归属——DAO 层
WHERE id = #{orderId}缺少AND user_id = #{currentUserId}条件 - 垂直越权: Controller/Service 方法缺少角色注解
@PreAuthorize/@RequiresRoles;枚举值(角色 ID)可猜解 - IDOR: 自增 ID 可遍历;UUID 是否真正不可预测;批量接口跳过单条权限检查
3. JWT 安全审计要点
- 算法混淆:
alg: none绕过签名验证;RS256 -> HS256 攻击(用公钥作为 HMAC 密钥) - 密钥硬编码: 源码中
SECRET_KEY = "xxx"或application.yml明文配置 - Claims 校验缺失:
exp(过期)/iss(签发者)/aud(受众) 未验证导致 token 可跨环境复用 - 刷新机制:
refresh_token长期有效且未绑定用户/设备,被盗后可无限刷新
4. 加密配置审计要点
- 弱算法:
MD5/SHA1做密码哈希、DES/RC4加密、ECB模式(泄露数据模式) - 正确做法: 密码用
bcrypt/scrypt/argon2;对称加密用AES-GCM/AES-CBC+HMAC - 硬编码密钥/盐值:
private static final String KEY = "..."或盐值写死在代码中 - 不安全随机:
java.util.Random可预测,安全场景必须用SecureRandom
5. 信息泄露审计要点
- Actuator 端点暴露:
/env(环境变量/密码)、/heapdump(堆内存含密钥)、/jolokia(远程代码执行) - 详细错误堆栈: 全局异常处理器缺失,SQL 报错/类名/路径直接返回客户端
- Debug 模式:
server.error.include-stacktrace=always、spring.devtools未移除 - 敏感数据日志:
log.info("用户密码: {}", password)或完整信用卡号写入日志文件
6. 业务逻辑审计要点
- 并发竞争: 余额检查与扣款非原子操作(double-spending);优惠券/积分重放
- 参数篡改: 金额/数量/折扣由客户端传入且服务端未重新计算;订单金额可为负数
- 流程绕过: 多步流程(注册-验证-设置密码)步骤间缺少状态校验,可直接跳到后续接口
检测清单
审计时逐项确认,每发现一项即记录 EVID 证据:
- Spring Security 配置链顺序问题或过度
permitAll - Shiro
filterChainDefinitionMapURI 解析差异绕过 - 自定义 Filter/Interceptor early return 或白名单绕过
- 数据查询是否绑定当前用户 ID(水平越权)
- 敏感接口是否有角色/权限注解(垂直越权)
- JWT 是否强制指定算法 + 密钥安全存储 + Claims 全验证
- 密码存储 bcrypt/scrypt/argon2; 对称加密 AES-GCM 且密钥不硬编码
- 随机数使用 SecureRandom
- Actuator 端点限制访问 + 认证保护
- 全局异常处理器吞掉堆栈; 生产关闭 debug/devtools; 日志无敏感数据
- 金额/库存操作原子性; 多步流程状态机校验