• 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

    静有所思,思有所想

    ------------------------------------------------------------------------------------

    联系 Qq/Wechat:779783493
  • 相关阅读:
    【Java】将字符串随机乱序的三函数
    202STM32+ESP8266+Air302基本控制篇(阿里云物联网平台)设备使用一型一密动态注册方式连接云平台,并使用物模型Topic上报温湿度数据(STM32+ESP8266)
    202STM32+ESP8266+Air302基本控制篇(阿里云物联网平台)设备使用一型一密动态注册方式连接云平台,并使用物模型Topic上报温湿度数据(STM32+Air302)
    BeanCopyUtil
    如何判断一个对象占用多少字节?
    java对象头的Mark Word
    Object o = new Object()占多少个字节?对象的内存布局
    python3 mysql模块mysqlconnectorpython使用方法
    Pycurl 的属性和方法
    aiohttp的使用方法
  • 原文地址:https://www.cnblogs.com/-qing-/p/11624494.html
Copyright © 2020-2023  润新知