Burp Suite实战:DVWA靶场中带Token认证的登录密码重放攻击分析与防御

1次阅读
没有评论

共计 1979 个字符,预计需要花费 5 分钟才能阅读完成。

image.webp

背景介绍

重放攻击 (Replay Attack) 是 Web 安全中常见的攻击手法,攻击者通过截获并重复发送有效的网络请求来冒充合法用户。这种攻击尤其危险,因为它不需要破解密码或密钥,只需要原样复现请求即可。

Burp Suite 实战:DVWA 靶场中带 Token 认证的登录密码重放攻击分析与防御

Token 认证是现代 Web 应用常用的安全机制,通常用于防止 CSRF 攻击。基本原理是服务器在用户访问页面时生成一个随机 Token,提交表单时需要携带该 Token 进行验证。看似安全的 Token 机制如果实现不当,同样可能被绕过。

环境准备

  1. DVWA 靶场搭建
  2. 下载 DVWA(Damn Vulnerable Web Application)
  3. 配置 PHP 环境(推荐 XAMPP 或 Docker)
  4. 修改 config/config.inc.php 中的数据库配置
  5. 访问 setup.php 完成初始化

  6. Burp Suite 配置

  7. 下载并安装 Burp Suite Community/Professional
  8. 配置浏览器代理(通常为 127.0.0.1:8080)
  9. 安装 Burp 的 CA 证书(访问 http://burp 获取)
  10. 确保 Proxy→Intercept 处于开启状态

攻击步骤详解

1. 拦截登录请求

首先访问 DVWA 登录页面(默认 http://localhost/dvwa/login.php),在 Burp Suite 中:

  1. 确保拦截功能开启(Intercept is on)
  2. 输入测试账号 (admin/password) 点击登录
  3. 在 Burp 中会捕获到 POST 请求,类似:
POST /dvwa/login.php HTTP/1.1
...
username=admin&password=password&Login=Login&user_token=abc123def456

2. 分析 Token 机制

关键观察点:

  • Token 在哪个阶段生成(页面加载时 / 提交时)
  • Token 是否与用户会话绑定
  • Token 的有效期多长

通过多次请求可以发现 DVWA 的 Token:

  1. 每次页面加载时生成新 Token
  2. 但提交时服务器只验证 Token 存在性
  3. 旧 Token 在短时间内仍可重用

3. 构造重放攻击

  1. 右键捕获的请求→Send to Repeater
  2. 在 Repeater 中多次点击 Send
  3. 观察响应:虽然 Token 已过期但仍能登录成功

4. 漏洞原理

问题在于服务器端验证逻辑存在缺陷:

  • 只检查 Token 格式有效性
  • 未验证 Token 时效性
  • 未建立 Token 使用记录

防御方案

1. 时间戳验证

// 生成 Token 时加入时间戳
$token = md5(session_id().time());
$_SESSION['token_time'] = time();

// 验证时检查时效(如 5 秒内有效)
if(time() - $_SESSION['token_time'] > 5){die("Token expired");
}

2. 一次性 Token

// Java 示例 - 使用后立即失效
String serverToken = (String)session.getAttribute("CSRF_TOKEN");
if(!serverToken.equals(request.getParameter("token"))){throw new SecurityException("Invalid token");
}
session.removeAttribute("CSRF_TOKEN");  // 使 Token 失效

3. 请求签名

# Python Flask 示例
from itsdangerous import TimedJSONWebSignatureSerializer as Serializer

def generate_token():
    s = Serializer(current_app.config['SECRET_KEY'], expires_in=60)
    return s.dumps({'csrf': session['user_id']}).decode('utf-8')

def validate_token(token):
    s = Serializer(current_app.config['SECRET_KEY'])
    try:
        data = s.loads(token)
        return data.get('csrf') == session['user_id']
    except:
        return False

最佳实践建议

  1. Token 生成
  2. 使用加密强随机数生成器
  3. 绑定用户会话和操作类型
  4. 加入时间戳和操作上下文

  5. Token 验证

  6. 检查格式有效性
  7. 验证时效性(建议 1 - 2 分钟)
  8. 记录使用状态

  9. 补充措施

  10. 关键操作增加二次认证
  11. 实施请求频率限制
  12. 记录异常请求日志

思考延伸

  1. 如何设计分布式环境下的 Token 验证机制?
  2. 前端 SPA 应用与 API 交互时如何安全传递 Token?
  3. 除了 Token,还有哪些方法可以防止重放攻击?

通过这次实践,我们发现即使是看似安全的 Token 机制,如果实现不当也会成为攻击突破口。安全防御需要从整体架构考虑,实施纵深防御策略。

正文完
 0
评论(没有评论)