共计 2447 个字符,预计需要花费 7 分钟才能阅读完成。
背景介绍
Token 认证是现代 Web 应用中常见的安全机制,主要用于防止 CSRF(跨站请求伪造)攻击。Token 通常是一次性的,或者与用户会话绑定,确保每个请求都是用户真实意图的体现。然而,如果 Token 实现不当,比如生成规律可预测、未绑定会话或缺乏时效性控制,就可能被攻击者利用进行重放攻击。

环境搭建
DVWA 靶场配置
- 下载并安装 DVWA(Damn Vulnerable Web Application),这是一个专门设计用于安全测试的 Web 应用。
- 配置 PHP 环境和数据库,确保 DVWA 能够正常运行。
- 登录 DVWA 后台,将安全级别设置为“Low”,以便进行测试。
Burp Suite 工具准备
- 下载并安装 Burp Suite Community 或 Professional 版本。
- 配置浏览器代理,确保所有流量通过 Burp Suite。
- 启动 Burp Suite,确保 Proxy 模块处于拦截状态。
攻击分析
使用 Burp Suite 拦截登录请求
- 在 DVWA 登录页面输入用户名和密码,点击登录。
- Burp Suite 会拦截到登录请求,记录下请求中的 Token 值。
分析 Token 生成机制
- 多次拦截登录请求,观察 Token 的变化规律。
- 如果 Token 是时间戳或简单递增的数字,则可能容易被预测。
实施重放攻击演示
- 复制拦截到的登录请求(包括 Token)。
- 使用 Burp Suite 的“Repeater”模块,多次发送相同的请求。
- 观察服务器是否接受重复的 Token,如果接受,则说明存在重放攻击漏洞。
防御方案
Token 时效性控制
- 为 Token 设置短有效期(如 5 分钟),过期后自动失效。
请求签名验证
- 对请求内容进行签名,确保请求在传输过程中未被篡改。
同源策略加强
- 使用 CSP(内容安全策略)限制请求的来源,防止跨站请求伪造。
代码示例
Python 示例
import time
from hashlib import sha256
# 生成 Token
def generate_token(user_id):
timestamp = int(time.time())
secret_key = "your_secret_key"
token = sha256(f"{user_id}{timestamp}{secret_key}".encode()).hexdigest()
return token, timestamp
# 验证 Token
def verify_token(user_id, token, timestamp):
current_time = int(time.time())
if current_time - timestamp > 300: # 5 分钟有效期
return False
secret_key = "your_secret_key"
expected_token = sha256(f"{user_id}{timestamp}{secret_key}".encode()).hexdigest()
return token == expected_token
Java 示例
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
public class TokenUtil {
private static final String SECRET_KEY = "your_secret_key";
public static String generateToken(String userId, long timestamp) {
try {
String input = userId + timestamp + SECRET_KEY;
MessageDigest digest = MessageDigest.getInstance("SHA-256");
byte[] hash = digest.digest(input.getBytes());
StringBuilder hexString = new StringBuilder();
for (byte b : hash) {String hex = Integer.toHexString(0xff & b);
if (hex.length() == 1) hexString.append('0');
hexString.append(hex);
}
return hexString.toString();} catch (NoSuchAlgorithmException e) {throw new RuntimeException(e);
}
}
public static boolean verifyToken(String userId, String token, long timestamp) {long currentTime = System.currentTimeMillis() / 1000;
if (currentTime - timestamp > 300) { // 5 分钟有效期
return false;
}
String expectedToken = generateToken(userId, timestamp);
return expectedToken.equals(token);
}
}
避坑指南
常见 Token 实现错误
- Token 未绑定用户会话,导致可以跨用户使用。
- Token 生成规律简单,容易被预测。
- Token 未设置有效期,导致长期有效。
修复建议
- 每次生成 Token 时,绑定用户会话或唯一标识。
- 使用强随机数生成 Token,避免规律性。
- 为 Token 设置合理的有效期,过期后重新生成。
进阶思考题
- Token 在分布式系统中如何实现共享和验证?
- 除了 Token,还有哪些机制可以有效防止重放攻击?
- 如何在不影响用户体验的前提下,提高 Token 的安全性?
结语
通过本次实战,我们了解了 Token 认证的基本原理和潜在漏洞,以及如何使用 Burp Suite 进行重放攻击分析。在实际开发中,Token 的安全性至关重要,开发者需要结合业务场景,合理设计 Token 生成和验证机制,确保 Web 应用的安全。希望本文能为 Web 安全初学者提供一些有用的参考和启发。
正文完
发表至: 网络安全
近一天内
