共计 1666 个字符,预计需要花费 5 分钟才能阅读完成。
1. Token 安全基础与重放攻击原理
Token 在现代 Web 应用中常用于身份验证和防 CSRF 攻击。典型的场景包括:
- 表单提交时的 CSRF Token
- API 调用中的访问令牌(Access Token)
- 支付流程中的一次性验证码
重放攻击 (Replay Attack) 指攻击者截获合法 Token 后,在有效期内重复使用该 Token 进行未授权操作。根据 OWASP 统计,这类攻击在 API 安全威胁中排名前五。
2. Burp Suite 重放攻击实战
2.1 测试环境准备
- 安装 Burp Suite Community/Professional 版
- 配置浏览器代理(通常 127.0.0.1:8080)
- 启用 Burp 的拦截功能(Proxy → Intercept on)
2.2 攻击步骤演示
- 捕获含 Token 的请求(如登录后的 API 调用)
- 在 Proxy → HTTP history 中找到目标请求
- 右键选择 ”Send to Repeater”
- 在 Repeater 模块修改参数后多次发送
- 观察服务器是否接受重复 Token

3. 核心防御方案实现
3.1 时效性 Token 方案(Python 示例)
from datetime import datetime, timedelta
import secrets
TOKEN_STORE = {}
def generate_token(user_id):
token = secrets.token_hex(16)
expire_time = datetime.now() + timedelta(minutes=5)
TOKEN_STORE[token] = {
'user_id': user_id,
'expire': expire_time
}
return token
def validate_token(token):
if token not in TOKEN_STORE:
return False
record = TOKEN_STORE[token]
if datetime.now() > record['expire']:
del TOKEN_STORE[token]
return False
return True
3.2 会话绑定方案(Java 示例)
import javax.servlet.http.HttpSession;
public class TokenValidator {
private static final String TOKEN_ATTR = "CSRF_TOKEN";
public static String generateToken(HttpSession session) {String token = UUID.randomUUID().toString();
session.setAttribute(TOKEN_ATTR, token);
return token;
}
public static boolean validateToken(HttpSession session, String token) {String sessionToken = (String) session.getAttribute(TOKEN_ATTR);
return token != null && token.equals(sessionToken);
}
}
4. 避坑指南
4.1 常见错误配置
- Token 未设置有效期或有效期过长(建议 5 -15 分钟)
- 使用可预测的 Token 生成算法(如顺序 ID)
- 未在服务端校验 Token 有效性
- 将 Token 存储在 localStorage 等易受 XSS 攻击的位置
4.2 OWASP 推荐实践
- 遵循 PRG 模式(Post-Redirect-Get)
- 实施 SameSite Cookie 属性
- 关键操作添加二次认证
- 记录 Token 使用日志
5. 扩展思考
如何设计防重放的分布式 Token 系统?考虑以下因素:
- 集群环境下的 Token 同步
- Redis 等高速缓存的 TTL 设置
- 微服务架构中的 Token 传递
- 高并发场景的性能优化
总结
Token 重放攻击看似简单却危害巨大。通过 Burp Suite 等工具可以有效地测试系统脆弱性,而结合时效性验证和会话绑定能构建多层次防护。建议开发者定期进行安全审计,并关注 OWASP 的最新安全指南。
正文完
发表至: 网络安全
近一天内
