本帖最后由 zhaorong 于 2021-7-26 15:36 编辑
原理
发送正常的HTTP请求并分析响应;这确定了许多WAF方案解决
如果不成功则发送多个(可能是恶意的)HTTP请求并使用简单的逻辑来
。示例就是WAF则分析先前回复的响应并采用另一种简单的方法来抢救WAF或安
。解决全是否正在积极响应我们的请求
事实上它的核心就是其中的的main.py:
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">#!/usr/bin/env python </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"># -*- coding: utf-8 -*- </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">'''</font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">版权所有 (C) 2019,WAFW00F 开发人员。</font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">有关复制权限,请参阅 LICENSE 文件。</font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">''' </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">import csv </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">import io </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">import json </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">import logging </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">import os </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">import random </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">import re </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">import sys </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">from collections import defaultdict </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">from optparse import OptionParser </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">from wafw00f.lib.asciiarts import * </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">from wafw00f import __version__, __license__ </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">from wafw00f.manager import load_plugins </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">from wafw00f. wafprio</font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">从 wafw00f.lib.evillib 导入 wafdetectionsprio 导入 urlParser、waftoolsengine、def_headers</font></font>
复制代码- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">class WAFW00F(waftoolsengine): </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> xsstring = '<script>alert("XSS");</script>' </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> sqlistring = "UNION SELECT ALL FROM information_schema AND ' or SLEEP(5) or '" </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> lfistring = '../.. /../../etc/passwd' </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> rcestring = '/bin/cat /etc/passwd; </font><font style="vertical-align: inherit;">平 127.0.0.1; </font><font style="vertical-align: inherit;">curl google.com' </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> xxestring = '<!ENTITY xxe SYSTEM "file:///etc/shadow">]><pwn>&hack;</pwn>' </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> def __init__(self, target='www.example.com' , debuglevel=0, path='/', </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> followredirect=True, extraheaders={}, proxies=None): </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> self.log = logging.getLogger('wafw00f') </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> self.attackres = None </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> waftoolsengine.__init__(self, target,</font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> self.knowledge = dict(generic=dict(found=False, reason=''), wafname=list()) </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> def normalRequest(self): </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> return self.Request() </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> def customRequest(self, headers=None): </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> return self .Request(headers=headers) </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> def nonExistent(self): </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> return self.Request(path=self.path + str(random.randrange(100, 999)) + '.html') </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> def xssAttack(self): </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> return self. Request(path=self.path, params= {'s': self.xsstring}) </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> def xxeAttack(self): </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> return self.Request(path=self.path, params= {'s': self.xxestring}) </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> def lfiAttack(self): </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> return self.Request(path=self.path + self.lfistring) </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> def centralAttack(self):</font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> return self.Request(path=self.path, params={'a': self.xsstring, 'b': self.sqlistring, 'c': self.lfistring}) </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> def sqliAttack(self): </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> return self.Request( path=self.path, params= {'s': self.sqlistring}) </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> def oscAttack(self): </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> return self.Request(path=self.path, params= {'s': self.rcestring}) </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> def performCheck( self, request_method): </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> r = request_method()</font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> 如果 r 是 None: </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> raise RequestBlocked() </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> return r</font></font>
复制代码- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"># 用于检测 WAF 的最常见攻击</font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> attcom = [xssAttack, sqliAttack, lfiAttack] Attack </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> = [xssAttack, xxeAttack, lfiAttack, sqliAttack, oscAttack] </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> def genericdetect(self): </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> reason = '' reason </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> = ['Blocking is being done at connection /packet level.', </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> '检测到攻击时服务器标头不同。', </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> '当使用攻击字符串时,服务器返回不同的响应代码。', </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> '它关闭了正常请求的连接。', </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> '当请求不是从浏览器发出时,响应是不同的。</font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> ]</font></font>
复制代码- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">try: </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> # 测试没有用户代理响应。</font><font style="vertical-align: inherit;">检测几乎所有的 WAF。</font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> resp1 = self.performCheck(self.normalRequest) </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> if 'User-Agent' in self.headers: </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> del self.headers['User-Agent'] # 从对象中删除用户代理密钥不是字典。</font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> resp3 = self.customRequest(headers=def_headers) </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> if resp1.status_code != resp3.status_code: </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> self.log.info('当请求不包含用户代理头时,服务器返回了不同的响应。') </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> reason = reason [4] </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> reason += '\r\n' </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> reason += '正常响应代码为“%s”,' % resp1.status_code</font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> reason += ' 而修改请求的响应代码是 "%s"' % resp3.status_code </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> self.knowledge['generic']['reason'] = reason </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> self.knowledge['generic']['found'] = True </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> return True </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> # 发送 xss 攻击时测试状态码</font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> resp2 = self.performCheck(self.xssAttack) </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> if resp1.status_code != resp2.status_code: </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> self.log.info('当 XSS 攻击时服务器返回不同的响应')</font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> 原因 = 原因 [2]</font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> 原因 += '\r\n'</font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> 原因 += '正常响应代码是 "%s",' % resp1.状态代码</font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> reason += ' 而跨站脚本攻击的响应代码是 "%s"' % resp2.status_code </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> self.knowledge['generic']['reason'] = reason </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> self.knowledge['generic']['found '] = True </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> return True </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> # 发送 lfi 攻击时测试状态码</font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> resp2 = self.performCheck(self.lfiAttack) </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> if resp1.status_code != resp2.status_code: </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> self.log.info('Server已尝试目录遍历。') </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> reason = reason[2] </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> reason += '\r\n' </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> reason += '正常响应代码是 "%s",' % resp1.status_code</font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> reason += ' 而文件包含攻击的响应代码是 "%s"' % resp2.status_code </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> self.knowledge['generic']['reason'] = reason </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> self.knowledge['generic']['found' ] = True </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> return True </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> # 发送sqli攻击时测试状态码</font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> resp2 = self.performCheck(self.sqliAttack) </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> if resp1.status_code != resp2.status_code: </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> self.log.info('当SQLi攻击时服务器返回不同的响应')</font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> 原因 = 原因 [2]</font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> 原因 += '\r\n'</font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> 原因 += '正常响应代码是 "%s",' % resp1。状态代码</font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> reason += ' 而 SQL 注入攻击的响应代码是 "%s"' % resp2.status_code </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> self.knowledge['generic']['reason'] = reason </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> self.knowledge['generic']['found' ] = True </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> return True </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> # 发送恶意请求后检查服务器头</font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> response = self.attackres </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> normalserver = resp1.headers.get('Server') </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> attackresponse_server = response.headers.get('Server') </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> if attackresponse_server: </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> if attackresponse_server ! = normalserver: </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> self.log.info('服务器头改变,可能检测到WAF')</font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> self.log.debug('Attack response: %s' % attackresponse_server) </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> self.log.debug('Normal response: %s' % normalserver) </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> reason = </font><font style="vertical-align: inherit;">Reasons </font><font style="vertical-align: inherit;">[1] </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> reason += '\r\n正常响应是 "%s", ' % normalserver </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> reason += ' 而服务器标头对攻击的响应是 "%s",' % attackresponse_server </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> self.knowledge['generic']['reason'] = reason </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> self. Knowledge['generic']['found'] = True</font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> 返回 True</font></font>
复制代码- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"># 如果所有请求都没有通过,</font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> 除了 RequestBlocked 外</font><font style="vertical-align: inherit;">按 F </font><font style="vertical-align: inherit;">:</font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> self.knowledge['generic']['reason'] = </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> Reasons[ </font><font style="vertical-align: inherit;">0] </font><font style="vertical-align: inherit;">self.knowledge['generic']['found'] = True </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> return True </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> return False </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> def matchHeader(self, headermatch,attack=False): </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> if attack: </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> r = self.attackres </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> else: r = rq </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> if r is None: </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> return </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> header, match = headermatch </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> headerval = r.headers.get(header) </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> if headerval : </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> # set-cookie 可以有多</font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> 个头</font><font style="vertical-align: inherit;">,python 给了我们</font><font style="vertical-align: inherit;"># 用逗号连接</font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> if header == 'Set-Cookie': </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> headervals = headerval.split(', ') </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> else: </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> headervals = [headerval] </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> for headervals: </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> if re.search(match, headerval, re.I): </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> return True </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> return False </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> def matchStatus(self, statuscode, attack=True): </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> if attack: </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> r = self.attackres </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> else: r = rq </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> if r is None: </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> return </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> if r.status_code == statuscode: </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> return True </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> return False</font></font>
复制代码- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">def matchCookie(self, match,attack=False): </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> return self.matchHeader(('Set-Cookie', match),attack=attack) </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> def matchReason(self, reasoncode,attack=True): </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> if attack: </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> r = self. attackres </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> else: r = rq </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> if r is None: </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> return </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> # 我们可能需要在响应体中匹配多行上下文</font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> if str(r.reason) == reasoncode: </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> return True </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> return False </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> def matchContent(self, regex, attack=True):</font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> 如果攻击:</font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> r = self.attackres </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> else:r = rq</font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> 如果 r 是 None:</font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> 返回</font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> # 我们可能需要在响应体中匹配多行上下文</font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> if re.search(regex, r.text, re.I): </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> return True </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> return False </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> wafdetections = dict() </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> plugin_dict = load_plugins() </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> result_dict = {} </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> for plugin_dict in plugin_dict。 values(): </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> wafdetections[plugin_module.NAME] = plugin_module.is_waf </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> # 首先检查优先级,然后检查外部添加的那些</font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> checklist = wafdetectionsprio </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> checklist += list(set(wafdetections.keys()) - set(checklist)) </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> def identwaf (self, findall=False) </font><font style="vertical-align: inherit;"> : </font><font style="vertical-align: inherit;"> detection = </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> list() </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">try: </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">self.attackres = self.performCheck(self.centralAttack)</font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> 除了 RequestBlocked: </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> return</font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> 在 self.checklist: </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> self.log.info('Checking for %s' % wafvendor) </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> if self.wafdetections[wafvendor](self): </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> detection.append(wafvendor)</font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> 如果不是 findall: </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> break </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> self .knowledge['wafname'] = detection</font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> 返回检测到</font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">def calclogginglevel(verbosity): </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> default = 40 # 错误被打印出来</font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> level = default - (verbosity * 10) </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> if level < 0: </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> level = 0 </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> return level </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">def buildResultRecord(url, waf ):</font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> 结果 = {}</font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> 结果['url'] = url</font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> if waf: </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> result['detected'] = True </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> if waf == 'generic': </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> result['firewall'] = 'Generic' </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> result['manufacturer'] = 'Unknown' </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> else: </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> result['firewall'] = waf. split('(')[0].strip() </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> result['manufacturer'] = waf.split('(')[1].replace(')', '').strip() </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> else: </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> result['检测到'] = False </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> result['firewall'] = 'None' </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> result['manufacturer'] = 'None'</font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> 返回结果</font></font>
复制代码- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">def getTextResults(res=None): </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> # 留出一些空间以供将来更新列的可能性</font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> # 可以将新列添加到此元组下面的</font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> 键 = ('detected') </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> res = [({key: ba[key] for key in ba if key not in keys}) for ba in res] </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> rows = [] </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> for dk in res: </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> p = [str(x) for _, x in dk.items()] </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> rows.append(p) </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> for m in rows : </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> m[1] = f'{m[1]} ({m[2]})' </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> m.pop() </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> defgen = [ </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> (max([len(str(row)) for row in rows]) + 3 ) </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> for i in range(len(rows[0])) </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> ] </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> rwfmt = "".join(["{:>"+str(dank)+"}" for dank in defgen]) </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> textresults = []</font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> 对于行中的行:</font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> textresults.append(rwfmt.format(*row)) </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> return textresults </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">def disableStdOut(): </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> sys.stdout = None </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">def enableStdOut(): </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> sys.stdout = sys.__stdout__ </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">def getheaders(fn): </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> headers = { }</font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> 如果不是 os.path.exists(fn): </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> logging.getLogger('wafw00f').critical('Headers file "%s" does not exist!' % fn)</font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> 返回</font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> io.open(fn, 'r', encoding='utf-8') as f: </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> for line in f.readlines(): </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> _t = line.split(':', 2) </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> if len(_t) == 2: </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> h, v = map(lambda x: x.strip(), _t)</font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> 标头[h] = v</font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> 返回标头</font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">类 RequestBlocked(Exception):</font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> 通过</font></font>
复制代码- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">def main(): </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> parser = OptionParser(usage='%prog url1 [url2 [url3 ... ]]\r\nexample: %prog http://www.victim.org/') </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> parser.add_option('-v ', '--verbose', action='count', dest='verbose', default=0, </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> help='启用详细程度,多个 -v 选项增加详细程度') </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> parser.add_option('-a', '-- findall', action='store_true', dest='findall', default=False, </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> help='找到所有匹配签名的WAF,不要停止对第一个的测试') </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> parser.add_option('-r', ' --noredirect', action='store_false', dest='followredirect', </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> default=True, help='不要遵循 3xx 响应给出的重定向')</font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> parser.add_option('-t', '--test', dest='test', help='Test for a specific WAF') </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> parser.add_option('-o', '--output', dest='output ', help='</font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">根据文件扩展</font><font style="vertical-align: inherit;"> 名将</font><font style="vertical-align: inherit;">输出写入 csv、json 或文本文件</font><font style="vertical-align: inherit;">。对于标准输出,指定 - 作为文件名。', </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> default=None) </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">parser.add_option('-i', '--input-file' , dest='input', help='从文件中读取目标。输入格式可以</font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">是 csv、json 或文本。对于 csv 和 json,需要一个 `url` 列名或元素。', </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> default=None)</font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> 解析器。 add_option('-l', '--list', dest='list', action='store_true', </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> default=False, help='列出 WAFW00F 能够检测到的所有 WAF')</font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> parser.add_option('-p', '--proxy', dest='proxy', default=None, </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> help='使用HTTP代理执行请求,示例:http://hostname:8080, </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">socks5://主机名:1080, http://user:pass@hostname:8080') </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> parser.add_option('--version', '-V', dest='version', action='store_true', </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> default=False, help= '打印出当前版本的 WafW00f 并退出。') </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> parser.add_option('--headers', '-H', dest='headers', action='store', default=None, </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> help='Pass custom headers通过文本文件覆盖默认头集。')</font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> 选项,args = parser.parse_args()</font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> 日志记录。basicConfig(level=calclogginglevel(options.verbose)) </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> log = logging.getLogger('wafw00f')</font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> if options.output == '-': </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> disableStdOut() </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> print(randomArt()) </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> if options.list: </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> print('[+] Can test for these WAFs:\r\n') </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> attack = WAFW00F(None)</font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> 尝试:</font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> m = [i.replace(')', '').split(' (') for i in wafdetectionsprio] </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> print(R+' WAF Name'+' '*24+'Manufacturer\n '+'-'*8 +' '*24+'-'*12+'\n') </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> max_len = max(len(str(x)) for k in m for x in k) </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> for inner in m: </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> first = True </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> for elem in inner:</font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> 如果第一个:</font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> text = Y+" {:<{}} ".format(elem,max_len+2)</font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> 第一个 = 假</font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> 否则:</font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> text = W+"{:<{}} ".format(elem, max_len+2) </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> print(text, E, end="") </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> print() </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> sys.exit(0)</font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> 除了异常:</font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> 返回</font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> if options.version : </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> print('[+] 您拥有的 WAFW00F 版本是 %sv%s%s' % (B, __version__, E)) </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> print('[+] WAFW00F 是在 %s%s%s 许可下提供的。' % (C, __license__, E)) </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> return </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> extraheaders = {} </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> if options.headers: </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> log.info('Getting extra headers from %s' % options.headers) </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> extraheaders = getheaders(options.headers)</font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> 如果 extraheaders 是 None :</font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> parser.error('请提供一个带有冒号分隔的头文件名和值的头文件') </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> if len(args) == 0 and not options.input: </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> parser.error('No test target specified.') </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> #check if input file存在</font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> if options.input: </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> log.debug("Loading file '%s'" % options.input) </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> try: </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> if options.input.endswith('.json'): </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> with open(options.input) as f: </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> try :</font></font>
复制代码
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">urls = json.loads(f.read())</font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> 除了 json.decoder.JSONDecodeError: </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> log.critical("JSON file %s does not contain well-formed JSON", options.input) </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> sys.exit(1) </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> log.info ("Found: %s urls to check." %(len(urls))) </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> targets = [ item['url'] for item in urls ] </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> elif options.input.endswith('.csv'): </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> columns = defaultdict( list) </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> with open(options.input) as f: </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> reader = csv.DictReader(f) </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> for row in reader: </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> for (k,v) in row.items(): </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> columns[k].append(v)</font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> target = columns['url'] </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> else: </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> with open(options.input) as f: </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> targets = [x for x in f.read().splitlines()]</font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> 除了 FileNotFoundError: </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> log.error('File %s could not被读取。没有加载目标。', options.input) </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> sys.exit(1) </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> else: </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> targets = args </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> results = [] </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> for target in targets: </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> if not target.startswith('http'): </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> log.info('The url %s 应该以 http:// 或 https:// 开头 .. 修复(可能使其无法使用)' % target) </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> target = 'https://' + target </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> print('[*] Checking %s' % target )</font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> pret = urlParser(target)</font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> 如果 pret 是 None: </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> log.critical('The url %s is not </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> wellformed </font><font style="vertical-align: inherit;">' % target) </font><font style="vertical-align: inherit;">sys.exit(1) </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> (hostname, port, path, _, _) = pret </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> log.info ('starting wafw00f on %s' % target) </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> proxies = dict() </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> if options.proxy: </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> proxies = { </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> "http": options.proxy, </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> "https": options.proxy, </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> } </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> attacker = WAFW00F(target, debuglevel=options .verbose, path=path, </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> followredirect=options.followredirect, extraheaders=extraheaders, </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> proxies=proxies)</font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> 全局 rq</font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> rq =attacker.normalRequest()</font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> 如果 rq 为 None:</font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> log.error('Site %s 似乎已关闭' % hostname) </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> continue </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> if options.test: </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> if options.test </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> inattacker.wafdetections </font><font style="vertical-align: inherit;">: </font><font style="vertical-align: inherit;">waf = attack.wafdetections[options .test](attacker) </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> if waf: </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> print('[+] The site %s%s%s is behind %s%s%s WAF.' % (B, target, E, C, options.test, E) ) </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> else: </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> print('[-] WAF %s 未在 %s' % (options.test, target) 上检测到) </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> else: </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> print('[-] WAF %s 在我们的列表中未找到\r\n使用--list 选项以</font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">查看可用的内容'% options.test)</font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> return </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> waf = attack.identwaf(options.findall) </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> log.info('Identified WAF: %s' % waf) </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> if len(waf) > 0: </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> for i in waf: </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> results.append(buildResultRecord(target, i)) </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> print ('[+] 站点 %s%s%s 在 %s%s%s WAF 后面。' % (B, target, E, C, (E+' 和/或 '+C).join(waf), E)) </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> if (options.findall) or len(waf) == 0: </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> print('[+] Generic Detection results:') </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> if </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> attack.genericdetect( </font><font style="vertical-align: inherit;">): </font><font style="vertical-align: inherit;">log.info('Generic Detection: %s' % attack .knowledge['generic']['reason']) </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> print('[*] 站点 %s 似乎支持 WAF 或某种安全解决方案'% 目标)</font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> print('[~] Reason: %s' % </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> attack.knowledge </font><font style="vertical-align: inherit;">['generic']['reason']) </font><font style="vertical-align: inherit;">results.append(buildResultRecord(target, 'generic')) </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> else: </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> print('[-] 未检测到 WAF通过通用检测') </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> results.append(buildResultRecord(target, None)) </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> print('[~] Number of requests: %s' %attacker.requestnumber) </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> #print table of results </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> if len(results) > 0: </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> log. info("Found: %s 匹配。" % (len(results))) </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> if options.output: </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> if options.output == '-': </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> enableStdOut() </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> print(os.linesep.join(getTextResults(results))) </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> elif 选项。output.endswith('.json'):</font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> log.debug("以 json 格式导出数据到文件:%s" % (options.output)) </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> with open(options.output, 'w') as outfile: </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> json.dump(results, outfile, indent=2) </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> elif options.output.endswith('.csv'): </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> log.debug("Exporting data in csv format to file: %s" % (options.output)) </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> with open(options.output, 'w') as outfile: </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> csvwriter = csv.writer(outfile, delimiter=',', quotechar='"', </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> quoting=csv.QUOTE_MINIMAL) </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> count = 0 </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> for result in results: </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> if count == 0: </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> header = result.keys()</font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> csvwriter.writerow(header) </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> count += 1 </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> csvwriter.writerow(result.values()) </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> else: </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> log.debug("以文本格式导出数据到文件:%s" % (options.output)) </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> with open(options. output, 'w') as outfile: </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> outfile.write(os.linesep.join(getTextResults(results))) </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">if __name__ == '__main__': </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> if sys.hexversion < 0x2060000: </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> sys.stderr.write('Your version of python 太旧了...请更新到 2.6 或更高版本\r\n') </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> main()</font></font>
复制代码
安装
github地址:https://github.com/EnableSecurity/wafw00f
官方使用文档:https://github.com/enablesecurity/wafw00f/wiki
安装环境:python3环境 --->使用pip install wafw00f进行安装
安装成功后目录:python安装目录中的Lib\site-packages\wafw00f--->例如:
C:\Python37\Lib\site-packages\wafw00f
验证:cd到C:\Python37\Lib\site-packages\wafw00f目录中输入python main.py如下图说明安装成功
具体使用
这里我们直接使用kali kali中自带自带WAFW00F:
输入wafw00f --help或者wafw00f -h可以看到很多使用参数:
- -h, --help show this help message and exit
- -v, --verbose Enable verbosity, multiple -v options increase
- verbosity
- -a, --findall Find all WAFs which match the signatures, do not stop
- testing on the first one
- -r, --noredirect Do not follow redirections given by 3xx responses
- -t TEST, --test=TEST Test for one specific WAF
- -o OUTPUT, --output=OUTPUT
- Write output to csv, json or text file depending on
- file extension. For stdout, specify - as filename.
- -i INPUT, --input-file=INPUT
- Read targets from a file. Input format can be csv,
- json or text. For csv and json, a `url` column name or
- element is required.
- -l, --list List all WAFs that WAFW00F is able to detect
- -p PROXY, --proxy=PROXY
- Use an HTTP proxy to perform requests, examples:
- http://hostname:8080, socks5://hostname:1080,
- http://user:pass@hostname:8080
- -V, --version Print out the current version of WafW00f and exit.
- -H HEADERS, --headers=HEADERS
- Pass custom headers via a text file to overwrite the
- default header set.
复制代码
wafw00f -l 一次可以识别出的防火墙:
网络探测站点是否存在waf和一些细节
例子1:(wafw00f https://www.baidu.com百度知道有waf)
这里还可以用的服务器应该是BWS/1.1但是它的响应包中返回的服务器是Apache我们自己用burp抓包也能包:
应该是修改了响应头的返回。 例如:进入org/apache/catalina/util编辑配置文件ServerInfo.properties
字段来实现来改变我们tomcat的版本信息
修改为:
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">server.info=Apache Tomcat </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">server.number=0.0.0.0 </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">server.built=2017 年 4 月 2 日 07:25:00 UTC</font></font>
复制代码
将修改后的信息压缩回jar包:
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"># cd /tomcat/lib </font></font>
- <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"># jar uvf catalina.jar org/ap
- ache/catalina/util/ServerInfo.properties</font></font>
复制代码
重启公猫验证前后截图如下所示:
|