注意:本文分享给安全从业人员,网站开发人员和运维人员在日常工作中使用和防范恶意攻击,请勿恶意使用下面描述技术进行非法操作。

[TOC]

0x01 目录扫描

描述:主要针对于网站中一些常规目录和文件存放进行扫描

(1) Dirfuzz

描述:多线程网站目录穷举扫描

1
2
3
4
5
6
python dirfuzz.py http://zhan.***.com/ php
python dirfuzz.py www.wooyun.org asp
python dirfuzz.py www.wooyun.org jsp

#扫描出的结果
[200]:http://zha*.***.com/index.php?g=System&m=Admin&a=index

WeiyiGeek.

WeiyiGeek.


(2) DIRB

描述:DIRB 是一个专门用于爆破目录的工具,在 Kali 中默认已经安装,类似工具还有国外的patator,dirsearch,DirBuster, 国内的御剑等等。

1
dirb http://IP:PORT /usr/share/dirb/wordlists/common.txt   #url 文本地址


(3) DirBuster

描述:DirBuster是一个多线程java应用程序,旨在强制在Web /应用程序服务器上强制目录和文件名。
作者:OWASP.org 许可:Apache 2.0

WeiyiGeek.

WeiyiGeek.


0x02 利用扫描

(1)nikto

描述:使用 nikto 扫描 Web 服务器扫描器,对于数据库注入、INFO DIscosrue、远程文件、命令执行等等
Kail中配置文件路径配置文件:路径:/etc/nikto.conf

nikto注意功能特点:

  • ->mutate(猜测子域名、文件、目录、用户名)
  • ->evasion(规避IDS检测,IPS检测告警)
  • ->Single(单组规则测试模式)

帮助文档:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
$nikto -v  #数据库Plugin版本
$nikto -list-plugins #查看插件;
$nikto -update #升级,更新插件;
$nikto -h url -T <Scan tuning Number> -t 每个测试类型的时间 -O 和 -F 指定文件名和输出格式
# -Tuning+ Scan tuning:
# 1 Interesting File / Seen in logs
# 2 Misconfiguration / Default File
# 3 Information Disclosure
# 4 Injection (XSS/Script/HTML)
# 5 Remote File Retrieval - Inside Web Root
# 6 Denial of Service
# 7 Remote File Retrieval - Server Wide
# 8 Command Execution / Remote Shell
# 9 SQL Injection
# 0 File Upload
# a Authentication Bypass
# b Software Identification
# c Remote Source Inclusion
# d WebService
# e Administrative Console
# x Reverse Tuning Options (i.e., include all except specified)
-vhost #当一个网站存在多个端口时可以使用-vhost遍历所有网站进行扫描或一个ip对应多个网站
-evasion 逃避方式共8种:
# 1、随机url编码,
# 2、自选路径,
# 3、过早结束的URL,
# 4、优先考虑长随机字符串,
# 5、参数欺骗,
# 6、使用TAB作为命令的分隔符,
# 7、使用变化的URL,
# 8、使用Windows路径分隔符

基础使用方法

1
2
3
4
5
6
7
8
9
10
11
#常规用法
nikto -C all -h http://www.baidu.com
nikto -h www.cqwu.net -T 3486 -t 3 -O web -f html
nikto -host http://1.1.1.1 -output #扫描并输出结果
nikto -host 1.1.1.1 -port 80 #扫描目标:ip地址加端口号
nikto -host www.baidu.com -port 443 -ssl #扫描https网站
nikto -host 文件名.txt #批量扫描目标
nikto -host 192.168.0.1 -useproxy http://localhost:8070 #利用代理进行扫描
Nikto -host http://1.1.1.1 -evasion 1234

nmap -p80 192.168.1.0/24 -oG - | nikto -host - #利用nmap扫描开放80端口的IP段并且oG(nmap结果输出并整理)通过管道的方式“|”用nikto进行扫描

WeiyiGeek.

WeiyiGeek.

测试结果发现Particularly this:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
+ OSVDB-3092: /test/: This might be interesting...

#首先,我们需要确定有多少字节从一般请求的页面回来:
$curl 'http://rob-sec-1.com/test/?' 1>/dev/null
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 53 100 53 0 0 53 0 0:00:01 --:--:-- 0:00:01 289

#这是53从这里我们可以配置wfuzz尝试不同的参数名称,然后寻找有超过53个字符以外的尺寸任何响应。
$ wfuzz -w /usr/share/wordlists/dirb/common.txt --hh 53 'http://rob-sec-1.com/test/?FUZZ=<script>alert("xss")</script>'
==================================================================
ID Response Lines Word Chars Payload
==================================================================
02127: C=200 9 L 8 W 84 Ch "item"

#最终利用
http://rob-sec-1.com/test/?item=<script>alert("xss")</script>


(2)GoLismero

描述: web漏洞扫描(多纬度)安全性测试的是一个开源框架,这是目前针对网络安全,但它可以很容易地扩展到其他类型的扫描。

1
2
3
4
5
6
7
8
9
10
11
12
#下载Golismero
git clone https://github.com/golismero/golismero.git

#所有的插件列表 http://golismero-project.com/doc/plugin_list/index.html
#显示可用的插件
python golismero.py plugins
#查询指定插件的相关信息.
python golismero.py info <plugin>
#显示所有可用配置文件的列表:
python golismero profiles
# 显示所有信息和插件:
golismero info brute_*

基础示例:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#可指定输出文件格式, 如果不指定, 扫描结束后就得用命令手工生成结果了.
python golismero.py scan <target> -o <output file name>
python golismero.py scan <target> --audit-name <name>
#扫描一个网站,并显示在屏幕上的结果:
olismero scan http://www.0535code.com



#可以使用 -i 选项, 导入别的工具扫描的结果.
python golismero.py import -i nikto_output.csv -i nmap_output.xml -db database.db
#获取nmap结果,扫描发现所有主机写HTML报告:
golismero scan -i nmap_output.xml -o report.html
#获取结果OpenVAS和它们显示在屏幕上,但不扫描任何东西:
golismero import -i openvas_output.xml


#使用 -nd 可以禁止程序将测试结果存储到数据库中.
python golismero.py <target> -nd

#从以前的扫描中转储数据库:
golismero dump -db example.db -o dump.sql

WeiyiGeek.

WeiyiGeek.

生成报告:下面的例子导入Nmap的扫描的结果, 并调用所有的dns插件进行测试, 同时将结果保存到数据库中, 并生成两种格式的报告.

1
2
3
4
5
6
7
8
9
10
11
python golismero.py scan <target> -o - -o report.html
python golismero.py -i nmap_output.xml -e dns* -db database.db -o report.rst -o report.html

#可以先扫描而不生成报告:
python golismero.py scan <target> -db database.db -no

#扫描完成后再手工生成:
python golismero.py report -db database.db -o report.html

#可以生成多种报告格式:
python golismero.py report -db database.db -o report.html -o report.rst -o report.txt

WeiyiGeek.

WeiyiGeek.


(3)zaproxy(GUI)

描述: 一个易于使用交互式的用于web应用程序漏洞挖掘的渗透测试工具。
OWASP Zed攻击代理(攻击)是一个易于使用的综合渗透测试工具在web应用程序中寻找漏洞,是设计用于与广泛的安全经验的人,因此是理想的开发和功能测试人员是渗透测试作为一个有用的补充有经验的笔测试人员工具箱。

1
zaproxy  #采用java

WeiyiGeek.

WeiyiGeek.


(4)Paros(GUI)

描述:Paros Proxy(安全分析评估,以及方式分析网络地址)-支持SSL

1
2
[email protected]:~$ paros
file:/usr/share/paros/paros.jar

WeiyiGeek.

WeiyiGeek.


(5)Skipfish 扫描

描述:Skipfish 是一款 Web 应用安全侦查工具,Skipfish 会利用递归爬虫和基于字典的探针生成一幅交互式网站地图,最终生成的地图会在通过安全检查后输出。

1
skipfish -m 5 -LY -S /usr/share/skipfish/dictionaries/complete.wl -o ./skipfish2 -u http://IP


(6)WebScarab

描述:拦截代理Fuzezer,session ID ,analysic,spider,web services anlyzer,xss,CRLF,Identity等漏洞扫描器


0x03 CMS-Scan

(1)WPScan

描述:WPScan是一个黑盒WordPress漏洞扫描器,可以用来扫描远程WordPress安装发现安全问题。

1
2
3
4
git clone https://github.com/wpscanteam/wpscan.git && cd wpscan

./wpscan –url http://IP/ –enumerate p
# wpscan --url http://www.blogcn.com/ -e p

WeiyiGeek.

WeiyiGeek.


(2)CMSmap | PentestBox

描述:Python开源CMS扫描,自动检测安全漏洞的过程中最受欢迎的CMS,CMSmap的主要目的是为不同类型的cms集成常见漏洞在一个单一的工具。

1
2
3
4
5
6
7
Examples:
cmsmap.py -t <URL>
cmsmap.py -t https://example.com
cmsmap.py -t https://example.com -f W -F --noedb
cmsmap.py -t https://example.com -i targets.txt -o output.txt
cmsmap.py -t https://example.com -u admin -p passwords.txt
cmsmap.py -k hashes.txt -w passwords.txt

WeiyiGeek.

WeiyiGeek.


(3) joomscan

描述:OWASP Joomla Joomla漏洞扫描器
它可能是最广泛使用的CMS,由于其灵活性,用户友好性,可扩展性命名一些。因此,观察其漏洞,并添加像KB这样的漏洞到Joomla扫描器需要持续的活动。
它将帮助Web开发人员和Web 大师帮助识别他们部署的Joomla可能的安全弱点! 网站。 没有Web安全扫描程序仅专用于一个CMS。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
 Example:  joomscan.pl -u victim.com -x localhost:8080
joomscan -u http://target.com/joomla

Check: joomscan.pl check - Check if the scanner update is available or not.
Update: joomscan.pl update - Check and update the local database if newer version is available.
Download: joomscan.pl download - Download the scanner latest version as a single zip file - joomscan-latest.zip.

#枚举已安装的组件:
perl joomscan.pl --url www.example.com --enumerate-components
perl joomscan.pl -u www.example.com –ec

#设置cookie:
perl joomscan.pl --url www.example.com --cookie "test=demo;"

#设置user-agent:
perl joomscan.pl --url www.example.com --user-agent "Googlebot/2.1(+http://www.googlebot.com/bot.html)"
perl joomscan.pl -u www.example.com -a "Googlebot/2.1(+http://www.googlebot.com/bot.html)"

#设置随机user-agent
perl joomscan.pl -u www.example.com --random-agent
perl joomscan.pl --url www.example.com -r

WeiyiGeek.

WeiyiGeek.


(4)droopescan | pentestBox

描述:识别基于插件的扫描仪,帮助安全研究人员识别问题Drupal SilverStripe Wordpress;

1
2
3
4
5
6
7
Use:
droopescan scan drupal -u URL_HERE
droopescan scan silverstripe -u URL_HERE
droopescan scan --help

#实际案例
droopescan scan wordpress -u http://www.blogcn.com/

WeiyiGeek.

WeiyiGeek.

(5)VBScan

perl编程语言是一个开源项目的检测链入页面CMS漏洞和分析。
项目发起人 : Mohammad Reza Espargham
Github : https://github.com/rezasp/vbscan/

1
2
3
perl vbscan.pl <target>
perl vbscan.pl http://target.com/vbulletin
perl vbscan.pl --help


(6)BlindElephant.py

描述:Web应用指纹对比浏览程序,扫描固定位置的静态文件,进行对hash值,比对识别技术鉴定速度快,带宽消耗低,无危害,通用性高且高度自动化.

1
2
BlindElephant.py -l   #可用插件
BlindElephant.py http://www.cqkksy.com.cn drupal

WeiyiGeek.

WeiyiGeek.


0x04 Fuzz-ByPass

(1)wfuzz

描述:wfuzz 是一款Python开发的Web安全模糊测试工具。简而言之就是wfuzz可以用在做请求参数参数类的模糊测试,也可以用来做Web目录扫描等操作。
github项目: https://github.com/xmendez/wfuzz , 安装Wfuzz pip install wfuzz
字典文本: /usr/share/wfuzz/wordlist

  • 简单粗暴的功能特点记录:
    • 模块化 框架 可编写插件
    • 接口 可处理BurpSuite所抓的请求和响应报文


基础入门
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
Usage: wfuzz [options] -z payload,params <url>
FUZZ, ..., FUZnZ #payload占位符,wfuzz会用指定的payload代替相应的占位符,n代表数字.
FUZZ{baseline_value} # FUZZ 会被 baseline_value替换,并将此作为测试过程中第一个请求来测试,可用来作为过滤的一个基础。

#参数解释
-h/--help : 帮助文档
--help : 高级帮助文档
--version : Wfuzz详细版本信息
-e <type> : 显示可用的encoders/payloads/iterators/printers/scripts列表(查看指定模块类型中的模块列表)
--recipe <filename> : 从文件中读取参数
--dump-recipe <filename> : 打印当前的参数并保存成文档
--oF <filename> : 将测试结果保存到文件,这些结果可被wfuzz payload 处理
-c : 彩色化输出
-v : 详细输出
-f filename,printer : 将结果以printer的方式保存到filename (默认为raw printer).
-o printer : 输出特定printer的输出结果
--interact : (测试功能) 如果启用,所有的按键将会被捕获,这使得你能够与程序交互
--dry-run : 打印测试结果,而并不发送HTTP请求
--prev : 打印之前的HTTP请求(仅当使用payloads来生成测试结果时使用)
-p addr : 使用代理,格式 ip:port:type. 可设置多个代理,type可取的值为SOCKS4,SOCKS5 or HTTP(默认)
-t N : 指定连接的并发数,默认为10
-s N : 指定请求的间隔时间,默认为0
-R depth : 递归路径探测,depth指定最大递归数量
-L,--follow : 跟随HTTP重定向
-Z : 扫描模式 (连接错误将被忽视).
--req-delay N : 设置发送请求允许的最大时间,默认为 90,单位为秒.
--conn-delay N : 设置连接等待的最大时间,默认为 90,单位为秒.
-A : 是 --script=default -v -c 的简写
--script= : 与 --script=default 等价
--script=<plugins> : 进行脚本扫描, <plugins> 是一个以逗号分开的插件或插件分类列表
--script-help=<plugins> : 显示脚本的帮助
--script-args n1=v1,... : 给脚本传递参数. ie. --script-args grep.regex="<A href=\"(.*?)\">"
-u url : 指定请求的URL
-m iterator : 指定一个处理payloads的迭代器 (默认为product)
-z payload : 为每一个占位符指定一个payload,格式为 name[,parameter][,encoder].编码可以是一个列表,如 md5-sha1还可以串联起来, 如[email protected]还可使用编码各类名如 url;
使用help作为payload来显示payload的详细帮助信息,还可使用--slice进行过滤(替代了下面的--zP参数)
--zP <params> : 给指定的payload设置参数。必须跟在 -z 或-w 参数后面
--slice <filter> : 以指定的表达式过滤payload的信息,必须跟在-z 参数后面
-w wordlist : 指定一个wordlist文件,等同于 -z file,wordlist
-V alltype : 暴力测试所有GET/POST参数,无需指定占位符
-X method : 指定一个发送请求的HTTP方法,如HEAD或FUZZ
-b cookie : 指定请求的cookie参数,可指定多个cookie
-d postdata : 设置用于测试的POST data (ex: "id=FUZZ&catalogue=1")
-H header : 设置用于测试请求的HEADER (ex:"Cookie:id=1312321&user=FUZZ"). 可指定多个HEADER.
--basic/ntlm/digest auth : 格式为 "user:pass" or "FUZZ:FUZZ" or "domain\FUZ2Z:FUZZ"
--hc/hl/hw/hh N[,N]+ : 以指定的返回码/行数/字数/字符数作为判断条件隐藏返回结果 (用 BBB 来接收 baseline)
--sc/sl/sw/sh N[,N]+ : 以指定的返回码/行数/字数/字符数作为判断条件显示返回结果 (用 BBB 来接收 baseline)
--ss/hs regex : 显示或隐藏返回结果中符合指定正则表达式的返回结果
--filter <filter> : 显示或隐藏符合指定filter表达式的返回结果 (用 BBB 来接收 baseline)
--prefilter <filter> : 用指定的filter表达式在测试之前过滤某些测试条目
--slice 参数来过滤帮助返回信息的结果。


核心知识:

  • wfuzz使用payload来替换相应的FUZZ关键词的位置(占位符),可以使用多个字典使用-z 或-w 参数,相应的占位符应设置为 FUZZ,FUZ2Z,FUZ3Z,….,FUZnZ, 其中n代表了占位序号。
  • wfuzz可进行Playload的编码或加密


Wfuzz模块说明
wfuzz是模块化的框架,wfuzz默认自带很多模块,模块分为5种类型分别是:payloads、encoders、iterators、printers和scripts

1
2
3
4
5
6
7
8
9
10
wfuzz [options] -z payload,params <url>

#比如查看payload类中的模块列表
wfuzz -e payloads
# Available payloads:
# Name | Summary
# guitab | This payload reads requests from a tab in the GUI
# dirwalk | Returns filename's recursively from a local directory.
#模块中的说明过滤显示
wfuzz -z help --slice "names"

1.payload为wfuzz生成的用于测试的特定字符串,一般情况下,会替代被测试URL中的FUZZ占位符。

  • 当前版本中的wfuzz中可用payloads列表如下:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    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的状态下获得测试结果

2.的作用是将payload进行编码或加密。

  • wfuzz的encoder列表如下:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    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)`形式

3.wfuzz的iterator提供了针对多个payload的处理方式。

  • itorators的列表如下:
    1
    2
    3
    4
    Available iterators:
    product | 返回输入迭代器的笛卡尔积。
    zip | 返回一个迭代器,该迭代器聚合来自每个迭代器的元素。
    chain | 返回一个迭代器从第一个迭代器返回元素,直到它被耗尽,然后继续到下一个迭代器,直到所有的迭代器都被耗尽

4.wfuzz的printers用于控制输出打印。

  • printers列表如下:
    1
    2
    3
    4
    5
    6
    Available printers:
    raw | `Raw` output format
    json | Results in `json` format
    csv | `CSV` printer ftw
    magictree | Prints results in `magictree` format
    html | Prints results in `html` format

5.wfuzz中的scripts用监测一些常见的存在漏洞的路径

  • scripts列表如下:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    Available scripts:
    Category | Name | Summary
    --------------------------------------------------------------------
    default, passive | cookies | 查找新的cookies
    default, passive | errors | 查找错误信息
    passive | grep | HTTP response grep
    active | screenshot | 用linux cutycapt tool 进行屏幕抓取
    default, active, discovery | links | 解析HTML并查找新的内容
    default, active, discovery | wc_extractor | 解析subversion的wc.db文件
    default, passive | listing | 查找列目录漏洞
    default, passive | title | 解析HTML页面的title
    default, active, discovery | robots | 解析robots.txt文件来查找新内容
    default, passive | headers | 查找服务器的返回头
    default, active, discovery | cvs_extractor | 解析 CVS/Entries 文件
    default, active, discovery | svn_extractor | 解析 .svn/entries 文件
    active, discovery | backups | 查找已知的备份文件名
    default, active, discovery | sitemap | 解析 sitemap.xml 文件


过滤器
描述:wfuzz具有过滤器功能,在做测试的过程中会因为环境的问题需要进行过滤,例如在做目录扫描的时候,你事先探测并知道了这个网站访问不存在目录的时候使用的是自定义404页面(也就是状态码为200),而你可以选择提取该自定义页面的特征来过滤这些返回结果。

wfuzz过滤分为两种方法:隐藏符合过滤条件的结果显示符合过滤条件的结果

  • 隐藏响应结果:可以隐藏某些HTTP响应。
    • –hc 根据响应报文状态码进行隐藏(hide code)
    • –hl根据响应报文行数进行隐藏(hide lines)
    • –hw根据响应报文字数进行隐藏(hide word)
    • –hh根据响应报文字符数进行隐藏(hide chars 这里因为code和chars首字母都是c,–hc参数已经有了,所以hide chars的参数就变成了–hh)
  • 显示响应结果:显示响应结果的使用方法跟隐藏时的原理一样,只不过参数变为了
    • –sc(show code)
    • –sl(show lines)
    • –sw(show word)
    • –sh (show chars)
  • 使用Baseline(基准线):过滤器可以是某个HTTP响应的引用,这样的引用我们称为Baseline(其实就是标准线 or 及格线)。
  • 使用正则表达式过滤:-ss和–hs可以使用正则表达式来对返回的结果过滤。
    • –ss 显示指定表达式请求结果
    • –hs 隐藏指定表达式请求结果


内置工具

  • wfencode 工具: 自带的一个加密/解密(编码/反编码)工具,目前支持内建的encoders的加/解密。
  • wfpayload工具: payload生成工具。
  • wxfuzz 工具: 看源码是一个wxPython化的wfuzz,也就是GUI图形界面的wfuzz。
    • 目前需要wxPython最新版本才能使用,但是在ParrotOS和Kali上都无法正常安装成功;


实际案例:
示例1实际的使用一遍

1
2
3
4
5
6
7
8
9
10
#地址其中FUZZ单词,这个单词可以理解是一个占位符,
wfuzz -w 字典 https://weiyigeek.cn/FUZZ
wfuzz -w test_dict.txt https:/weiyigeek..cn/FUZZ

#返回结果如下:
==================================================================
ID Response Lines Word Chars Payload
编号、响应状态码、响应报文行数、响应报文字数、响应报文正字符数、测试使用的Payload。
==================================================================
000004: C=404 1 L 121 W 1636 Ch "test123"

示例2第二种方式

1
2
3
4
5
6
7
8
#第一条命令中的wordlist表示为字典位置
wfuzz -z file --zP fn=wordlist URL/FUZZ

#第二条命令简写了第一条命令的赋值
wfuzz -z file,wordlist URL/FUZZ

#第三条命令使用-w,这个参数就是-z file --zP fn的别名。
wfuzz -w wordlist URL/FUZZ

示例3例如想要同时爆破目录、文件名、后缀

1
wfuzz -w 目录字典路径 -w 文件名字典路径 -w 后缀名字典路径 URL/FUZZ/FUZ2Z.FUZ3Z

示例4.隐藏设置响应码的结果

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#隐藏404:
wfuzz -w wordlist --hc 404 URL/FUZZ

#隐藏404、403:
wfuzz -w wordlist --hc 404,403 URL/FUZZ

e.g.使用百度举个例子运行wfuzz -w test_dict.txt https://www.baidu.com/FUZZ #这里所有的测试请求,都是不存在的页面
404页面规则就是如上图结果所示:响应报文状态码(302)、响应报文行数(7)、响应报文字数(18)、响应报文字符数(222)
wfuzz -w wordlist --hl 7 https://www.baidu.com/FUZZ
wfuzz -w wordlist --hw 18 https://www.baidu.com/FUZZ
wfuzz -w wordlist --hh 222 https://www.baidu.com/FUZZ

#如果根据单个条件判断相对来说肯定是不精确的,所以整合一下就是这样的命令:
wfuzz -w wordlist --hc 302 --hl 7 --hw 18 --hh 222 https://www.baidu.com/FUZZ

WeiyiGeek.

WeiyiGeek.

示例5.基准线(Baseline)的使用

1
wfuzz -w wordlist --hh BBB https://www.baidu.com/FUZZ{404there}

WeiyiGeek.

WeiyiGeek.

代表wfuzz第一个请求是请求https://www.baidu.com/404there这个网址,`在{ }内的值用来指定wfuzz第一个请求中的FUZZ占位符,而这第一个请求被标记为BBB(BBB不能换成别的)基准线`;其次这里使用的参数是–hh,也就是以BBB这条请求中的Chars为基准,其他请求的Chars值与BBB相同则隐藏。

示例6.使用正则表达式过滤的使用

1
2
3
4
5
6
#e.g. 在这里一个网站自定义返回页面的内容中包含Not Found,想根据这个内容进行过滤可以使用如下的命令:
wfuzz -w wordlist --hs "Not Found" http://127.0.0.1/FUZZ

#总结
wfuzz -w wordlist --hs 正则表达式 URL/FUZZ #隐藏
wfuzz -w wordlist --ss 正则表达式 URL/FUZZ #显示

示例7.内置工具的使用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#(1) 目前支持内建的encoders的加/解密
wfencode -e base64 123456
#[RES] MTIzNDU2
wfencode -d base64 MTIzNDU2
#[RES] 123456

#(2) wfpayload是payload生成工具
wfpayload -z range,0-10
[RES]
0
1

#(3) wxfuzz 工具
wxPython化的wfuzz也就是GUI图形界面的wfuz


自带字典

描述:wfuzz本身自带字典爆破文件、目录;

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
├── Injections  #注入
│ ├── All_attack.txt
│ ├── SQL.txt
│ ├── Traversal.txt
│ ├── XML.txt
│ ├── XSS.txt
│ └── bad_chars.txt
├── general #通用
│ ├── admin-panels.txt
│ ├── big.txt
│ ├── catala.txt
│ ├── common.txt
│ ├── euskera.txt
│ ├── extensions_common.txt
│ ├── http_methods.txt
│ ├── medium.txt
│ ├── megabeast.txt
│ ├── mutations_common.txt
│ ├── spanish.txt
│ └── test.txt
├── others #其他
│ ├── common_pass.txt
│ └── names.txt
├── stress #压力
│ ├── alphanum_case.txt
│ ├── alphanum_case_extra.txt
│ ├── char.txt
│ ├── doble_uri_hex.txt
│ ├── test_ext.txt
│ └── uri_hex.txt
├── vulns #漏洞测试
│ ├── apache.txt
│ ├── cgis.txt
│ ├── coldfusion.txt
│ ├── dirTraversal-nix.txt
│ ├── dirTraversal-win.txt
│ ├── dirTraversal.txt
│ ├── domino.txt
│ ├── fatwire.txt
│ ├── fatwire_pagenames.txt
│ ├── frontpage.txt
│ ├── iis.txt
│ ├── iplanet.txt
│ ├── jrun.txt
│ ├── netware.txt
│ ├── oracle9i.txt
│ ├── sharepoint.txt
│ ├── sql_inj.txt
│ ├── sunas.txt
│ ├── tests.txt
│ ├── tomcat.txt
│ ├── vignette.txt
│ ├── weblogic.txt
│ └── websphere.txt
└── webservices
├── ws-dirs.txt
└── ws-files.txt

实际案例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
#爆破文件:
wfuzz -w wordlist URL/FUZZ.php

#爆破目录:
wfuzz -w wordlist URL/FUZZ

#遍历枚举参数值使用payloads模块类中的range模块进行生成
wfuzz -z range,000-999 http://127.0.0.1/getuser.php?uid=FUZZ #uid参数可以遍历,已知123为三位数纯数字,需要从000-999进行遍历

#POST请求测试,-d参数传输POST请求正文。
wfuzz -w userList -w pwdList -d "username=FUZZ&password=FUZ2Z" http://127.0.0.1/login.php

#Cookie测试越权,b参数指定Cookie多个Cookie需要指定多次,也可以对Cookie进行测试,仍然使用FUZZ占位符即可。
wfuzz -z range,000-999 -b session=session -b cookie=cookie http://127.0.0.1/getuser.php?uid=FUZZ

#HTTP Headers测试伪造XFF头(IP),-H指定HTTP头,多个需要指定多次(同Cookie的-b参数)
wfuzz -z range,0000-9999 -H "X-Forwarded-For: FUZZ" http://127.0.0.1/get.php?userid=666

#测试HTTP请求方法(Method),-X参数是指定HTTP请求方法类型,因为这里要测试HTTP请求方法,后面的值为FUZZ占位符。
wfuzz -z list,"GET-POST-HEAD-PUT" -X FUZZ http://127.0.0.1/

#代理设置与关键字隐藏,多个代理可使用多个-p参数同时指定,wfuzz每次请求都会选取不同的代理进行
wfuzz -w wordlist -p proxtHost:proxyPort:TYPE URL/FUZZ #-p参数指定主机:端口:代理类型
wfuzz -z file,starter.txt -p 192.168.31.26:1080:SOCKS5 --hs "Cannot" https://foo.domain.com/FUZZ

#认证:测试一个需要HTTP Basic Auth保护的内容可使用如下命令:
#wfuzz可以通过--basec --ntml --digest来设置认证头,使用方法都一样:
# --basec/ntml/digest username:password
wfuzz -z list,"username-password" --basic FUZZ:FUZZ URL


#递归测试指定一个payload被递归的深度(数字)。
#例如:爆破目录时,我们想使用相同的payload对已发现的目录进行测试
wfuzz -z list,"admin-login.php-test-dorabox" -R 1 http://127.0.0.1/FUZZ


#并发和间隔,wfuzz提供了一些参数可以用来调节HTTP请求的线程
#使用-t参数设置并发请求,该参数默认设置都是10。
#使用-s参数可以调节每次发送HTTP的时间间隔。
wfuzz -z range,0-20 -t 20 -d "money=1" http://127.0.0.1/dorabox/race_condition/pay.php?FUZZ


#保存测试结果,可以通过printers模块来将结果以不同格式保存到文档中
#使用-f参数,指定值的格式为输出文件位置,输出格式。
$ wfuzz -f outfile,json -w wordlist URL/FUZZ


高阶功法

Iterators-迭代器
BurpSuite的Intruder模块中Attack Type有Sniper(狙击手)、Battering ram(撞击物)、Pitchfork(相交叉)、Cluster bomb(集束炸弹)~wfuzz的Iterators模块也可以完成这样的功能,将不同的字典的组合起来

使用参数-m 迭代器,wfuzz自带的迭代器有三个:zip、chain、product,如果不指定迭代器,默认为product迭代器。

  • zip:字典数相同、一一对应进行组合,如果字典数不一致则多余的抛弃掉不请求
  • chain:将所有字典全部整合(不做组合)放在一起然后传入占位符FUZZ中。
  • product:求的payload交叉组合即提供的两个字典相互配合遍历;
    WeiyiGeek.

    WeiyiGeek.


1.zip命令:

  • 示例:设置了两个字典两个占位符,一个是range模块生成的0、1、2、3、4、5、6、7、8、9 10个数字,一个是外部字典dict.txt的9行字典,使用zip迭代器组合这两个字典发送。
    1
    wfuzz -z range,0-9 -w dict.txt -m zip http://127.0.0.1/ip.php?FUZZ=FUZ2Z
    如上命令结果就是数字9被抛弃了因为没有字典和它组合。
    WeiyiGeek.

    WeiyiGeek.


2.chain命令:

  • 设置了两个字典,一个占位符FUZZ,使用chain迭代器组合这两个字典发送。
    1
    wfuzz -z range,0-9 -w dict.txt -m chain http://127.0.0.1/ip.php?FUZZ
    WeiyiGeek.

    WeiyiGeek.


3.product命令:

  • 设置了两个字典两个占位符,一个是range模块生成的0、1、2 3个数字,一个是外部字典dict.txt的3行字典,使用product迭代器组合这两个字典发送。
    1
    wfuzz -z range,0-2 -w dict.txt -m product http://127.0.0.1/ip.php?FUZZ=FUZ2Z

Encoders-编码加解密
wfuzz中encoders模块可以实现编码解码、加密,它支持所列转换功能请参考上面的;

正常使用:

1
2
3
4
5
#使用Encoders的md5加密。
wfuzz -z file --zP fn=wordlist,encoder=md5 URL/FUZZ

#简写了第一条命令
wfuzz -z file,wordlist,md5 URL/FUZZ

使用多个Encoder:

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

    1
    2
    wfuzz -z file,dict.txt,md5-base64 http://127.0.0.1/ip.php\?FUZZ
    wfuzz -z list,1-2-3,md5-sha1-none http://webscantest.com/FUZZ
  • 多次转换使用一个@号分隔的列表来按照从右往左顺序多次转换

    1
    2
    #这里让传入的字典先md5加密然后base64编码
    wfuzz -z file,dict.txt,[email protected] http://127.0.0.1/ip.php\?FUZZ
WeiyiGeek.

WeiyiGeek.


Scripts-脚本插件
描述:wfuzz支持插件,其本身也有很多插件,插件大部分都是实现扫描和解析功能,插件共有两大类和一类附加插件:

  • passive:分析已有的请求和响应(被动)
  • active:会向目标发送请求来探测(主动)
  • discovery:自动帮助wfuzz对目标站进行爬取,将发现的内容提供给wfuzz进行请求

基础使用

1
2
3
4
#查看script中robots脚本的帮助信息
wfuzz --script-help=robots #该模块解析robots.txt的并且寻找新的内容

wfuzz --script=robots -z list,"robots.txt" http://127.0.0.1/FUZZ

WeiyiGeek.

WeiyiGeek.


script是使用脚本模块的参数,这时候就有个疑惑命令为什么要加上list呢?
因为在这里robots脚本只是解析robots.txt规则的,所以你需要告诉wfuzz去请求哪个文件而这里我写的就是robots.txt就可以解析;

自定义插件:需要放在~/.wfuzz/scripts/目录下,具体如何编写可以参考已有的插件:


技巧-脚本插件

  • recipes用来保存命令,方便下次执行或者分享给别人。
    1
    2
    3
    4
    5
    #生成一个recipes:
    wfuzz --script=robots -z list,"robots.txt" --dumo-recipe outrecipe URL/FUZZ

    #使用某个recipes:
    wfuzz --recip outrecipe
  • 网络异常:如DNS解析失败,拒绝连接等时,wfuzz会抛出一个异常并停止执行使用-Z参数即可忽略这些错误继续执行。
  • 超时:fuzz可以设置超时时间。
    • 参数–conn-delay来设置等待服务器响应接连的秒数。
    • 参数–req-delay来设置等待响应完成的最大秒数。
  • 结合BurpSuites使用:从Burp的LOG文件中获取测试的URL地址
    1
    2
    3
    4
    5
    #解析burplog里面请求的url
    wfuzz -z burplog,"1.burp" FUZZ

    #还有能够读取burpsuite保存的state:
    wfuzz -z burpstate,a_burp_state.burp FUZZ
    WeiyiGeek.

    WeiyiGeek.

参考来源补充:


(2)W3AF

描述:w3af是一款丰富的Webapplication程序attack和审计框架-还支持Xpath注入、OS命令、错误的应用等。

1
2
3
4
5
6
7
8
w3af_console  #命令行模式交互式
w3af_gui #可以用GUI版本的

w3af_console>>>help #首先使用OUTPUT插件,然后启用特定的Audit测试选项,设置Target然后对其scan.

#插件帮助
w3af>>> plugins
w3af/plugins>>> help

WeiyiGeek.

WeiyiGeek.


(3)WAFWOOF

描述:wafwoof检测Web应用防火墙(WAF),规避Waf规则,涉及一些Http污染、空字节替换和规范化处理.HEX字符或者Unicode字符的URL编码.
用法:wafw00f http://xiaomi.com

WeiyiGeek.

WeiyiGeek.