免责声明 本教程仅为合法的教学目的而准备,严禁用于任何形式的违法犯罪活动及其他商业行为,在使用本教程前,您应确保该行为符合当地的法律法规,继续阅读即表示您需自行承担所有操作的后果,如有异议,请立即停止本文章阅读。
目录
重放
这篇文章我们开始学习Yakit的核心组件之一Web Fuzzer。Web Fuzzer模块支持用户自定义HTTP原文发送请求。为了让用户使用简单,符合直觉,只需要关心数据相关信息,Yakit后端(yaklang)做了很多工作。
首先我们先来学习重放请求的操作,在日常工作中可以使用 Web Fuzzer进行请求与响应的消息验证分析,比如修改请求参数,验证输入的漏洞;修改请求参数,验证逻辑越权;从拦截历史记录中,捕获特征性的请求消息进行请求重放。
在左上角,有一个
发送数据包
按钮,当我们对请求的消息编辑完之后,点击此按钮即发送请求给服务器端。响应消息区为对应的请求消息点击
发送数据包
按钮后,服务器端的反馈消息。通过修改请求消息的参数来比对分析每次应答消息之间的差异,能更好的帮助我们分析系统可能存在的漏洞。简单案例. 请求其他网站
假如我们需要将请求发送到其他网站,我们可以直接修改
Host
请求头,然后点击发送数据包
按钮即可。yaklang会自动识别Host
请求头中的域名并将请求发送到对应的服务器。
爆破
使用过Burp Suite的同学都知道,它有一个Intruder模块,它的核心其实并不是某一个功能,而是一整套的操作流:
- 劫持数据包
- 发送到Intruder
- 清除占位符,添加新的占位符
- 为占位符设置一个值序列,如字典,多行字符串,一串数字等
- 设置爆破模式,开始爆破
我们发现,后面几步是很繁琐的,很多时候大家花了大功夫的时间在设置上。
那么有没有更好的方法来完成呢?答案是肯定的,Yakit 使用了一种全新的方法,可以直接在Web fuzzer模块中完成重放与爆破两种工作,更轻松地实现批量发包模糊测试。
模糊测试标签
首先,我们需要介绍模糊测试标签(fuzztag)。fuzztag是一种小型语法结构,它大概长这个样子:
{{tagname(tagvalue)}}
,例如{{randint(1,100)}}
生成1-100随机整数。我们可以看到实际上fuzztag非常像一个函数调用,只是外层包裹了两个花括号。以
randint
这个fuzztag为例,其实所有fuzztag都只接收一个字符串,但是会在后端处理时会特殊处理。fuzztag还有许多变体,例如它可以嵌套调用:
{{base64(randint(100))}}
生成base64编码后的1-100随机整数。想要了解fuzztag可用标签和使用样例的同学可以查看这篇文章:Fuzz Tag Playbook。
使用模糊测试标签进行爆破
直接输入fuzztag
在我们了解了fuzztag之后,我们就可以开始使用它来进行爆破了。使用fuzztag最直接的方式是直接在Web fuzzer模块中输入,例如我们爆破数字1-10,只需要简单地在想爆破的位置输入
{{int(1-10)}}
即可:
插入空字节标签:{{hexd(00)}}
{{hexd(00)}}
将在所在位置插入一个空字节,可以用于测试空字节截断漏洞。这实际上也体现了fuzztag的另外一个好处,我们不需要Burp Suite的十六进制编辑器,也可以轻松地插入十六进制数据。插入临时字典
这个功能将用户输入的内容存储到临时文件中,并插入为fuzztag,他有两个模式,一个是插入整个文本内容,另外一个则是按文件内容的每一行插入(例如用户输入了5行字符串,则会发送5个请求)。
插入模糊测试字典标签
这个功能实际上是与yakit中的另外一个模块:payload的联动。当你再payload中导入了字典后,你可以使用这个功能点击闪电按钮将字典中的内容按行插入为fuzztag。
插入热加载标签
由于热加载的使用门槛较高,所以我们会在后续的教程中再提及相关的内容。
插入文件标签
这个功能与插入临时字典类似,一共有三个模式,第一个是插入整个文本内容,第二个是按文件内容的每一行插入,第三个则是按文件夹下的每一个文件插入(例如该文件夹下一共有5个文件,则会发送5个请求)。
* 插入标签
这是yakit最近新增的功能,当你在Web Fuzzer中鼠标点选了某个位置时,会弹出一个插入标签的悬浮框,在这个悬浮框中你可以选择插入一些常见的fuzztag。
爆破模式
我们知道,Burp Suite中存在四种爆破模式:Sniper,Battering ram,Pitchfork,Cluster bomb。但实际上我们真的需要爆破模式吗?它是不可替代的吗?
我们先来剖析一下这四个爆破模式的本质:
我们先来剖析一下这四个爆破模式的本质:
- Sniper:单个参数爆破,如果此模式下存在多个占位符,则只同时爆破一个占位符,其他占位符保持不变,例如:
{"key": "§value§", "key2": "§value2§"}
,此时爆破时会先爆破value,而§value2§
则保持不变,发送的包为:{"key": "爆破值", "key2": "value2"}
- Battering ram:多个参数同时使用一个字典爆破,例如:
{"key": "§value§", "key2": "§value2§"}
,此时爆破时会先同时爆破value和value2,发送的包为:{"key": "爆破值", "key2": "爆破值"}
- Pitchfork:多个参数同时爆破,使用不同字典,字典间一一对应,行数不一致时则取最小值。例如:
{"key": "§value§", "key2": "§value2§"}
,使用的第一个字典为1,2
,第二个字典为3,4
,则发送的包为:{"key": "1", "key2": "3"}
,{"key": "2", "key2": "4"}
- Cluster bomb:多个参数同时爆破,使用不同字典,字典间做笛卡尔乘积模式。例如:
{"key": "§value§", "key2": "§value2§"}
,使用的第一个字典为1,2
,第二个字典为3,4
,则发送的包为:{"key": "1", "key2": "3"}
,{"key": "1", "key2": "4"}
,{"key": "2", "key2": "3"}
,{"key": "2", "key2": "4"}
根据上述的分析,我们可以看到爆破模式实际上主要服务于多个参数爆破且使用不同字典的情况,我们有没有更好的方式来替代爆破模式呢?答案是肯定的,我们依然可以使用fuzztag来实现。
首先我们来看看多参数的情况下fuzztag的默认表现,实际上他是类似于Cluster bomb爆破模式:
可以看到一共发送了4个包,和Cluster bomb爆破模式一致。
那么我们要如何使用fuzztag来实现Battering ram爆破模式呢?我们只需要在每个参数的位置插入相同的fuzztag即可:
我们再来看看如何使用fuzztag实现Pitchfork爆破模式,这时候需要学习fuzztag的一个小小的新语法。我们知道fuzztag它大概长这个样子:
{{tagname(tagvalue)}}
,但实际上我们可以给他分组,就像这个样子:{{tagname::1(tagvalue)}}
。两个冒号后面的数字表示分组,分组的意思是:同一个分组的fuzztag会被替换为同一个 Index 的值。例如我们想要实现Pitchfork爆破模式,我们只需要在每个参数的位置插入fuzztag,并且在每个fuzztag后面加上相同的分组标识即可:
高级配置
经过上面两篇教程的讲解,相信师傅们已经能够正常地使用Web Fuzzer模块进行重放与爆破了。但是有时候我们会遇到一些问题,例如我们需要在爆破时使用代理,或者我们需要在爆破时使用国密TLS等场景,这时候我们就需要对Web Fuzzer进行一些高级配置了。
首先我们需要打开高级配置,如图所示:
高级配置
强制HTTPS
开启强制HTTPS选项,可以使得这次请求强制使用HTTPS协议而非HTTP协议进行通信,这在某些网站要求强制使用HTTPS时非常有用。
国密TLS
开启国密TLS选项,可以使得这次请求使用国密TLS协议进行通信,可以在某些网站要求使用国密TLS进行通信时使用。
真实Host
我们知道,Web Fuzzer在默认情况下会从请求包中提取Host请求头来作为我们要通信目标,但是有时候我们需要手动指定Host请求头,这时候我们就可以填写真实Host,这样Web Fuzzer就会使用我们手动指定的真实Host来进行通信,这在Host碰撞的场景下非常有用。
设置代理
默认情况下,Web Fuzzer会走系统代理来进行发包。但是有时候我们需要手动指定代理,这时候我们就可以填写设置代理,这样Web Fuzzer就会使用我们手动指定的代理来进行通信,这在访问内网服务的场景下非常有用。在指定多个代理的情况下,Web Fuzzer会智能找到可用的代理进行请求。
禁用系统代理
默认情况下,Web Fuzzer会走系统代理来进行发包。但是有时候我们不想使用系统代理,或者说这次发包不应该走系统代理,这时候我们就可以开启禁用系统代理选项。
响应数量限制
响应数量限制用于限制页面中最多渲染多少个请求响应,这个限制是由于请求响应过多时可能会对前端渲染造成一定的压力,所以需要对其进行限制。限制后如果想要查看所有响应,可以点击查看全部按钮:
响应体长度限制
响应体长度限制用于限制页面中最多渲染的最长响应长度,这个限制是由于响应过大时可能会对前端渲染造成一定的压力,所以需要对其进行限制。当响应长度超过限制时,Web Fuzzer 会自动截断响应体,并显示超大响应,如果想要查看完整响应,可以点击完整响应按钮,在本地查看:
请求包配置
Fuzztag 辅助
这也是一个用于辅助我们构造 Fuzztag 的工具。我们可以选择一些基础fuzztag,然后对他进行修改,查看生成后的 payload ,并且还可以将其添加到插入标签悬浮框的常用标签中。
渲染 Fuzz
默认情况下,渲染 Fuzz选项是打开并选中标准模式的。 三个模式的区别如下:
- 关闭:关闭该选项之后,所有的 Fuzztag 就会失效。这在我们不需要Fuzz标签而且与某些模板引擎语法冲突的情况下非常有用。
- 标准:标准模式下,Web Fuzzer 会对请求包中的Fuzz标签进行渲染,每个 Fuzztag 必须严格符合
{{tagname1({{tagname2(param)}})}}
的格式。- 兼容:兼容模式下,Web Fuzzer 会对请求包中的Fuzz标签进行渲染,在嵌套fuzztag的情况下,我们可以省略多余的花括号,例如:
{{tagname1(tagname2(param))}}
。不修复长度
默认情况下,Web Fuzzer会对请求包进行一些修复,其中也会对
Content-Length
请求头进行修复。我们知道,在数据包完全正确的情况下,Content-Length
请求头的值应该等于请求体的长度,但是一般情况下我们修改了请求体之后不可能手动去计算Content-Length
的值,这时候Web Fuzzer就会自动修复Content-Length
的值。但是有时候我们可能遇到HTTP走私的情况或者不希望Web Fuzzer修复长度,这时候我们就可以开启不修复长度选项。超时时长
即每个请求的超时时间,单位为秒。在请求超时时,Web Fuzzer会自动返回并提示请求超时的错误。
批量目标
批量目标在你要对多个目标进行测试时非常有用。我们可以通过手动输入或者上传文件的方式来指定多个目标,这些目标之间用英文逗号或换行符分隔:
并发配置
重复发包
重复发包一般用于测试条件竞争或者大并发的情况。填写重复发包的值(后续称之为n)后,Web Fuzzer会重复发包n次。这实际上也是通过添加了fuzztag标签实现的,其等价于在请求包的任意位置添加
{{repeat(n)}}
。并发线程
在我们设置了fuzztag后,我们可能会发送不止一个数据包,此时我们可以通过填写并发线程的值控制用于并发的线程数量。这在我们需要进行快速并发测试或者请求网站的防火墙对访问速度有限制时非常有用。
随机延迟
在我们并发请求网站的场景下,请求网站的防火墙可能会对访问速度有限制,此时我们可以通过设置随机延迟的Min和Max值,这样可以在每次请求之前延迟随机的时间(Min-Max秒),这可以在一定程度上通过请求网站的防火墙。
重试配置
重试次数
在网络请求中,我们不可避免会遇到许多网络连通性的问题,比如服务器负载过高导致服务端错误(502状态码)或者网络波动导致请求失败,此时我们可以通过设置重试次数的值来控制Web Fuzzer重试的次数,这可以在一定程度上提高请求的稳定性。
重试条件
重试条件配合重试次数使用。我们可以通过填写重试条件中状态码的值,设置其在响应什么状态码时进行重试。例如我们填写了
502,503
,则当响应状态码为502或者503时,Web Fuzzer会进行重试。不重试条件
不重试条件配合重试次数使用。我们可以通过填写不重试条件中状态码的值,设置其在响应什么状态码时不进行重试。例如我们填写了
200,302
,则当响应状态码为200或者302时,Web Fuzzer不会进行重试。无论如何,Web Fuzzer不会对30x的响应状态码进行重试。重定向配置
禁用重定向
开启禁用重定向选项可以禁用请求时的自动重定向。这在我们需要测试重定向漏洞时非常有用。
重定向次数
重定向次数的值只有在关闭禁用重定向选项时生效。它表示的是在请求时最多允许重定向多少次。
JS重定向
我们知道js一般通过调用
window.location.href
或者window.location.replace
来进行页面的重定向。一般情况下这种重定向是无法跟踪的,这时候我们就需要开启JS重定向选项,来跟踪这种重定向。DNS配置
DNS服务器
DNS服务器用于指定本次请求使用的DNS服务器。在默认情况下,Web Fuzzer会使用系统的DNS服务器,但是有时候我们需要手动指定DNS服务器,这时候我们就可以填写DNS服务器的值,这在访问一些内网服务时非常有用。
Hosts配置
Hosts配置可以直接添加host到ip的映射。这在指定的dns服务器都无法正常工作的情况下非常有用。
未完待续~~~!!!!!!