4. 认证审计要点:OAuth 2.0流程审计、生命周期检查、弱口令检测方法
认证这块,说白了就是看门的那道锁。锁要是坏了,或者钥匙随便复制,那整个API就裸奔了。我这些年做审计,见过太多“认证形同虚设”的案例。这一章,咱们就聚焦在OAuth 2.0的流程、的寿命,还有最基础的弱口令上。
核心观点:认证审计不是看“有没有认证”,而是看“认证能不能防住攻击”。OAuth流程的每一个跳转、的每一个字段、密码的每一个字符,都可能是突破口。
4.1 OAuth 2.0 流程审计:别让授权码变成“裸奔码”
OAuth 2.0 现在几乎是API授权的标配。但它的流程复杂,坑也多。我审计过一个金融项目,他们的授权码流程居然没校验 redirect_uri,攻击者直接截获了用户的授权码。嗯,这里要注意,流程审计的核心就是看“每一步是否都锁死了”。
4.1.1 授权码模式(Authorization Code)审计清单
我个人习惯,审计授权码模式时,会重点盯住下面这几个环节:
- redirect_uri 校验: 服务端必须严格校验回调地址。不能只校验域名,要校验完整路径。我曾经见过只校验了
*.example.com,结果攻击者注册了个evil.example.com就绕过去了。 - state 参数: 必须使用。这是防CSRF攻击的关键。很多开发者嫌麻烦就不加,这是大忌。
- 授权码一次性: 授权码使用后必须立即失效,且有效期极短(通常不超过10分钟)。
- client_secret 的保管: 后端应用必须妥善保管
client_secret,不能出现在前端代码或移动端安装包中。
我的经验: 审计时,我会直接模拟一个恶意客户端,尝试修改 redirect_uri 或重复使用授权码。如果系统没有拦截,那就是高危漏洞。
4.1.2 隐式模式(Implicit)的“死刑判决”
隐式模式直接把Access 通过URL片段返回,安全性极差。我个人建议,新系统一律不要用。如果审计中发现了,直接标记为高风险。它的审计点很简单:
- 是否使用了
response_type=?如果是,建议立即整改。 - 是否暴露在浏览器历史记录或Referer头中?这是必然的。
警告: 如果你还在用隐式模式,赶紧迁移到授权码模式 + PKCE。这不是建议,是强制要求。
4.2 生命周期检查:从出生到入土
就像一把临时钥匙。钥匙什么时候发、什么时候换、什么时候作废,都得有规矩。我审计时,会把的生命周期画成一条时间线,逐个节点检查。
4.2.1 Access 审计要点
| 审计项 | 检查标准 | 常见问题 |
|---|---|---|
| 有效期 | 建议15分钟到1小时 | 设置成24小时甚至永久有效 |
| 传输方式 | 必须使用HTTPS,放在Authorization Header中 | 放在URL参数里,或使用HTTP明文传输 |
| 存储方式 | 前端用内存或HttpOnly Cookie,后端用安全存储 | 存在localStorage或sessionStorage中 |
| 签名验证 | JWT必须验证签名,且使用强算法(如RS256) | 使用HS256且密钥泄露,或未验证签名 |
4.2.2 Refresh 审计要点
Refresh 是“长期钥匙”,它的安全性要求更高。我审计时,会特别关注以下几点:
- 有效期: 建议7天到30天,且支持轮换(Rotation)。每次刷新后,旧的Refresh 立即失效。
- 存储: 必须存储在服务端,或者使用HttpOnly + Secure + SameSite=Strict的Cookie。
- 撤销机制: 当用户修改密码、注销登录或检测到异常时,必须能立即撤销所有Refresh 。
避坑指南: 我曾经审计过一个系统,他们的Refresh 有效期是1年,而且不支持轮换。结果一个泄露,攻击者整整用了一年。嗯,从那以后,我见到“永久Refresh ”就直接打回。
4.3 弱口令检测方法:别让密码形同虚设
弱口令是老生常谈,但永远是最常见的漏洞之一。我见过太多“admin/123456”的案例。弱口令检测,说白了就是两件事:一是检查密码本身够不够强,二是检查系统有没有防暴力破解的机制。
4.3.1 密码强度检测
我个人习惯,审计时会从两个维度看密码强度:
- 静态规则: 长度至少8位,包含大小写字母、数字和特殊字符。但光有规则不够,还要看规则是否被绕过。比如,有些系统只检查“是否包含”,不检查“是否连续”。
- 动态规则: 检查密码是否在已知的弱口令库中(如RockYou、Have I Been Pwned)。这个很关键,因为“P@ssw0rd!”虽然符合静态规则,但它是众所周知的弱口令。
我的做法: 审计时,我会用脚本批量测试常见弱口令(如123456、password、qwerty等),看系统是否允许。如果允许,直接扣分。
4.3.2 暴力破解防护审计
密码再强,也怕暴力破解。审计时,我会检查以下防护措施是否到位:
| 防护措施 | 审计方法 | 预期结果 |
|---|---|---|
| 登录频率限制 | 短时间内连续尝试登录,观察是否被锁定或延迟 | 5次失败后,应锁定账户或增加延迟 |
| 验证码 | 检查登录页面是否集成CAPTCHA | 连续失败后应弹出验证码 |
| IP白名单/黑名单 | 检查是否对异常IP进行限制 | 同一IP多次失败应被临时封禁 |
| 多因素认证(MFA) | 检查是否支持MFA,特别是管理员账户 | 所有高权限账户应强制启用MFA |
4.3.3 弱口令检测工具与脚本
审计时,我常用下面这些工具和方法:
- Hydra / Medusa: 用于在线暴力破解测试,验证系统的防护能力。
- John the Ripper / Hashcat: 如果拿到了密码哈希,用于离线破解,检查哈希强度。
- 自定义脚本: 我习惯写一个简单的Python脚本,调用API的登录接口,用弱口令字典进行测试。
# 示例:弱口令检测脚本片段
import requests
weak_passwords = ["123456", "password", "admin", "qwerty", "letmein"]
url = "https://api.example.com/login"
for pwd in weak_passwords:
payload = {"username": "admin", "password": pwd}
response = requests.post(url, json=payload)
if response.status_code == 200:
print(f"[高危] 弱口令发现: {pwd}")
break
else:
print(f"[安全] 弱口令 {pwd} 被拒绝")
总结一下: 认证审计不是走过场。OAuth流程要逐行看代码,生命周期要逐个节点检查,弱口令要真刀真枪地测。只有这样,才能把认证这扇门真正锁好。