本文的知识内容,仅供网络安全从业人员学习参考,用于已获得合法授权的网站测试,请勿用于其它用途。请勿使用本文中的工具、技术及资料,对任何未经授权的网站、系统进行测试,否则,所造成的直接或间接后果,均由您自行承担。
在日常测试场景中,我们可能会遇到一种情况,如果测试目标的某些功能存在Token验证的机制,每一次发送测试的数据包都需要携带服务端新分配的Token,如果Token不匹配,就禁止访问业务。但是,每一次发送请求数据都人工去找新的Token再进行测试,过程会非常繁琐,测试效率非常低下,且十分耗费精力。那如果遇到这种带有 token 校验的场景应该怎么办呢?本文中我们使用HTTP抓包测试工具中的局部(全局)变量通过 DVWA 的靶场来讲解我们是怎么解决这类问题的。
本文通过测试靶场来演示功能“局部(全局)变量”。
使用工具:HTTP抓包测试工具、正则表达式生成器。
测试靶场:https://github.com/digininja/DVWA。
靶场截图
测试思路
1. 访问目标网站:首先,访问目标网站。
2. 抓取请求数据包:使用抓包工具来抓取网站提交查询请求时发送的请求数据包。
3. 发现token校验码:在抓取的数据包中,发现存在一个Token校验码,该校验码的作用是为了防止同一请求重复提交。
4. 重放测试:在重放模块中,多次发送该数据包,发现不存在 Token 复用。
5. 获得token:复用失败后页面会进行跳转,该页面携带服务端新分配的Token。
6. 提取token:使用正则表达式,从响应数据中提取出对应的token校验码。
7. 替换token:配置好变量后,每次发送请求数据,抓包测试工具会自动获取新的Token代入到请求数据包中发送。
打开 HTTP抓包测试工具,打开右上角内置浏览器,在浏览器中访问靶场的网站,加载后为一个表单输入框的界面:
测试界面
在文本框中输入满足数据库查询条件的字符串,例如输入“1”,然后点击提交按钮进行查询。查询提交后,页面会显示相应数据,显示“ ID:1,First name: admin,Surname: admin “的信息,此外,我们还在 URL 中发现了一个明显的字段名为“user_token”。
查询结果
为了查看该 Token 是否能复用,使用 HTTP抓包测试工具的重放模块进行验证,在 HTTP 点击左上角开启拦截,再次点击“Submit”提交数据,成功抓取到提交的数据请求包:
抓取数据包
我们可以查看到数据包中的确携带“user_token=d8eaf8da1068847f76a1e5beee9094bc”,如果能够使用该 Token 多次发送请求数据包的话就证明确实存在 Token 复用,如果不能则证明没有该漏洞。所以把该请求包发送到数据重放模块中(也可单击右键发送):
数据重放页面
点击发送按钮,可以看到右侧响应数据中返回了 HTTP 为 200 的响应码。
第一次发送数据
因为第一次为有效的 Token 验证码,所以能够成功,当我们再次发送数据的时候,是否能再次成功?
如果该靶场中后端没有自动更新token,而是由前端主动访问该页面后才更新,那么此处更新的请求将会被拦截(重放模块的响应数据不会被触发,不会导致前端页面更新),这种时候就会导致 Token 复用。
当我们再次点击发送重放模块中的数据包,可以看到右侧返回的 HTTP 响应码 302 。
请求内容跳转
很明显两次请求返回的返回的状态码及页面内容不一致,说明不存在 Token 复用的情况。返回的 HTTP 状态码为 302,该状态码表明请求的资源暂时移动到新位置,我们进一步查看跳转到新位置的数据包内容,为了得到重定向后的数据包内容,点击上方“重定向”,在重定向中选择“选择性跟踪”:
重定向跟踪
跟踪后我们再次发送请求发现页面会跳转到主页,而在响应数据的源代码中,我们审计后发现存在一个表单名叫“user_token”,该属性的 value 值即为后端更新后的 Token。
302 跳转主页
但是测试中不可能每次发送请求前手动去请求页面,更不可能每次手动去填写和翻找新的 Token,所以接下来我们使用局部(全局)变量来解决这个问题:
复制当前重放模块中的数据包:因为该数据发送请求后会触发后端响应,触发后端响应后会得到一个新的 Token,所以需要使用此数据包来发送请求。为了方便文章中的描述,这里暂时把该数据包称之为“可以获取新的Token的数据包”。
接下来设置局部变量,首先点击局部变量。
局部变量
在弹出的界面中,设置相关的参数:
· 填入方便记忆的变量名称,如“Token”;
· 数据类型选择“发送 HTTP 请求,从响应中提取数据”;
· 跟踪重定向选择“同域跟踪”,因为需要跟踪 302 跳转后的响应数据;
· 请求数据包填入之前称之为“可以获取新的Token的数据包”的数据包。
· 请求会话 Cookie 选择“使用引用该变量的数据包 Cookie”。
设置相关参数
请求会话Cookie 中的三种情况 - > 三个配置选项的说明:
1. 使用引用该变量的数据包Cookie:
○ 在发送获取Token的请求数据包时,不使用该数据包中的Cookie,而是使用引用该变量的数据包中的Cookie。
2. 使用当前数据包中的Cookie:
○ 在发送获取Token的请求数据包时,直接使用该数据包中的Cookie值。注意使用该选项请确保填入的数据包中包含 Cookie数据。如果我们想要将该数据包的Cookie和引用该变量的数据包的Cookie不同,需要替换掉引用该变量的数据包的Cookie,请勾上“覆盖引用该变量的数据包 Cookie”选项。
3. 每次请求前获取新Cookie:
○ 在发送获取Token的请求时,获取一个新的会话Cookie,而不是使用引用该变量的数据包的Cookie。(请注意删除获取Token数据包中的会话Cookie,否则测试目标不会分配新的会话Cookie。)如果我们想要将获取到的新的Cookie替换掉引用该变量的数据包的Cookie,就需要勾上“覆盖引用该变量的数据包 Cookie”选项。
下拉右侧进度条,点击测试按钮:
测试发送到请求
在弹出的测试结果页面中,选择不使用代理服务器,点击右下角测试按钮启动测试。
代理服务器的选择
在测试结果页面的运行数据中,点击响应数据中可以查看得到返回的数据,但是返回的数据是整个页面的数据,为了得到表单user_token属性的value值,此处使用正则表达式来提取对应数据:
响应数据
可能很多人不会写正则表达式,不过没关系,我们可以借助TangGo测试平台中的正则表达式自动生成工具来帮助我们自动生成正则表达式。
在响应数据包上点击右键,依次点击<发送到其他工具-->正则表达式生成器>,直接将响应数据发送到TangGo主框架的正则表达式生成器中:
正则表达生成器
打开正则表达式生成器后,找到需要提取的Token值(620235**e67891),使用鼠标框选它,右侧将展示多个已生成的正则表达式供您选择。
匹配规则生成
首先随机选择一个规则,例如我们选取倒数第五个规则。随后,点击右上角的测试按钮,你将在页面底部的文本框中看到匹配的内容。请仔细核对匹配数据显示的内容是否与所选的 Token 值(620235**e67891)一致,确认无误后,即可复制该正则表达式。
选择正则表达式
关闭掉测试结果页面,回到变量数据绑定设置,选择“提取匹配正则的数据绑定到变量”,填入复制的正则表达式:
填写正则表达式
填写完成后,点击测试:
再次测试
查看变量绑定结果,成功提取到 Token 值。
变量绑定结果
回到重放模块中,点击右键插入局部变量 Token 替换user_token 后的数据为新数据:
插入局部变量 Token
局部变量已经设置完成,下面我们会对比一下设置的区别。
区别对比
接下来我们通过两张图片直观的查看一下使用局部变量替换 Token 后的区别。
替换前,此时并未使用局部变量替换 Token 的值,发现第二次发送数据包出现了 HTTP 响应码为 302 。
未使用局部变量
替换后,经过多次重放数据,发现HTTP响应码始终保持在200。说明插入的变量会在发送前自动修正为获取到的新的Token。
使用局部变量
在重放模块中发送该数据后,如果我们想要查看实际发送的数据包的话,可以点击右侧的“请求数据”标签页,这里会显示实际发送的请求数据。
请求数据选项
通过比较左右数据包的内容,我们观察到在发送携带局部变量的数据包后,其中的局部变量值已经自动修正为“46bc980***a18f904f4593”。
局部变量与全局变量
本文中只涉及使用了局部变量,并未涉及使用全局变量,是因为局部变量和全局变量的设置流程是一致的,只是各自的生效的区间不同。你可以在右上角的设置中,找到全局变量设置:
全局变量设置
那这两种变量有何区别?
局部变量:局部变量仅在当前选项卡中有效,如果需要在其他选项卡中使用相同的变量,可以通过新建副本标签来复制该局部变量。
全局变量:全局变量在整个工具中都是有效的,可以在任何地方使用该变量。
本教程详细介绍了局部变量的使用方法。当测试目标中某些功能涉及Token验证机制时,我们利用局部变量的功能,成功解决了相关问题。
注意:工具使用内容请以最新版本为主。
下载和反馈
TangGo社区版本下载:
· https://tanggo.nosugar.tech/
反馈问题:
· https://tanggo.nosugar.tech/#/feedback
· 通过微信交流群反馈:关注【无糖反网络犯罪研究中心】公众号,回复“TangGo”,加入交流群进行反馈。
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论