Web安全 --Wfuzz 使用大全

前言:  做web渗透大多数时候bp来fuzz   偶尔会有觉得要求达不到的时候 wfuzz就很有用了这时候

用了很久了这点来整理一次 

 

 

 

 

 

 

 

 

 

 

wfuzz 是一款Python开发的Web安全模糊测试工具。

下载地址

https://github.com/xmendez/wfuzz

官方手册

https://wfuzz.readthedocs.io/en/latest/

 

简而言之就是wfuzz可以用在做请求参数参数类的模糊测试,也可以用来做Web目录扫描等操作。

 

 

0x01 简单使用

pip install wfuzz

 

 

 

 

 

使用:

wfuzz -w 字典 地址
wfuzz -w qing.txt https://www.cnblogs.com/-qing-/FUZZ

 

 

 

 

 

 

 

使用字典:

wfuzz -z file --zP fn=wordlist https://www.cnblogs.com/-qing-/FUZZ


wfuzz -z file,wordlist https://www.cnblogs.com/-qing-/FUZZ

 

 

 

 

-z file使用模块,这个模块需要一个参数fn   --zP fn=wordlist是定义fn参数的值

第二条命令简写了第一条命令的赋值

-z 或-w 参数可以同时指定多个字典。

 

wfuzz -w 字典1 -w 字典2 -w 字典3 URL/FUZZ/FUZ2Z.FUZ3Z

 

通过返回结果我们要关注的就是ID、Response、 Lines、Word、Chars、Payload

编号、响应状态码、响应报文行数、响应报文字数、响应报文正字符数、Payload

 

 

看看wfuzz一共的参数

 

 

 

 

 

 

 

 

 

 

 

 

0x02 常用参数使用

 --hc,--hl,--hw,--hh参数可以隐藏某些HTTP响应。

 

--hc 

根据响应报文状态码进行隐藏(hide code)

wfuzz -w wordlist --hc 404 https://www.cnblogs.com/-qing-/FUZZ

wfuzz -w wordlist --hc 404,403 https://www.cnblogs.com/-qing-/FUZZ

 

 

--hl

根据响应报文行数进行隐藏(hide lines)

 

--hw

根据响应报文字数进行隐藏(hide word)

 

--hh

根据响应报文字符数进行隐藏

 

 

 

 

wfuzz -w wordlist/general/common.txt --hc 404 http://datalayer.io/FUZZ
********************************************************
* Wfuzz 2.2 - The Web Fuzzer                           *
********************************************************

Target: http://datalayer.io/FUZZ
Total requests: 950

==================================================================
ID      Response   Lines      Word         Chars          Request
==================================================================

00000:  C=200    279 L       635 W         8972 Ch        "W3SVC3"
00001:  C=200    279 L       635 W         8972 Ch        "Log"
00002:  C=200    279 L       635 W         8972 Ch        "10"
00003:  C=200    279 L       635 W         8972 Ch        "02"
00004:  C=200    279 L       635 W         8972 Ch        "2005"
...
00024:  C=200    301 L       776 W         9042 Ch        "about"
...

 

仔细查看以上结果,可以很容易地确定所有“未找到”资源的共同点是279行,635个单词和8972个字符。因此,我们可以使用以下信息来改进“ –hc 404”过滤器(可以组合使用各种过滤器):

$ wfuzz -w wordlist/general/common.txt --hc 404 --hh 8972  http://datalayer.io/FUZZ

00022:  C=200    301 L       776 W         9042 Ch        "about"
00084:  C=302      0 L         0 W            0 Ch        "blog"
00192:  C=302      0 L         0 W            0 Ch        "css"
...
00696:  C=200    456 L      1295 W        15119 Ch        "service"
00751:  C=200    238 L       512 W         6191 Ch        "store"
00788:  C=302      0 L         0 W            0 Ch        "text"
00913:  C=302      0 L         0 W            0 Ch        "template"

 

 

 

 

 

 

关于自定义wfuzz中的Baseline(基准线)

可以根据参考HTTP响应(称为“基准”)构建过滤器。例如,先前的使用–hh开关过滤“未找到”资源的命令可以通过以下命令完成:

$ wfuzz -w wordlist/general/common.txt --hh BBB  http://datalayer.io/FUZZ{notthere}
...
00000:  C=200    279 L       635 W         8972 Ch        "notthere"
00001:  C=200    301 L       776 W         9042 Ch        "about"
00004:  C=200    456 L      1295 W        15119 Ch        "service"
...

这里的{}定义了此第一个HTTP请求的FUZZ字的值,然后可以使用将“ BBB”指定为过滤器值的响应。

而这第一个请求被标记为BBB(BBB不能换成别的)基准线;--hh,这里就是以BBB这条请求中的Chars为基准,其他请求的Chars值与BBB相同则隐藏

 

基准线基本使用就是这个意思 

 

 

 

 

 

 

正则表达式过滤器

 

显示响应:

 

--sc(show code),--sl(show lines),--sw(show word),--sh (show chars)

 

--ss--hs可以使用正则表达式来对返回的结果过滤。

ss是show显示  hs是过滤隐藏

举个例子

wfuzz -H "User-Agent: () { :;}; echo; echo vulnerable" --ss vulnerable -w cgis.txt http://localhost:8000/FUZZ

过滤出有vulnerable字样的返回

 

除了直接字符串肯定可以正则  

 

 

 

 

 

Wfuzz扫描的时候出现网络问题,如DNS解析失败,拒绝连接等时,wfuzz会抛出一个异常并停止执行使用

 -Z参数即可忽略错误继续执行

 

 

 

 参数--conn-delay来设置wfuzz等待服务器响应接连的秒数。 参数--req-delay来设置wfuzz等待响应完成的最大秒数。

 

 

 

 

 

 

 

 

 

 

 

 

 

 0x03 基本使用wfuzz

 

 路径或文件fuzz

$ wfuzz -w wordlist/general/common.txt http://testphp.vulnweb.com/FUZZ


$ wfuzz -w wordlist/general/common.txt http://testphp.vulnweb.com/FUZZ.php

 

 

url参数中的fuzz

wfuzz -z range,0-10 --hl 97 http://testphp.vulnweb.com/listproducts.php?cat=FUZZ

 

 

 

模糊POST请求

如果您想模糊一些表单编码的数据(例如HTML表单),只需传递-d命令行参数即可:

 

wfuzz -z file,wordlist/others/common_pass.txt -d "uname=FUZZ&pass=FUZZ"  --hc 302 http://testphp.vulnweb.com/userinfo.php
********************************************************
* Wfuzz 2.2 - The Web Fuzzer                           *
********************************************************

Target: http://testphp.vulnweb.com/userinfo.php
Total requests: 52

==================================================================
ID      Response   Lines      Word         Chars          Request
==================================================================

00044:  C=200    114 L       356 W         5111 Ch        "test"

Total time: 2.140146
Processed Requests: 52
Filtered Requests: 51
Requests/sec.: 24.29739

 

 

 携带Cookie进行测试

要将自己的cookie发送到服务器,例如,将请求与HTTP会话相关联,可以使用-b参数(对各种cookie重复):

$ wfuzz -z file,wordlist/general/common.txt -b cookie=value1 -b cookie2=value2 http://testphp.vulnweb.com/FUZZ

-b参数指定Cookie,多个Cookie需要指定多次

上面的命令将生成HTTP请求,例如以下请求:

GET /attach HTTP/1.1
Host: testphp.vulnweb.com
Accept: */*
Content-Type:  application/x-www-form-urlencoded
Cookie:  cookie=value1; cookie2=value2
User-Agent:  Wfuzz/2.2
Connection: close

 

 

 

 

提交请求头

wfuzz -z file,wordlist/general/common.txt -H "myheader: headervalue" -H "myheader2: headervalue2" http://testphp.vulnweb.com/FUZZ

 

上面的命令将生成HTTP请求,例如以下请求:

GET /agent HTTP/1.1
Host: testphp.vulnweb.com
Accept: */*
Myheader2:  headervalue2
Myheader:  headervalue
Content-Type:  application/x-www-form-urlencoded
User-Agent:  Wfuzz/2.2
Connection: close

 

 

cookie和头都是可以fuzz的 不多说了

 

 

 

 

fuzz HTTP请求方法

wfuzz -z list,"GET-POST-HEAD-PUT" -X FUZZ http://127.0.0.1/

 

-z list可以自定义一个字典列表(在命令中体现),以-分割;-X参数是指定HTTP请求方法类型

wfuzz -z list,GET-HEAD-POST-TRACE-OPTIONS -X FUZZ http://testphp.vulnweb.com/
********************************************************
* Wfuzz 2.2 - The Web Fuzzer                           *
********************************************************

Target: http://testphp.vulnweb.com/
Total requests: 5

==================================================================
ID      Response   Lines      Word         Chars          Request
==================================================================

00002:  C=200      0 L         0 W            0 Ch        "HEAD"
00004:  C=405      7 L        12 W          172 Ch        "TRACE"
00005:  C=405      7 L        12 W          172 Ch        "OPTIONS"
00001:  C=200    104 L       296 W         4096 Ch        "GET"
00003:  C=200    104 L       296 W         4096 Ch        "POST"

Total time: 1.030354
Processed Requests: 5
Filtered Requests: 0
Requests/sec.: 4.852696

 

如果要使用特定动词执行请求,则也可以使用“ -X HEAD”。

 

 

 

 

 

代理

如果需要使用代理,只需使用-p参数:

做测试的时候想使用代理可以使用如下命令:

wfuzz -w wordlist -p proxtHost:proxyPort:TYPE URL/FUZZ

wfuzz -z file,wordlist/general/common.txt -p localhost:8080 http://testphp.vulnweb.com/FUZZ

 

-p参数指定主机:端口:代理类型,例如我想使用ssr的,可以使用如下命令:

wfuzz -w wordlist -p 127.0.0.1:1087:SOCKS5 URL/FUZZ

除了基本的HTTP代理外,Wfuzz还支持使用SOCKS4和SOCKS5协议的代理:

$ wfuzz -z file,wordlist/general/common.txt -p localhost:2222:SOCKS5 http://testphp.vulnweb.com/FUZZ

通过提供各种-p参数,可以同时使用多个代理: $ wfuzz -z file,wordlist/general/common.txt -p localhost:8080 -p localhost:9090 http://testphp.vulnweb.com/FUZZ

每次将使用不同的代理执行每个请求。

多个代理可使用多个-p参数同时指定,wfuzz每次请求都会选取不同的代理进行。

 

 

 

 

 

认证

Wfuzz可以使用

–basic / ntlm / digest

命令行开关来设置身份验证标头。

例如,可以使用以下命令对使用基本身份验证的受保护资源进行模糊处理:

 

 

HTTP Basic Auth保护的内容可使用如下命令:

wfuzz -z list,nonvalid-httpwatch --basic FUZZ:FUZZ https://www.httpwatch.com/httpgallery/authentication/authenticatedimage/default.aspx
********************************************************
* Wfuzz 2.2 - The Web Fuzzer                           *
********************************************************

Target: https://www.httpwatch.com/httpgallery/authentication/authenticatedimage/default.aspx
Total requests: 2

==================================================================
ID      Response   Lines      Word         Chars          Request
==================================================================

00001:  C=401      0 L        11 W           58 Ch        "nonvalid"
00002:  C=200     20 L        91 W         5294 Ch        "httpwatch"

Total time: 0.820029
Processed Requests: 2
Filtered Requests: 0
Requests/sec.: 2.438938

如果您想模糊受保护网站的资源,也可以使用“ –basic user:pass”。

 

 

 

 

wfuzz可以通过--basec --ntml --digest来设置认证头,方法都一样:

--basec/ntml/digest username:password

 

 

 

 

 

 

 

 

 

 

 

关于递归

 

 

-R开关可用于指定有效负载递归的深度。例如,如果要搜索现有目录,然后使用相同的有效负载在这些目录中再次进行模糊测试,则可以使用以下命令:

$ wfuzz -z list,"admin-CVS-cgi\-bin"  -R1 http://testphp.vulnweb.com/FUZZ
********************************************************
* Wfuzz 2.2 - The Web Fuzzer                           *
********************************************************

Target: http://testphp.vulnweb.com/FUZZ
Total requests: 3

==================================================================
ID      Response   Lines      Word         Chars          Request
==================================================================

00003:  C=403     10 L        29 W          263 Ch        "cgi-bin"
00002:  C=301      7 L        12 W          184 Ch        "CVS"
|_ Enqueued response for recursion (level=1)
00001:  C=301      7 L        12 W          184 Ch        "admin"
|_ Enqueued response for recursion (level=1)
00008:  C=404      7 L        12 W          168 Ch        "admin - CVS"
00007:  C=404      7 L        12 W          168 Ch        "admin - admin"
00005:  C=404      7 L        12 W          168 Ch        "CVS - CVS"
00006:  C=404      7 L        12 W          168 Ch        "CVS - cgi-bin"
00009:  C=404      7 L        12 W          168 Ch        "admin - cgi-bin"
00004:  C=404      7 L        12 W          168 Ch        "CVS - admin"

 

递归深度为1也就是说当发现某一个目录存在的时候,在存在目录下再递归一次字典。

 

 

 

 

 

 

 

 

 

 

性能(设置间隔线程)

 -t   开关增加或减少并发请求的数量,以使攻击进行得更快或更慢。

 -s    参数告诉Wfuzz在执行另一个请求之前停止给定的秒数。

 

 

 

 

 

 

 

 

 

写入文件

Wfuzz支持将结果以其他格式写入文件。

wfuzz通过printers模块来将结果以不同格式保存到文档中,一共有如下几种格

$ wfuzz -e printers

例如,要将结果以JSON格式写入输出文件,请使用以下命令:   -f  参数

$ wfuzz -f /tmp/outfile,json -w wordlist/general/common.txt http://testphp.vulnweb.com/FUZZ

 

 

使用-f参数,指定值的格式为输出文件位置,输出格式

 

 

 

不同的输出

Wfuzz支持以各种格式显示结果。这由称为“打印机”的插件执行。可以列出可用的打印机,执行:

$ wfuzz -e printers

例如,要以JSON格式显示结果,请使用以下命令:

$ wfuzz -o json -w wordlist/general/common.txt http://testphp.vulnweb.com/FUZZ

 

 

 

 

 

 

 

 

 

0x04 高级用法 --wfuzz模块

wfuzz默认自带模块5种类型分别是:payloadsencodersiteratorsprintersscripts

 

 

 

payloads

通过-e参数可以查看指定模块类型中的模块列表:

wfuzz -e payloads

 

 

 

Available payloads:
  Name            | Summary                                                                           
------------------------------------------------------------------------------------------------------
  guitab          | 从可视化的标签栏中读取请求                                
  dirwalk         | 递归获得本地某个文件夹中的文件名                            
  file            | 获取一个文件当中的每个词                                                    
  autorize        | 获取autorize的测试结果Returns fuzz results' from autororize.                                            
  wfuzzp          | 从之前保存的wfuzz会话中获取测试结果的URL                   
  ipnet           | 获得一个指定网络的IP地址列表                                        
  bing            | 获得一个使用bing API搜索的URL列表 (需要 api key).                   
  stdin           | 获得从标准输入中的条目                                                
  list            | 获得一个列表中的每一个元素,列表用以 - 符号分格                       
  hexrand         | 从一个指定的范围中随机获取一个hex值                                  
  range           | 获得指定范围内的每一个数值                                          
  names           | 从一个以 - 分隔的列表中,获取以组合方式生成的所有usernames值
  burplog         | 从BurpSuite的记录中获得测试结果                                             
  permutation     | 获得一个在指定charset和length时的字符组合                             
  buffer_overflow | 获得一个包含指定个数个A的字符串.                    
  hexrange        | 获得指定范围内的每一个hex值                                   
  iprange         | 获得指定IP范围内的IP地址列表                                 
  burpstate       | 从BurpSuite的状态下获得测试结果

 

 

 

关于payloads的更详细的信息可以通过以下命令获取:

wfuzz -z help

 

 

–slice 参数来对输出结果进行过滤:

 

 

 

 

 

 

 

encoder

encoder将payload进行编码或加密。

 

Available encoders:
  Category      | Name                      | Summary                                                                           
------------------------------------------------------------------------------------------------------------------------
  url_safe, url | urlencode                 | 用`%xx`的方式替换特殊字符, 字母/数字/下划线/半角点/减号不替换
  url_safe, url | double urlencode             | 用`%25xx`的方式替换特殊字符, 字母/数字/下划线/半角点/减号不替换
  url              | uri_double_hex            | 用`%25xx`的方式将所有字符进行编码
  html          | html_escape                | 将`&`,`<`,`>`转换为HTML安全的字符
  html            | html_hexadecimal             | 用 `&#xx;` 的方式替换所有字符
  hashes         | base64                    | 将给定的字符串中的所有字符进行base64编码
  url             | doble_nibble_hex             | 将所有字符以`%%dd%dd`格式进行编码
  db             | mssql_char                | 将所有字符转换为MsSQL语法的`char(xx)`形式
  url             | utf8                        | 将所有字符以`\u00xx` 格式进行编码
  hashes         | md5                         | 将给定的字符串进行md5加密
  default         | random_upper                | 将字符串中随机字符变为大写
  url             | first_nibble_hex          | 将所有字符以`%%dd?` 格式进行编码
  default         | hexlify                    | 每个数据的单个比特转换为两个比特表示的hex表示
  url             | second_nibble_hex         | 将所有字符以`%?%dd` 格式进行编码
  url             | uri_hex                     | 将所有字符以`%xx` 格式进行编码
  default         | none                         | 不进行任何编码
  hashes         | sha1                        | 将字符串进行sha1加密
  url             | utf8_binary                | 将字符串中的所有字符以 `\uxx` 形式进行编码
  url             | uri_triple_hex             | 将所有字符以`%25%xx%xx` 格式进行编码
  url             | uri_unicode                | 将所有字符以`%u00xx` 格式进行编码
  html             | html_decimal                | 将所有字符以 `&#dd; ` 格式进行编码
  db             | oracle_char                | 将所有字符转换为Oracle语法的`chr(xx)`形式
  db             | mysql_char                 | 将所有字符转换为MySQL语法的`char(xx)`形式

 

正常使用:

  • wfuzz -z file --zP fn=wordlist,encoder=md5 https://www.cnblogs.com/-qing-/FUZZ

    使用Encodersmd5加密。

  • wfuzz -z file,wordlist,md5 URL/FUZZ

    这里简写了第一条命令,一般都使用这条命令来调用Encoders

使用多个Encoder:

  • 多个转换,使用一个-号分隔的列表来指定

    wfuzz -z file,dict.txt,md5-base64 https://www.cnblogs.com/-qing-/FUZZ

 

--zE md5 同样的

 

wfuzz -z file --zP fn=qing.txt,encoder=md5 https://www.cnblogs.com/-qing-/FUZZ

 

 

 

wfuzz -z file --zP fn=qing.txt,encoder=md5-base64 https://www.cnblogs.com/-qing-/FUZZ

 

 

 

 

 

 多次转换的话使用一个@号分隔的列表来按照从右往左顺序多次转换

wfuzz -z file --zP fn=qing.txt,encoder=md5@base64 https://www.cnblogs.com/-qing-/FUZZ

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

iterator

类似bp中的intruder

提供payload的处理方式

 使用参数

-m 迭代器

wfuzz自带的迭代器有三个:zipchainproduct,如果不指定迭代器,默认为product迭代器。

zip迭代器的功能:字典数一一对应进行组合  

chain迭代器的功能将所有字典全部整合(不做组合)放在一起然后传入占位符FUZZ中。

product迭代器的功能:payload交叉组合 笛卡尔积 和bp里的炸弹一样的

wfuzz -e iterators

Available iterators:

Name    | Summary
----------------------------------------------------------------------------------------------
product | Returns an iterator cartesian product of input iterables.
zip     | Returns an iterator that aggregates elements from each of the iterables.
chain   | Returns an iterator returns elements from the first iterable until it is exhaust
        | ed, then proceeds to the next iterable, until all of the iterables are exhausted

 

 

 

 

 

 

 

 

printer

 

 

 

 

 

 

 

 

scripts

 

 

 

一般分为两类:

  • passive被动:被动脚本分析现有请求和响应,而不执行新请求。
  • active主动:主动脚本向应用程序执行新请求,以对其进行漏洞探测。

其他类别是:

  • discovery发现:发现插件通过自动将发现的内容排入wfuzz请求的池来帮助爬网网站。

 

 

 

 

当使用–script参数以及所选插件时,将指示扫描模式。可以按类别或名称选择插件,也可以使用通配符。

-A开关是–script = default的别名。

脚本的详细信息可以使用–scrip-help获得,例如:

 

 

使用简单脚本 比如robots脚本插件  解析robots.txt中的目录

wfuzz --script=robots -z list,"robots.txt" https://www.cnblogs.com/-qing-/FUZZ

list是告诉wufzz请求哪个文件

 

 

 

 

 

 

 

为了不再重复扫描相同的请求(具有相同的参数),有一个缓存,可以使用–no-cache标志禁用缓存。

 

 

 

使用wfuzz可以自己编写wfuzz插件

/.wfuzz/scripts/目录

以参考已有的插件:https://github.com/xmendez/wfuzz/tree/master/src/wfuzz/plugins/scripts

 

posted @ 2019-10-05 13:24  卿先生  阅读(1770)  评论(0编辑  收藏  举报