ffuf 是一款功能强大的 Web 模糊测试工具,以下是其基本使用教程:
(一)安装
(1)从源码安装(以 Linux 为例):
确保系统已经安装了 Go 语言环境。如果没有安装,可以通过系统的包管理器进行安装(例如在 Ubuntu 上可以使用sudo apt-get install golang)。
使用go get -u github.com/ffuf/ffuf命令来下载和安装 ffuf。安装完成后,ffuf可执行文件通常会在$GOPATH/bin目录下。
(2)使用预编译版本:
可以从 ffuf 的官方 GitHub 发布页面(https://github.com/ffuf/ffuf/releases)下载适合您操作系统的预编译二进制文件。下载后,将其放置在系统的可执行路径中或者在使用时指定其路径。
(二)基本用法
(1)简单的目录爆破:
ffuf -w wordlist.txt -u http://example.com/FUZZ
-w参数指定要使用的字典文件(这里是wordlist.txt)。
-u参数指定目标 URL,其中FUZZ是一个关键字,ffuf 会用字典中的每个单词替换FUZZ来发起请求。
(2)查找子域名:
ffuf -w subdomains.txt -u http://FUZZ.example.com -H "Host: FUZZ.example.com"
这里使用子域名字典(subdomains.txt),并通过-H参数设置请求头中的Host字段,以正确地请求每个子域名。
(三)高级用法
(1)指定请求方法:
可以使用-X参数指定请求方法,如-X POST。例如:ffuf -w wordlist.txt -u http://example.com/login -X POST -d 'username=admin&password=FUZZ'。这在测试登录页面等需要 POST 请求的场景很有用,这里尝试用字典中的内容作为密码进行爆破。
(2)过滤响应:
-fc参数用于根据响应状态码过滤。例如-fc 404会过滤掉状态码为 404 的响应,只显示其他状态码的结果。
-fs参数用于根据响应内容大小过滤。例如-fs 1234会过滤掉响应内容大小为 1234 字节的页面。
-fr参数可以根据正则表达式过滤响应内容。例如-fr "Welcome"只显示响应内容中包含 “Welcome” 的结果。
(3)增加请求头和 Cookie:
-H参数用于添加请求头。如-H "User-Agent: Mozilla/5.0"可以设置自定义的用户代理。
-b参数用于添加 Cookie。例如-b "sessionid=12345"可以在请求中带上指定的 Cookie。
(四)输出格式
可以使用-o参数指定输出文件,使用-of参数指定输出格式。例如-o results.txt -of json会将结果以 JSON 格式输出到results.txt文件中。常见的输出格式还有html、xml等,可以方便后续的结果分析。
翻译:ffuf -h
HTTP选项:
-H 请求头'Name:Value'用冒号分隔。可接受多个标志
-X 要使用的HTTP方法。如get,post
-b Cookie数据`"NAME1=VALUE1; NAME2=VALUE2"`
-d POST 数据
-http2 使用HTTP2协议(默认值:false)
-ignore-body 不要获取响应内容。(默认值:false)
-r 遵循重定向(默认值:false)
-recursion 递归扫描,只支持FUZZ关键字,并且-u结尾(默认值:false)
-recursion-depth 最大递归深度。(默认值:0)
-replay-proxy 使用此代理重播匹配的请求
-timeout HTTP请求超时(秒)。(默认值:10)
-u 目标url
-x 代理URL(SOCKS5或HTTP)。例如:http://127.0.0.1:8080或socks5://127.0.0.1:8080
常规选项:
-V 显示版本信息(默认值:false)
-ac 自动校准过滤选项(默认值:false)
-acc 自定义自动校准字符串。可以多次使用。含义-ac
-ach 每主机自动校准(默认值:false)
-ack 自动校准关键字(默认值:FUZZ)
-acs 自动校准策略:“基本”或“高级”(默认值:基本)
-c 将输出着色。(默认值:false)
-config 从文件加载配置
-json json输出,打印换行分隔的json记录(默认值:false)
-maxtime 整个进程的最大运行时间(以秒为单位)。(默认值:0)
-maxtime-job 作业每个作业的最大运行时间(以秒为单位)。(默认值:0)
-noninteractive -非交互式禁用交互式控制台功能(默认值:false)
-p 请求之间的“延迟”秒数,或一系列随机延迟。例如“0.1”或“0.1-2.0”
-rate 每秒请求的速率(默认值:0)
-s 不打印附加信息(静默模式)(默认值:false)
-sa 在所有错误情况下停止。暗示-sf和-se。(默认值:false)
-se 在出现虚假错误时停止(默认值:false)
-sf 当>95%的响应返回403 Forbidden时停止(默认值:false)
-t 并发线程数。(默认值:40)
-v 详细输出,打印完整的URL和重定向位置(如果有)以及结果。(默认值:false)
匹配器选项:
-mc 匹配HTTP状态代码,或“全部”表示所有内容。(默认值:200,204,301,302,307,403,404,500)
-ml 匹配响应行数
-mmode 匹配器集运算符。以下任一项:和或(默认值:或)
-mr 匹配正则表达式
-ms 匹配HTTP响应大小
-mt 匹配第一个响应字节的毫秒数,大于或小于。例如:>100或<100
-mw 匹配响应的单词数量
过滤器选项:
-fc 从响应中筛选HTTP状态代码。代码和范围的逗号分隔列表
-fl 根据响应的行数进行过滤。行计数和范围的逗号分隔列表
-fmode 筛选器集运算符。以下任一项:和或(默认值:或)
-fr 筛选器正则表达式
-fs 筛选器HTTP响应大小。大小和范围的逗号分隔列表
-ft 根据到第一个响应字节的毫秒数进行筛选,大于或小于。例如:>100或<100
-fw 按响应的字数进行筛选。以逗号分隔的单词计数和响铃列表
输入选项:
-D DirSearch单词列表兼容模式。与-e标志一起使用。(默认值:false)
-e 扩展名的逗号分隔列表。扩展FUZZ关键字
-ic 忽略单词列表注释(默认值:false)
-input-cmd 要测试的输入数。与--input cmd一起使用。(默认值:100)
-input-shell 用于运行命令的外壳
-mode 多单词列表操作模式。可用模式:clusterbomb, pitchfork, sniper (default: clusterbomb)
-request 包含原始http请求的文件
-request-proto 与原始请求一起使用的协议(默认值:https)
-w 用冒号分隔的单词列表文件路径和(可选)关键字
输出选项:
-debug-log 将所有内部日志记录写入指定的文件。
-o 将输出写入文件
-od 将匹配结果存储到的目录路径
-of 输出文件格式。可用格式:json、ejson、html、md、csv、ecsv(或所有格式的“all”)(默认值:json)
-or 如果没有结果,就不要创建输出文件(默认值:false
示例用法:
快速上手:
-u:指定URL地址
-w:设置字典文件
-c:将响应状态码用颜色区分
-t:设置线程数,默认40
-p:请求延时,如:0.1s
-H:设置HTTP头部信息
-X:指定HTTP方法
-d:POST数据
-r:跟随重定向
-x:设置代理,如:http://127.0.0.1:8080
-o:输出结果文件
-of:输出格式,如html、json、csv等
ffuf -w xxx.txt -u https://xxx.com/FUZZ -mc all -fs 42 -c -v
ffuf -u http://xxx.com/FUZZ -w xxx.txt -fc "200" -o result.html -of html
目标 URL 设定与字典替换
单一替换点:
格式:ffuf -w
如果目标网址有多个需要替换的部分,可以这样用:ffuf -w
请求方法指定:
使用-X参数指定请求方法,如-X POST。比如:ffuf -w data.txt -u http://example.com/submit -X POST -d 'param=FUZZ',用于测试 POST 请求的场景,字典内容替换param的值。并发数控制:
通过-c参数可以设置并发请求的数量,如-c 20,这意味着同时会有 20 个请求在运行,可以加快测试速度,但如果设置过高可能导致目标服务器负载过大或请求被限制。字典选择与处理
多字典同时使用(不同位置):
假设目标 URL 有两个不同部分需要用不同字典进行模糊测试,如http://example.com/FUZZ1/page/FUZZ2,可以使用-w参数多次指定不同字典:ffuf -w dict1.txt -w dict2.txt -u http://example.com/FUZZ1/page/FUZZ2,这里dict1.txt中的内容会替换FUZZ1,dict2.txt中的内容会替换FUZZ2。字典编码设置:
如果字典中的内容需要特定编码(如 UTF - 8、GBK 等),虽然 ffuf 通常能自动处理常见编码,但在某些特殊情况下,可以通过系统环境变量或者特定的编码转换工具对字典进行预处理。目标 URL 的更多设定
协议指定与切换:
可以测试不同协议的目标,比如同时测试 HTTP 和 HTTPS。ffuf -w wordlist.txt -u http://example.com/FUZZ -u https://example.com/FUZZ,这种方式在检查网站在不同协议下的资源暴露情况很有用。端口指定:
如果目标服务器运行在非标准端口,可以在 URL 中指定。例如ffuf -w wordlist.txt -u http://example.com:8080/FUZZ,这里测试目标服务器的 8080 端口。 请求相关操作
请求体中的文件上传测试(用于有文件上传功能的接口):
假设一个文件上传接口http://example.com/upload,可以使用-X POST -d 'file=@FUZZ' -u http://example.com/upload,这里-d参数中的@符号表示上传文件,FUZZ会被字典中的文件名替换(字典中的文件名应是本地存在的文件路径)。请求头中的身份认证信息(如 Basic 认证):
对于需要基本身份认证的目标,可以在请求头中添加。例如-H 'Authorization: Basic YWRtaW46cGFzc3dvcmQ=' -u http://example.com/FUZZ,这里YWRtaW46cGFzc3dvcmQ=是admin:password经过 Base64 编码后的字符串(实际使用中应替换为正确的认证信息)。 结果处理与分析
按响应头信息筛选:
可以使用-fhdr参数根据响应头中的内容筛选。例如-fhdr 'Content-Type: application/json',只显示响应头中Content - Type为application/json的结果。对结果排序:
可以使用-s参数指定排序方式。例如-s status按状态码对结果进行排序,-s size按响应内容大小排序,方便分析不同状态或大小的结果分布。 其他操作
递归目录爆破(结合其他工具或脚本来实现更好的效果):
首先使用 ffuf 找到第一层目录,然后对于找到的每个目录再进一步爆破其子目录。例如,先找到http://example.com/FUZZ中的目录,然后对于每个找到的目录dir,再执行ffuf -w subdirs.txt -u http://example.com/dir/FUZZ。与代理服务器结合使用:
如果需要通过代理服务器来访问目标,可以使用-x参数指定代理。例如-x http://proxy.example.com:8080,这样所有请求都会通过指定的代理服务器发送。