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

1次阅读
没有评论

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

image.webp

背景介绍

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

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

然而,如果 Token 的生成或验证机制存在漏洞,攻击者可能通过重放攻击绕过这一防护。本文将带您一步步分析 DVWA 靶场中的 Token 认证机制,并演示如何使用 Burp Suite 实施重放攻击。

环境搭建

  1. DVWA 靶场安装
  2. 下载 DVWA(Damn Vulnerable Web Application)并部署在本地环境
  3. 确保 php 和 mysql 服务正常运行
  4. 修改 config/config.inc.php 中的数据库配置

  5. Burp Suite 配置

  6. 下载并安装 Burp Suite Community/Professional 版
  7. 配置浏览器代理为 127.0.0.1:8080
  8. 安装 Burp 的 CA 证书以拦截 HTTPS 流量

攻击分析

拦截登录请求

  1. 启动 Burp Suite,开启拦截功能(Proxy → Intercept is on)
  2. 在 DVWA 登录页面输入测试账号(如 admin/password)
  3. Burp 将捕获到类似如下的 POST 请求:
POST /dvwa/login.php HTTP/1.1
...
user_token=12345abcde&username=admin&password=password&Login=Login

分析 Token 机制

观察多次登录请求,可以注意到:

  • user_token 每次都会变化
  • 该 Token 通常出现在隐藏表单字段中
  • Token 可能由服务器会话、时间戳或其他因素生成

重放攻击演示

  1. 将捕获的请求发送到 Repeater 模块(右键→Send to Repeater)
  2. 修改用户名 / 密码后多次发送相同请求
  3. 若服务器未校验 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'])

避坑指南

  1. Token 未绑定会话 :确保 Token 与用户会话关联
  2. 可预测的 Token:使用强随机数生成器(如 Java 的 SecureRandom)
  3. 前端暴露生成逻辑 :Token 应在后端生成
  4. 日志记录 Token:避免在日志中输出完整 Token

进阶思考

  1. 如何设计分布式系统下的 Token 验证方案?
  2. 当用户禁用 JavaScript 时,Token 机制如何优雅降级?
  3. 除了 Token,还有哪些方法可以防止重放攻击?

总结

通过本次实战,我们了解了 Token 认证的基本原理和潜在风险。安全防护需要多层次防御:合理的 Token 设计、严格的时效控制、请求签名验证等都是必不可少的环节。建议开发者在实现认证系统时参考 OWASP 的相关指南,并定期进行安全审计。

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