尧图网站建设 尧图网络
  • 首页
  • 关于我们
  • 服务项目
  • 案例展示
  • 建站流程
  • 资讯中心
  • 联系我们
首页/资讯中心/详情

Burp Suite宏实战:自动化破解动态Token登录防护

Burp Suite宏实战:自动化破解动态Token登录防护
📅 发布时间:2026/8/2 6:30:11

1. 项目概述与核心痛点

在Web应用安全测试,尤其是渗透测试和CTF比赛中,我们经常会遇到一种让人头疼的防御机制:动态Token登录页。这种页面的登录表单里,除了常规的用户名和密码字段,还会包含一个由服务器动态生成的、每次刷新页面都会变化的Token(通常叫csrf_token、nonce或authenticity_token)。这个Token会被提交到后端进行验证,如果提交的Token与服务器会话中存储的不一致,登录请求就会被直接拒绝。这意味着,你无法像测试静态登录页那样,简单地用Burp Intruder挂上一个密码字典就开始“爆破”——因为每次请求的Token都是新的、无效的,你的所有攻击尝试都会因为Token验证失败而告终。这就是所谓的“无效爆破”,你对着一个不断变化的锁孔,用再多的钥匙(密码)也是徒劳。

我遇到过太多新手朋友,包括一些刚开始打CTF的选手,卡在这种动态Token的登录页面前,要么手动复制粘贴Token累个半死,要么就干脆放弃这个测试点。其实,Burp Suite早就为我们准备了优雅的解决方案:宏(Macros)。宏可以自动化地执行一系列预定义的HTTP请求,并从中提取我们需要的数据(比如Token),然后在后续的攻击请求中自动替换。今天,我就手把手带你,用Burp的宏功能,彻底搞定动态Token登录页的自动化测试。为了让教程更直观,我们会以经典的DVWA(Damn Vulnerable Web Application)靶场作为实战环境,因为它自带一个典型的动态Token登录机制(在低安全级别下默认关闭,我们会手动开启高安全级别的登录CSRF防护来模拟)。学完这篇,你不仅能拿下DVWA,更能将这套方法应用到任何带有类似防护的真实网站或CTF题目中。

2. 环境准备与目标分析

2.1 搭建实战靶场:DVWA

首先,我们需要一个练习环境。DVWA是一个故意设计存在漏洞的PHP/MySQL Web应用,非常适合学习和练习Web安全技术。

安装方式选择:

  1. 一体化环境(推荐新手):使用XAMPP、WAMP或PHPStudy。以XAMPP为例,下载安装后,将DVWA的源码解压到htdocs目录下(例如C:\xampp\htdocs\dvwa)。然后启动Apache和MySQL服务。
  2. Docker方式(推荐熟悉Docker的用户):执行命令docker run --rm -it -p 80:80 vulnerables/web-dvwa即可快速拉起一个DVWA实例。
  3. 手动部署:需要自己配置PHP环境和MySQL数据库,并导入DVWA的SQL文件。

DVWA初始配置:访问http://localhost/dvwa/(或你的服务器IP),你会看到DVWA的安装页面。

  • 数据库设置:如果使用XAMPP,数据库用户通常是root,密码留空;主机为localhost。点击“Create/Reset Database”按钮。
  • 登录:默认用户名admin,密码password。
  • 设置安全级别:登录后,在左侧找到“DVWA Security”页面。为了模拟动态Token场景,我们需要将安全级别设置为“High”。在High级别下,登录表单会启用CSRF Token保护。

注意:部分DVWA版本在High级别下,不仅登录页,其他功能(如SQL注入)的请求也会加入Token,这会让我们的测试更贴近真实复杂场景。如果只是为了演示登录爆破,也可以修改DVWA源码,单独为登录页添加Token模拟。

2.2 分析目标:动态Token登录请求流程

设置好DVWA High安全级别后,退出登录(或打开隐私窗口),重新访问登录页http://localhost/dvwa/login.php。

用Burp Suite抓取这个登录请求(确保Burp代理已开启,浏览器配置了Burp的代理)。

首次请求(GET /login.php):

GET /dvwa/login.php HTTP/1.1 Host: localhost ... (其他请求头)

服务器返回的响应HTML中,表单里会包含一个隐藏的input字段:

<form action="login.php" method="post"> <input type="text" name="username" placeholder="Username"> <input type="password" name="password" placeholder="Password"> <input type="hidden" name="user_token" value="a1b2c3d4e5f67890abcdef1234567890"> <br /> <input type="submit" value="Login"> </form>

这个user_token的值(示例中的a1b2c3d4e5f67890abcdef1234567890)就是动态Token,每次刷新页面都会变。

登录请求(POST /login.php):如果我们输入用户名admin和密码test(错误的密码)并提交,Burp会抓到:

POST /dvwa/login.php HTTP/1.1 Host: localhost Content-Type: application/x-www-form-urlencoded Content-Length: 85 Cookie: PHPSESSID=your_session_id username=admin&password=test&user_token=a1b2c3d4e5f67890abcdef1234567890&Login=Login

可以看到,正确的Token被一并提交了。如果我们在Intruder中直接爆破密码,但Token不变,服务器会返回错误(可能是重定向回登录页,或提示Token无效)。

核心问题:我们需要在每次发送爆破请求(Payload)之前,先自动获取一次最新的Token,并将其填入当次请求中。这就是Burp宏和会话处理(Session Handling Rules)要帮我们做的事。

3. Burp宏的工作原理与配置详解

3.1 什么是Burp宏?

你可以把Burp宏理解为一组录制的、可重复播放的HTTP请求序列。它最常见的用途就是在会话(Session)处理中,用于在发送其他请求之前,先执行一些“预备动作”,比如:

  1. 访问登录页面,获取新的CSRF Token。
  2. 执行登录操作,获取有效的身份认证Cookie。
  3. 从服务器的响应中提取特定的数据(如Token、Cookie值)。

然后,Burp的会话处理规则会利用宏提取到的数据,自动更新后续发出的请求。这样,像Intruder、Scanner这些工具发出的每一个请求,在发出前都会先“播放”宏来获取最新Token,从而实现全自动化测试。

3.2 创建获取Token的宏

我们首先创建一个用于获取登录页Token的宏。

  1. 确保流量经过Burp:浏览器配置好Burp代理,并打开Burp的拦截(Intercept)或确保流量在历史记录(Proxy -> HTTP history)中可见。
  2. 获取登录页请求:在浏览器中访问http://localhost/dvwa/login.php。在Burp的HTTP历史记录中,找到这条GET /dvwa/login.php的请求。
  3. 发送到宏编辑器:右键点击这条GET请求,选择“Send to Macro Recorder”。
    • 这里有个关键点:我们只发送GET /login.php这个请求,而不是包含Token提交的POST请求。因为宏的目的是“获取”Token,而不是“使用”Token去登录。登录动作(即验证密码对错)是我们后续要用Intruder去测试的。
  4. 录制并配置宏:
    • 这会打开“Macro Recorder”窗口。点击“Configure item”按钮,进入宏的详细配置。
    • 宏编辑器:这里列出了宏包含的请求(目前只有一条GET请求)。我们需要告诉Burp如何从这次请求的响应中提取Token。
    • 添加提取项:在宏编辑器下方,点击“Add”按钮,添加一个自定义参数提取项。
      • 参数名称:填写user_token。这个名称可以自定义,但建议和表单字段名一致,便于理解。
      • 提取位置:由于Token在响应的HTML正文中,我们选择“Response body”。
      • 提取方式:Token通常在一个HTML标签的value属性里。我们选择“Regex”(正则表达式)来提取。
      • 输入正则表达式:我们需要编写一个能匹配name=\"user_token\"后面value属性值的正则表达式。一个比较健壮的表达式是:name=\"user_token\" value=\"([a-fA-F0-9]{32})\"。
        • name=\"user_token\" value=\"匹配固定的字符串部分。
        • ([a-fA-F0-9]{32})是捕获组,匹配32位的十六进制字符串(DVWA的Token格式)。括号()内的内容就是我们要提取的值。
        • 如果目标网站的Token格式不同(比如长度不定、包含其他字符),你需要调整这个正则表达式。可以先用“Test”功能验证提取是否正确。
      • 测试提取:在输入正则表达式后,点击“Test”按钮,Burp会应用这个正则表达式到当前宏请求的响应中,并显示提取结果。确认提取到的是正确的Token值。
  5. 保存宏:点击“OK”保存提取配置,再点击“OK”保存整个宏。给它起个易懂的名字,比如“DVWA_Get_Login_Token”。

实操心得:正则表达式的编写是宏配置的核心,也是容易出错的地方。一个技巧是,先在Proxy历史记录里,右键点击登录页的响应,选择“Show response in browser”,然后在浏览器查看页面源代码,精确找到Token所在的HTML上下文,再构思正则表达式。使用更精确的上下文可以减少匹配错误,例如input type=\"hidden\" name=\"user_token\" value=\"([^\"]+)\"可以匹配value属性里任意非引号字符,更通用。

3.3 配置会话处理规则(Session Handling Rules)

宏创建好了,但Burp还不知道什么时候该用它。这就需要通过会话处理规则来调度。

  1. 打开会话处理规则:在Burp顶部菜单栏,进入“Project options”->“Sessions”标签页。
  2. 添加新规则:在“Session handling rules”区域,点击“Add”按钮。给规则起名,如“Auto-Update DVWA Token”。
  3. 设置规则作用范围(Scope):
    • 点击“Scope”标签页。这里定义该规则对哪些URL生效。
    • 在“URL Scope”部分,选择“Use suite scope”通常就够用,但为了精确和避免干扰其他测试,建议选择“Include all URLs”。
    • 更佳实践是在“Include in scope”中添加我们的目标URL,例如^http://localhost/dvwa/.*。这样可以确保规则只影响DVWA靶场,不影响你同时测试的其他网站。
  4. 定义规则动作(Rule Actions):
    • 点击“Rule Actions”标签页,点击“Add” ->“Run a macro”。
    • 在弹出的窗口中,选择我们刚才创建的宏“DVWA_Get_Login_Token”。
    • 接下来是关键配置:“Update current request with parameters from macro response”。
      • 勾选这个选项后,下方会出现参数映射设置。
      • 我们需要将宏提取到的参数(user_token)更新到当前请求的哪个位置?
      • 参数处理:
        • “Update only the following parameters”: 勾选此项。
        • 在参数表格中,点击“Add”。
          • “Parameter name”: 填写user_token。这指的是当前即将发出的请求(比如Intruder的爆破请求)中需要被替换的参数名。
          • “Macro parameter”: 选择user_token。这指的是从宏响应中提取出来的那个参数值。
      • 这个配置的意思是:在发送每一个匹配规则作用范围的请求之前,先运行“DVWA_Get_Login_Token”宏,从最新的登录页响应中提取出user_token的值,然后用这个新值,替换掉当前请求中的user_token参数。
  5. 处理Cookie(可选但重要):
    • 动态Token通常和会话(Session)绑定。获取Token的GET请求和提交Token的POST请求,必须处于同一个会话中(即拥有相同的PHPSESSIDCookie),否则服务器会认为Token无效。
    • 因此,我们需要确保宏执行时使用的Cookie,能被传递到后续请求中。
    • 在“Run a macro”动作的配置窗口里,找到“Use cookies from the macro's final response in the current request”。务必勾选此项。
    • 这样,宏请求中服务器返回的Set-Cookie头(包含最新的PHPSESSID)就会被Burp捕获,并自动用于更新当前请求的Cookie头,保证会话一致性。
  6. 保存规则:一路点击“OK”保存规则。确保你的新规则在列表中是启用(Enabled)状态。你可以通过规则列表右侧的“顺序”箭头调整优先级,确保它在其他可能冲突的规则之前或之后执行。

4. 使用Intruder进行自动化密码爆破实战

环境、宏、规则都已就绪,现在让我们用Intruder来一场真正的、针对动态Token登录页的自动化爆破。

  1. 捕获登录请求:在DVWA登录页,输入用户名admin和一个任意密码(比如123),点击登录。在Burp的Proxy历史记录中,找到这条POST /dvwa/login.php请求。
  2. 发送到Intruder:右键点击该请求,选择“Send to Intruder”。
  3. 配置攻击类型与载荷位置:
    • 切换到Intruder标签页,再进入“Positions”子标签。
    • 点击“Clear §”清空所有默认标记。我们只需要标记两个变量位置:
      • 将password参数的值123标记为Payload 1。这是我们要爆破的密码字典位置。
      • 注意:user_token参数的值不要标记!因为它会被我们刚才配置的会话处理规则自动更新。如果你标记了它,Intruder反而会用Payload去覆盖它,导致规则失效。
      • 用户名username参数我们保持为固定的admin。
      • 所以,最终请求模板应该是:
      POST /dvwa/login.php HTTP/1.1 ... username=admin&password=§123§&user_token=...&Login=Login
      user_token处是一个具体的值,但未被§包围。
    • 攻击类型(Attack type):选择“Sniper”即可。因为我们只有一个变量(密码)在变化。
  4. 配置Payloads:
    • 切换到“Payloads”子标签。
    • 在“Payload set”处选择1(因为我们只标记了一个位置)。
    • 在“Payload type”处,根据你的字典来源选择。例如,选择“Simple list”,然后在下方列表中添加或粘贴你的密码字典,比如password,123456,admin123,letmein等等。你也可以从文件加载。
  5. 开始攻击:
    • 点击右上角的“Start attack”按钮。
    • Intruder攻击窗口会弹出。关键观察点:
      • 查看每个请求的user_token参数。你会发现,每一行的Token值都不同!这就是会话处理规则和宏在起作用。Intruder在发送每个请求前,都自动执行了一次宏,获取了新的Token并替换了进去。
      • 观察响应(Response)。你可以对响应进行排序(如按状态码、长度)。登录成功的响应通常与其他失败响应不同(可能是状态码302重定向到首页,或者响应长度明显不同,或者包含“Welcome”、“Logout”等关键字)。
  6. 分析结果:
    • 在DVWA High安全级别下,即使用正确密码password登录,响应也可能因为其他防护机制(如登录失败延迟)而显得复杂。但通过对比响应长度、状态码或搜索响应中的特定关键字(如“Login failed”),你依然可以找出成功的那个请求。
    • 找到密码为password的那一行,其响应很可能与其他行不同(例如,长度更长,因为包含了登录后的页面内容)。

至此,你已经成功实现了对动态Token登录页的自动化密码爆破。Intruder不再是“无效爆破”,而是变成了一个智能的、能自动应对Token变化的攻击工具。

5. 高级技巧与深度排查指南

掌握了基础流程,我们再来深入一些高级场景和常见问题排查,这些是实战中真正提升效率的关键。

5.1 处理更复杂的Token交互流程

有些网站的Token机制更复杂,例如:

  • 多步Token:获取Token需要先访问页面A,再从页面A的响应中提取一个参数去请求API B,才能拿到最终的登录Token。
  • Token加密或编码:Token不是明文,可能是Base64编码、哈希值或加密字符串,需要解密后才能使用。
  • Token与其他参数绑定:Token值可能依赖于用户名、时间戳或其他一次性随机数。

应对策略:

  • 多请求宏:在创建宏时,你可以录制多个连续的请求。Burp会按顺序执行它们。你可以在最后一个请求的响应中提取最终需要的Token。
  • 使用扩展(Extender):对于需要解密、编码或复杂计算的场景,Burp的宏可能力不从心。此时可以编写Burp扩展(使用Python或Java)。例如,你可以用Python扩展,在宏获取到原始数据后,调用自定义函数进行处理,再将结果返回给会话处理规则。
  • 结合“Engagement tools”:对于需要先进行一些计算(如JavaScript执行)才能得到Token的页面,可以尝试使用Burp的“Engagement tools -> Find scripts”功能来分析页面中的JS,或者甚至使用“Burp’s embedded browser”(如果可用)来让页面JavaScript正常执行后再抓取请求。不过,内嵌浏览器有时会失败(正如热词中提到的“burp 打开内嵌浏览器失败”),这时可能需要依赖静态分析或手动模拟JS逻辑。

5.2 会话处理规则的优化与调试

  • 规则作用域(Scope)精确定义:不合理的Scope会导致宏在不需要的请求上运行,拖慢测试速度,甚至干扰其他测试。务必使用正则表达式精确限定目标URL。例如,如果只针对登录,可以设为^https?://www\.target\.com/login\.php。
  • 调试宏和规则:
    • Burp提供了强大的调试功能。在“Sessions”标签页的“Session Handling Rules”编辑器里,有一个“Test”按钮。
    • 你可以输入一个目标请求(比如你的Intruder攻击请求模板),然后点击“Test”,Burp会逐步展示规则应用过程:是否匹配规则、执行了哪个宏、提取到了什么参数、最终修改后的请求是什么样子。这是排查规则是否生效的利器。
  • 处理登录后的会话:我们的例子只处理了登录时的Token。有些网站登录成功后,后续的每一个操作(如修改资料、发表评论)都需要携带新的Token。这时,你需要创建另一个宏,专门用于在已登录状态下,从主页面或特定API获取操作Token,并配置相应的会话规则作用于那些操作请求的URL范围。

5.3 常见问题排查实录

问题1:Intruder攻击时,Token没有更新,所有请求的Token都一样。

  • 可能原因1:会话处理规则未启用或Scope不匹配。检查规则是否勾选“Enabled”,并检查你的攻击请求URL是否在规则的Include范围内。
  • 可能原因2:宏的Token提取失败。去“Macro Editor”里,选中你的宏,点击“Edit”,再点击“Test”按钮,看是否能成功提取Token。可能是正则表达式写错了,或者页面结构变了。
  • 可能原因3:Cookie未同步。确保在“Run a macro”动作配置中勾选了“Use cookies from the macro's final response”。没有这个,获取Token的请求和提交Token的请求可能不在同一个会话,导致Token无效。

问题2:宏执行了,Token也更新了,但服务器还是返回Token错误。

  • 可能原因1:Token绑定其他信息。有些Token不仅与会话绑定,还可能和用户名、时间戳甚至客户端指纹有关。你需要分析获取Token的请求,看是否提交了其他隐藏字段,这些字段在登录请求中也需要一并提交且保持同步。
  • 可能原因2:请求顺序或时机问题。极少数情况下,服务器可能检查请求间隔,如果获取Token和提交登录的间隔太短(如同毫秒),可能被怀疑是自动化脚本。可以在会话规则中为宏添加一个延迟(在“Macro Recorder”配置编辑宏时,可以给每个请求添加延迟)。
  • 可能原因3:Token验证逻辑更复杂。比如Token是一次性的,用过即废。那么你的宏就需要在每一个Intruder请求前都执行一次。我们目前的配置正是这样做的(“Update current request”)。但如果网站要求先获取Token A,再用Token A去换Token B才能登录,那你的宏就需要包含两个请求。

问题3:使用宏后,Intruder攻击速度变得非常慢。

  • 这是正常现象。因为每发起一个攻击请求,Burp都要先额外执行一次甚至多次宏请求(获取Token)。这相当于把请求量翻倍或更多。
  • 优化建议:
    • 精简宏包含的请求,只保留获取Token最少的必要步骤。
    • 优化Payload字典,减少无效尝试。
    • 在Intruder的“Resource Pool”设置中,可以适当降低线程数,避免对目标服务器造成过大压力或触发速率限制。

6. 扩展应用:在Burp Scanner等其他工具中使用

会话处理规则是Burp Suite全局级别的配置。这意味着,不仅Intruder受益,Burp的其他工具也能自动应用这些规则。

  • Burp Scanner(主动扫描):当你启动主动扫描时,Scanner发出的请求也会先匹配会话处理规则。如果你的规则配置正确,Scanner在爬取和审计登录后的功能时,也能自动处理动态Token,使得扫描可以深入到需要认证的区域。
  • Repeater(重放器):在Repeater中手动修改和重放请求时,如果请求URL在规则作用域内,点击“Send”前,Burp也会自动运行宏并更新请求中的Token。这对于手动测试登录后功能非常方便,你无需每次手动复制Token。
  • 爬虫(Spider):同样,爬虫在爬取受保护区域时,也会利用会话规则维持有效的会话状态。

要让这些工具生效,只需确保两点:1) 你的会话处理规则已正确配置并启用;2) 你当前Burp的会话(Session)是已登录状态(或者你的规则包含了自动登录的宏)。例如,你可以创建一个更强大的宏,它先执行获取Token的请求,再用一组固定凭证(如测试账号)执行登录POST请求,并从登录成功的响应中提取会话Cookie。然后配置规则,对所有目标站点的请求都先运行这个“自动登录宏”,这样就能让整个Burp Suite都仿佛在一个已登录的状态下工作。

通过这篇详细的指南,你应该已经彻底掌握了如何利用Burp Suite的宏和会话处理功能,来优雅地解决动态Token登录页的自动化测试难题。这套方法的核心思想是“以自动化对抗自动化”,将防御机制带来的手动操作成本,通过工具配置转嫁回去。记住,理解HTTP请求/响应的交互流程、学会分析页面结构提取关键数据、熟练配置Burp这些高级功能,是一名安全测试人员从“会用工具”到“精通工具”的必经之路。下次再遇到令人望而生畏的动态Token,不妨自信地说:没关系,我有宏。

相关新闻

  • 用QEMU搭建ARM Linux驱动开发环境:从虚拟到真实的嵌入式学习路径
  • 2026 年 7 月新发布:合川靠谱的201 不锈钢水箱生产厂家联系方式,别再乱买水箱了,用它存水竟会埋下健康隐患!-潇湘凌云供水设备 - 企业推荐官【认证】
  • 树莓派变身家庭媒体中心:OSMC+Kodi打造全能电视盒子

最新新闻

  • 2026年预埋件品牌怎么选?基于行业数据的采购指南与厂商解析 - 优质品牌商家
  • MATLAB插值与拟合实战指南:从原理到选型,避坑与优化
  • 2026 年新消息:雨山知名的粮仓聚氨酯发泡定做厂家推荐,存粮怕潮怕漏?用对这玩意儿,粮仓能省出3倍成本! - 企业信息推荐【官方】
  • i.MX6ULL嵌入式Linux开发:从GPIO原理到LED控制实战
  • AGI军备竞赛下的硅谷工作文化畸变:从996到002的极限压榨与人才逃亡
  • 告别文献焦虑✅原来高分文献综述,套这个模板就能过

日新闻

  • 怀化母婴除甲醛公司测甲醛中心怎么选:康之居母婴除甲醛标准、流程、避坑指南 - 信誉隆金银铂奢回收
  • 三步打造你的终极音乐中心:foobox-cn网络电台功能完整指南
  • Lance湖仓格式:为多模态AI工作流设计的终极数据存储方案

周新闻

  • 怀化母婴除甲醛公司测甲醛中心怎么选:康之居母婴除甲醛标准、流程、避坑指南 - 信誉隆金银铂奢回收
  • 三步打造你的终极音乐中心:foobox-cn网络电台功能完整指南
  • Lance湖仓格式:为多模态AI工作流设计的终极数据存储方案

月新闻

  • ClickHouse版本管理深度实战:4步构建零风险升级与回滚体系
  • Java 23 种设计模式:从踩坑到精通 | 番外:责任链模式 —— 物流审批流程实战
  • 华硕笔记本性能解放指南:G-Helper轻量级控制工具全面解析

关于尧图

  • 公司简介
  • 团队介绍
  • 企业文化
  • 荣誉资质

服务项目

  • 定制开发
  • 电商建站
  • UI 设计
  • 运维服务

快速链接

  • 案例展示
  • 建站流程
  • 常见问题
  • 资讯中心

联系方式

  • 📍北京市朝阳区互联网产业园 A 座 10 层
  • 📞400-888-8888
  • ✉️contact@rkmt.cn
  • 🕐周一至周日 9:00-21:00

© 2024 北京尧图网络科技有限公司 版权所有 | 京 ICP 备 XXXXXXXX 号