共计 1991 个字符,预计需要花费 5 分钟才能阅读完成。
背景介绍
Token 认证是现代 Web 应用中常见的安全机制,主要用于防止 CSRF(跨站请求伪造)攻击。Token 通常是一次性使用的随机字符串,由服务器生成并嵌入到表单中,客户端提交表单时需要携带该 Token。服务器验证 Token 的有效性后才处理请求。

然而,如果 Token 的生成或验证机制存在漏洞,攻击者可能通过重放攻击绕过这一防护。本文将带您一步步分析 DVWA 靶场中的 Token 认证机制,并演示如何使用 Burp Suite 实施重放攻击。
环境搭建
- DVWA 靶场安装
- 下载 DVWA(Damn Vulnerable Web Application)并部署在本地环境
- 确保 php 和 mysql 服务正常运行
-
修改 config/config.inc.php 中的数据库配置
-
Burp Suite 配置
- 下载并安装 Burp Suite Community/Professional 版
- 配置浏览器代理为 127.0.0.1:8080
- 安装 Burp 的 CA 证书以拦截 HTTPS 流量
攻击分析
拦截登录请求
- 启动 Burp Suite,开启拦截功能(Proxy → Intercept is on)
- 在 DVWA 登录页面输入测试账号(如 admin/password)
- Burp 将捕获到类似如下的 POST 请求:
POST /dvwa/login.php HTTP/1.1
...
user_token=12345abcde&username=admin&password=password&Login=Login
分析 Token 机制
观察多次登录请求,可以注意到:
- user_token 每次都会变化
- 该 Token 通常出现在隐藏表单字段中
- Token 可能由服务器会话、时间戳或其他因素生成
重放攻击演示
- 将捕获的请求发送到 Repeater 模块(右键→Send to Repeater)
- 修改用户名 / 密码后多次发送相同请求
- 若服务器未校验 Token 时效性,攻击将成功
防御方案
Token 时效性控制
服务器应为 Token 设置较短的有效期(如 5 分钟),过期后拒绝请求。示例伪代码:
# 生成 Token 时记录时间戳
session['token'] = {'value': generate_random_string(),
'timestamp': time.time()}
# 验证时检查时效
if time.time() - token['timestamp'] > 300:
return "Token expired"
请求签名验证
对关键参数(如 username+password+token)进行 HMAC 签名,服务端验证签名匹配度:
String signature = hmacSha256(secretKey,
username + password + token);
if (!signature.equals(request.getParameter("sig"))) {throw new SecurityException("Invalid signature");
}
同源策略加强
- 检查 Origin/Referer 头部
- 设置 SameSite cookie 属性
- 实现 CSP(内容安全策略)
代码示例
Python Flask Token 验证
from flask import session, request, abort
import time
import secrets
@app.before_request
def verify_token():
if request.method == 'POST':
client_token = request.form.get('user_token')
if not client_token or client_token != session.get('token'):
abort(403) # Forbidden
session.pop('token') # 一次性使用
@app.route('/login', methods=['GET'])
def show_login():
session['token'] = secrets.token_hex(16)
return render_template('login.html', token=session['token'])
避坑指南
- Token 未绑定会话 :确保 Token 与用户会话关联
- 可预测的 Token:使用强随机数生成器(如 Java 的 SecureRandom)
- 前端暴露生成逻辑 :Token 应在后端生成
- 日志记录 Token:避免在日志中输出完整 Token
进阶思考
- 如何设计分布式系统下的 Token 验证方案?
- 当用户禁用 JavaScript 时,Token 机制如何优雅降级?
- 除了 Token,还有哪些方法可以防止重放攻击?
总结
通过本次实战,我们了解了 Token 认证的基本原理和潜在风险。安全防护需要多层次防御:合理的 Token 设计、严格的时效控制、请求签名验证等都是必不可少的环节。建议开发者在实现认证系统时参考 OWASP 的相关指南,并定期进行安全审计。
正文完
