wafw00f-2.3.1/0000775000175000017500000000000014734711633012706 5ustar epsilonepsilonwafw00f-2.3.1/MANIFEST.in0000664000175000017500000000020214734711633014436 0ustar epsilonepsiloninclude CREDITS.txt include LICENSE include MANIFEST.in include README.md include wafw00f/__init__.py include wafw00f/bin/wafw00f wafw00f-2.3.1/setup.py0000664000175000017500000000334214734711633014422 0ustar epsilonepsilon#!/usr/bin/env python3 ''' Copyright (C) 2024, WAFW00F Developers. See the LICENSE file for copying permission. ''' import io from setuptools import setup, find_packages from os import path this_directory = path.abspath(path.dirname(__file__)) with io.open(path.join(this_directory, 'README.md'), encoding='utf-8') as f: desc = f.read() setup( name='wafw00f', version=__import__('wafw00f').__version__, long_description=desc, long_description_content_type='text/markdown', author='Sandro Gauci', author_email='sandro@enablesecurity.com', license='BSD License', url='https://github.com/enablesecurity/wafw00f', project_urls={ "Bug Tracker": "https://github.com/EnableSecurity/wafw00f/issues", "Documentation": "https://github.com/EnableSecurity/wafw00f/wiki", "Source Code": "https://github.com/EnableSecurity/wafw00f/tree/master" }, packages=find_packages(), install_requires=[ 'requests', 'requests[socks]', 'pluginbase' ], classifiers=[ 'Development Status :: 5 - Production/Stable', 'Intended Audience :: System Administrators', 'Intended Audience :: Information Technology', 'Topic :: Internet', 'Topic :: Security', 'Topic :: System :: Networking :: Firewalls', 'License :: OSI Approved :: BSD License', 'Programming Language :: Python :: 3', 'Operating System :: OS Independent' ], keywords='waf firewall detector fingerprint', extras_require={ 'dev': [ 'prospector' ], 'docs': [ 'Sphinx' ] }, entry_points={ 'console_scripts': [ 'wafw00f = wafw00f.main:main' ] } ) wafw00f-2.3.1/Dockerfile0000664000175000017500000000015514734711633014701 0ustar epsilonepsilonFROM python:3.11.9-alpine WORKDIR /usr/src/app COPY . . RUN python setup.py install ENTRYPOINT [ "wafw00f" ] wafw00f-2.3.1/LICENSE0000664000175000017500000000273314734711633013720 0ustar epsilonepsilonCopyright (c) 2009-2024, WAFW00F Developers All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of the {organization} nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. wafw00f-2.3.1/CREDITS.txt0000664000175000017500000000226414734711633014550 0ustar epsilonepsilon=================== THE WAFW00F PROJECT =================== $ AUTHORS ======= * Current Maintainers :- - Sandro Gauci - Pinaki Mondal <0xinfection [at] gmail [dot] com> * Original Code by :- - Sandro Gauci - Wendel G. Henrique $ CONTRIBUTORS ============ A number of people contributed in the past (in no particular order): - Sebastien Gioria - W3AF (or Andres Riancho) - Charlie Campbell - @j0eMcCray - Mathieu Dessus - David S. Langlands - Nmap's http-waf-fingerprint.nse / Hani Benhabiles - Denis Kolegov - kun a - Louis-Philippe Huberdeau - Brendan Coles - Matt Foster - g0tmi1k (?) - MyKings If you did contribute and somehow I didn't put your name in there, please do let me know at: . wafw00f-2.3.1/CODE_OF_CONDUCT.md0000664000175000017500000000643314734711633015513 0ustar epsilonepsilon# Contributor Covenant Code of Conduct ## Our Pledge In the interest of fostering an open and welcoming environment, we as contributors and maintainers pledge to making participation in our project and our community a harassment-free experience for everyone, regardless of age, body size, disability, ethnicity, sex characteristics, gender identity and expression, level of experience, education, socio-economic status, nationality, personal appearance, race, religion, or sexual identity and orientation. ## Our Standards Examples of behavior that contributes to creating a positive environment include: * Using welcoming and inclusive language * Being respectful of differing viewpoints and experiences * Gracefully accepting constructive criticism * Focusing on what is best for the community * Showing empathy towards other community members Examples of unacceptable behavior by participants include: * The use of sexualized language or imagery and unwelcome sexual attention or advances * Trolling, insulting/derogatory comments, and personal or political attacks * Public or private harassment * Publishing others' private information, such as a physical or electronic address, without explicit permission * Other conduct which could reasonably be considered inappropriate in a professional setting ## Our Responsibilities Project maintainers are responsible for clarifying the standards of acceptable behavior and are expected to take appropriate and fair corrective action in response to any instances of unacceptable behavior. Project maintainers have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, or to ban temporarily or permanently any contributor for other behaviors that they deem inappropriate, threatening, offensive, or harmful. ## Scope This Code of Conduct applies both within project spaces and in public spaces when an individual is representing the project or its community. Examples of representing a project or community include using an official project e-mail address, posting via an official social media account, or acting as an appointed representative at an online or offline event. Representation of a project may be further defined and clarified by project maintainers. ## Enforcement Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by contacting the project team at code@enablesecurity.com. All complaints will be reviewed and investigated and will result in a response that is deemed necessary and appropriate to the circumstances. The project team is obligated to maintain confidentiality with regard to the reporter of an incident. Further details of specific enforcement policies may be posted separately. Project maintainers who do not follow or enforce the Code of Conduct in good faith may face temporary or permanent repercussions as determined by other members of the project's leadership. ## Attribution This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, available at https://www.contributor-covenant.org/version/1/4/code-of-conduct.html [homepage]: https://www.contributor-covenant.org For answers to common questions about this code of conduct, see https://www.contributor-covenant.org/faq wafw00f-2.3.1/wafw00f/0000775000175000017500000000000014734711633014160 5ustar epsilonepsilonwafw00f-2.3.1/wafw00f/main.py0000664000175000017500000005724014734711633015466 0ustar epsilonepsilon#!/usr/bin/env python3 # -*- coding: utf-8 -*- ''' Copyright (C) 2024, WAFW00F Developers. See the LICENSE file for copying permission. ''' import csv import io import json import logging import os import random import re import sys import string import urllib.parse from collections import defaultdict from optparse import OptionParser from wafw00f import __license__, __version__ from wafw00f.lib.asciiarts import Color, randomArt from wafw00f.lib.evillib import waftoolsengine from wafw00f.manager import load_plugins from wafw00f.wafprio import wafdetectionsprio class WAFW00F(waftoolsengine): xsstring = r'' sqlistring = r'UNION SELECT ALL FROM information_schema AND " or SLEEP(5) or "' lfistring = r'../../etc/passwd' rcestring = r'/bin/cat /etc/passwd; ping 127.0.0.1; curl google.com' xxestring = r']>&hack;' def __init__(self, target='www.example.com', debuglevel=0, path='/', followredirect=True, extraheaders={}, proxies=None, timeout=7): self.log = logging.getLogger('wafw00f') self.attackres = None waftoolsengine.__init__(self, target, debuglevel, path, proxies, followredirect, extraheaders, timeout) self.knowledge = { 'generic': { 'found': False, 'reason': '' }, 'wafname': [] } self.rq = self.normalRequest() def normalRequest(self): return self.Request() def customRequest(self, headers=None): return self.Request( headers=headers ) def nonExistent(self): return self.Request( path=self.path + str(random.randrange(100, 999)) + '.html' ) def xssAttack(self): return self.Request( path=self.path, params={ create_random_param_name(): self.xsstring } ) def xxeAttack(self): return self.Request( path=self.path, params={ create_random_param_name(): self.xxestring } ) def lfiAttack(self): return self.Request( path=self.path + self.lfistring ) def centralAttack(self): return self.Request( path=self.path, params={ create_random_param_name(): self.xsstring, create_random_param_name(): self.sqlistring, create_random_param_name(): self.lfistring } ) def sqliAttack(self): return self.Request( path=self.path, params={ create_random_param_name(): self.sqlistring } ) def osciAttack(self): return self.Request( path=self.path, params= { create_random_param_name(): self.rcestring } ) def performCheck(self, request_method): r = request_method() if r is None: raise RequestBlocked() return r, r.url # Most common attacks used to detect WAFs attcom = [xssAttack, sqliAttack, lfiAttack] attacks = [xssAttack, xxeAttack, lfiAttack, sqliAttack, osciAttack] def genericdetect(self): reason = '' reasons = ['Blocking is being done at connection/packet level.', 'The server header is different when an attack is detected.', 'The server returns a different response code when an attack string is used.', 'It closed the connection for a normal request.', 'The response was different when the request wasn\'t made from a browser.' ] try: # Testing for no user-agent response. Detects almost all WAFs out there. resp1, _ = self.performCheck(self.normalRequest) if 'User-Agent' in self.headers: self.headers.pop('User-Agent') # Deleting the user-agent key from object not dict. resp3 = self.customRequest(headers=self.headers) if resp3 is not None and resp1 is not None: if resp1.status_code != resp3.status_code: self.log.info('Server returned a different response when request didn\'t contain the User-Agent header.') reason = reasons[4] reason += '\r\n' reason += 'Normal response code is "%s",' % resp1.status_code reason += ' while the response code to a modified request is "%s"' % resp3.status_code self.knowledge['generic']['reason'] = reason self.knowledge['generic']['found'] = True return True # Testing the status code upon sending a xss attack resp2, xss_url = self.performCheck(self.xssAttack) if resp1.status_code != resp2.status_code: self.log.info('Server returned a different response when a XSS attack vector was tried.') reason = reasons[2] reason += '\r\n' reason += 'Normal response code is "%s",' % resp1.status_code reason += ' while the response code to cross-site scripting attack is "%s"' % resp2.status_code self.knowledge['generic']['reason'] = reason self.knowledge['generic']['found'] = True return xss_url # Testing the status code upon sending a lfi attack resp2, lfi_url = self.performCheck(self.lfiAttack) if resp1.status_code != resp2.status_code: self.log.info('Server returned a different response when a directory traversal was attempted.') reason = reasons[2] reason += '\r\n' reason += 'Normal response code is "%s",' % resp1.status_code reason += ' while the response code to a file inclusion attack is "%s"' % resp2.status_code self.knowledge['generic']['reason'] = reason self.knowledge['generic']['found'] = True return lfi_url # Testing the status code upon sending a sqli attack resp2, sqli_url = self.performCheck(self.sqliAttack) if resp1.status_code != resp2.status_code: self.log.info('Server returned a different response when a SQLi was attempted.') reason = reasons[2] reason += '\r\n' reason += 'Normal response code is "%s",' % resp1.status_code reason += ' while the response code to a SQL injection attack is "%s"' % resp2.status_code self.knowledge['generic']['reason'] = reason self.knowledge['generic']['found'] = True return sqli_url # Checking for the Server header after sending malicious requests normalserver, attackresponse_server = '', '' response = self.attackres if 'server' in resp1.headers: normalserver = resp1.headers.get('Server') if response is not None and 'server' in response.headers: attackresponse_server = response.headers.get('Server') if attackresponse_server != normalserver: self.log.info('Server header changed, WAF possibly detected') self.log.debug('Attack response: %s' % attackresponse_server) self.log.debug('Normal response: %s' % normalserver) reason = reasons[1] reason += '\r\nThe server header for a normal response is "%s",' % normalserver reason += ' while the server header a response to an attack is "%s",' % attackresponse_server self.knowledge['generic']['reason'] = reason self.knowledge['generic']['found'] = True return True # If at all request doesn't go, press F except RequestBlocked: self.knowledge['generic']['reason'] = reasons[0] self.knowledge['generic']['found'] = True return True return False def matchHeader(self, headermatch, attack=False): if attack: r = self.attackres else: r = self.rq if r is None: return header, match = headermatch headerval = r.headers.get(header) if headerval: # set-cookie can have multiple headers, python gives it to us # concatinated with a comma if header == 'Set-Cookie': headervals = headerval.split(', ') else: headervals = [headerval] for headerval in headervals: if re.search(match, headerval, re.I): return True return False def matchStatus(self, statuscode, attack=True): if attack: r = self.attackres else: r = self.rq if r is None: return if r.status_code == statuscode: return True return False def matchCookie(self, match, attack=False): return self.matchHeader(('Set-Cookie', match), attack=attack) def matchReason(self, reasoncode, attack=True): if attack: r = self.attackres else: r = self.rq if r is None: return # We may need to match multiline context in response body if str(r.reason) == reasoncode: return True return False def matchContent(self, regex, attack=True): if attack: r = self.attackres else: r = self.rq if r is None: return # We may need to match multiline context in response body if re.search(regex, r.text, re.I): return True return False wafdetections = dict() plugin_dict = load_plugins() result_dict = {} for plugin_module in plugin_dict.values(): wafdetections[plugin_module.NAME] = plugin_module.is_waf # Check for prioritized ones first, then check those added externally checklist = wafdetectionsprio checklist += list(set(wafdetections.keys()) - set(checklist)) def identwaf(self, findall=False): detected = list() try: self.attackres, xurl = self.performCheck(self.centralAttack) except RequestBlocked: return detected, None for wafvendor in self.checklist: self.log.info('Checking for %s' % wafvendor) if self.wafdetections[wafvendor](self): detected.append(wafvendor) if not findall: break self.knowledge['wafname'] = detected return detected, xurl def calclogginglevel(verbosity): default = 40 # errors are printed out level = default - (verbosity * 10) if level < 0: level = 0 return level def buildResultRecord(url, waf, evil_url=None): result = {} result['url'] = url if waf: result['detected'] = True if waf == 'generic': result['trigger_url'] = evil_url result['firewall'] = 'Generic' result['manufacturer'] = 'Unknown' else: result['trigger_url'] = evil_url result['firewall'] = waf.split('(')[0].strip() result['manufacturer'] = waf.split('(')[1].replace(')', '').strip() else: result['trigger_url'] = evil_url result['detected'] = False result['firewall'] = 'None' result['manufacturer'] = 'None' return result def getTextResults(res=[]): # leaving out some space for future possibilities of newer columns # newer columns can be added to this tuple below keys = ('detected') res = [({key: ba[key] for key in ba if key not in keys}) for ba in res] rows = [] for dk in res: p = [str(x) for _, x in dk.items()] rows.append(p) for m in rows: m[1] = '%s (%s)' % (m[1], m[2]) m.pop() defgen = [ (max([len(str(row[i])) for row in rows]) + 3) for i in range(len(rows[0])) ] rwfmt = ''.join(['{:>'+str(dank)+'}' for dank in defgen]) textresults = [] for row in rows: textresults.append(rwfmt.format(*row)) return textresults def create_random_param_name(size=8, chars=string.ascii_lowercase): return ''.join(random.choice(chars) for _ in range(size)) def disableStdOut(): sys.stdout = None def enableStdOut(): sys.stdout = sys.__stdout__ def getheaders(fn): headers = {} if not os.path.exists(fn): logging.getLogger('wafw00f').critical('Headers file "%s" does not exist!' % fn) return with io.open(fn, 'r', encoding='utf-8') as f: for line in f.readlines(): _t = line.split(':', 2) if len(_t) == 2: h, v = map(lambda x: x.strip(), _t) headers[h] = v return headers class RequestBlocked(Exception): pass def main(): parser = OptionParser(usage='%prog url1 [url2 [url3 ... ]]\r\nexample: %prog http://www.victim.org/') parser.add_option('-v', '--verbose', action='count', dest='verbose', default=0, help='Enable verbosity, multiple -v options increase verbosity') parser.add_option('-a', '--findall', action='store_true', dest='findall', default=False, help='Find all WAFs which match the signatures, do not stop testing on the first one') parser.add_option('-r', '--noredirect', action='store_false', dest='followredirect', default=True, help='Do not follow redirections given by 3xx responses') parser.add_option('-t', '--test', dest='test', help='Test for one specific WAF') parser.add_option('-o', '--output', dest='output', help='Write output to csv, json or text file depending on file extension. For stdout, specify - as filename.', default=None) parser.add_option('-f', '--format', dest='format', help='Force output format to csv, json or text.', default=None) parser.add_option('-i', '--input-file', dest='input', help='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.', default=None) parser.add_option('-l', '--list', dest='list', action='store_true', default=False, help='List all WAFs that WAFW00F is able to detect') parser.add_option('-p', '--proxy', dest='proxy', default=None, help='Use an HTTP proxy to perform requests, examples: http://hostname:8080, socks5://hostname:1080, http://user:pass@hostname:8080') parser.add_option('--version', '-V', dest='version', action='store_true', default=False, help='Print out the current version of WafW00f and exit.') parser.add_option('--headers', '-H', dest='headers', action='store', default=None, help='Pass custom headers via a text file to overwrite the default header set.') parser.add_option('-T', '--timeout', dest='timeout', action='store', default=7, type=int, help='Set the timeout for the requests.') parser.add_option('--no-colors', dest='colors', action='store_false', default=True, help='Disable ANSI colors in output.') options, args = parser.parse_args() logging.basicConfig(level=calclogginglevel(options.verbose)) log = logging.getLogger('wafw00f') if options.output == '-': disableStdOut() # Windows based systems do not support ANSI sequences, # hence not displaying them. if not options.colors or 'win' in sys.platform: Color.disable() print(randomArt()) (W,Y,G,R,B,C,E) = Color.unpack() if options.list: print('[+] Can test for these WAFs:\r\n') try: m = [i.replace(')', '').split(' (') for i in wafdetectionsprio] print(R+' WAF Name'+' '*24+'Manufacturer\n '+'-'*8+' '*24+'-'*12+'\n') max_len = max(len(str(x)) for k in m for x in k) for inner in m: first = True for elem in inner: if first: text = Y+' {:<{}} '.format(elem, max_len+2) first = False else: text = W+'{:<{}} '.format(elem, max_len+2) print(text, E, end='') print() sys.exit(0) except Exception: return if options.version: print('[+] The version of WAFW00F you have is %sv%s%s' % (B, __version__, E)) print('[+] WAFW00F is provided under the %s%s%s license.' % (C, __license__, E)) return extraheaders = {} if options.headers: log.info('Getting extra headers from %s' % options.headers) extraheaders = getheaders(options.headers) if extraheaders is None: parser.error('Please provide a headers file with colon delimited header names and values') if len(args) == 0 and not options.input: parser.error('No test target specified.') #check if input file is present if options.input: log.debug('Loading file "%s"' % options.input) try: if options.input.endswith('.json'): with open(options.input) as f: try: urls = json.loads(f.read()) except json.decoder.JSONDecodeError: log.critical('JSON file %s did not contain well-formed JSON', options.input) sys.exit(1) log.info('Found: %s urls to check.' %(len(urls))) targets = [ item['url'] for item in urls ] elif options.input.endswith('.csv'): columns = defaultdict(list) with open(options.input) as f: reader = csv.DictReader(f) for row in reader: for (k,v) in row.items(): columns[k].append(v) targets = columns['url'] else: with open(options.input) as f: targets = [x for x in f.read().splitlines()] except FileNotFoundError: log.error('File %s could not be read. No targets loaded.', options.input) sys.exit(1) else: targets = args results = [] for target in targets: if not target.startswith('http'): log.info('The url %s should start with http:// or https:// .. fixing (might make this unusable)' % target) target = 'https://' + target print('[*] Checking %s' % target) pret = urllib.parse.urlparse(target) if pret is None: log.critical('The url %s is not well formed' % target) sys.exit(1) log.info('starting wafw00f on %s' % target) proxies = dict() if options.proxy: proxies = { 'http': options.proxy, 'https': options.proxy, } attacker = WAFW00F(target, debuglevel=options.verbose, path=pret.path, followredirect=options.followredirect, extraheaders=extraheaders, proxies=proxies, timeout=options.timeout) if attacker.rq is None: log.error('Site %s appears to be down' % pret.hostname) continue if options.test: if options.test in attacker.wafdetections: waf = attacker.wafdetections[options.test](attacker) if waf: print('[+] The site %s%s%s is behind %s%s%s WAF.' % (B, target, E, C, options.test, E)) else: print('[-] WAF %s was not detected on %s' % (options.test, target)) else: print('[-] WAF %s was not found in our list\r\nUse the --list option to see what is available' % options.test) return waf, xurl = attacker.identwaf(options.findall) log.info('Identified WAF: %s' % waf) if len(waf) > 0: for i in waf: results.append(buildResultRecord(target, i, xurl)) print('[+] The site %s%s%s is behind %s%s%s WAF.' % (B, target, E, C, (E+' and/or '+C).join(waf), E)) if (options.findall) or len(waf) == 0: print('[+] Generic Detection results:') generic_url = attacker.genericdetect() if generic_url: log.info('Generic Detection: %s' % attacker.knowledge['generic']['reason']) print('[*] The site %s seems to be behind a WAF or some sort of security solution' % target) print('[~] Reason: %s' % attacker.knowledge['generic']['reason']) results.append(buildResultRecord(target, 'generic', generic_url)) else: print('[-] No WAF detected by the generic detection') results.append(buildResultRecord(target, None, None)) print('[~] Number of requests: %s' % attacker.requestnumber) #print table of results if len(results) > 0: log.info('Found: %s matches.' % (len(results))) if options.output: if options.output == '-': enableStdOut() if options.format == 'json': json.dump(results, sys.stdout, indent=2, sort_keys=True) elif options.format == 'csv': csvwriter = csv.writer(sys.stdout, delimiter=',', quotechar='"', quoting=csv.QUOTE_MINIMAL) count = 0 for result in results: if count == 0: header = result.keys() csvwriter.writerow(header) count += 1 csvwriter.writerow(result.values()) else: print(os.linesep.join(getTextResults(results))) elif options.output.endswith('.json'): log.debug('Exporting data in json format to file: %s' % (options.output)) with open(options.output, 'w') as outfile: json.dump(results, outfile, indent=2, sort_keys=True) elif options.output.endswith('.csv'): log.debug('Exporting data in csv format to file: %s' % (options.output)) with open(options.output, 'w') as outfile: csvwriter = csv.writer(outfile, delimiter=',', quotechar='"', quoting=csv.QUOTE_MINIMAL) count = 0 for result in results: if count == 0: header = result.keys() csvwriter.writerow(header) count += 1 csvwriter.writerow(result.values()) else: log.debug('Exporting data in text format to file: %s' % (options.output)) if options.format == 'json': with open(options.output, 'w') as outfile: json.dump(results, outfile, indent=2, sort_keys=True) elif options.format == 'csv': with open(options.output, 'w') as outfile: csvwriter = csv.writer(outfile, delimiter=',', quotechar='"', quoting=csv.QUOTE_MINIMAL) count = 0 for result in results: if count == 0: header = result.keys() csvwriter.writerow(header) count += 1 csvwriter.writerow(result.values()) else: with open(options.output, 'w') as outfile: outfile.write(os.linesep.join(getTextResults(results))) if __name__ == '__main__': version_info = sys.version_info if version_info.major < 3 or (version_info.major == 3 and version_info.minor < 6): sys.stderr.write('Your version of python is way too old... please update to 3.6 or later\r\n') main() wafw00f-2.3.1/wafw00f/manager.py0000664000175000017500000000131714734711633016146 0ustar epsilonepsilon#!/usr/bin/env python3 ''' Copyright (C) 2024, WAFW00F Developers. See the LICENSE file for copying permission. ''' import os from functools import partial from pluginbase import PluginBase def load_plugins(): here = os.path.abspath(os.path.dirname(__file__)) get_path = partial(os.path.join, here) plugin_dir = get_path('plugins') plugin_base = PluginBase( package='wafw00f.plugins', searchpath=[plugin_dir] ) plugin_source = plugin_base.make_plugin_source( searchpath=[plugin_dir], persist=True ) plugin_dict = {} for plugin_name in plugin_source.list_plugins(): plugin_dict[plugin_name] = plugin_source.load_plugin(plugin_name) return plugin_dict wafw00f-2.3.1/wafw00f/plugins/0000775000175000017500000000000014734711633015641 5ustar epsilonepsilonwafw00f-2.3.1/wafw00f/plugins/janusec.py0000664000175000017500000000043014734711633017640 0ustar epsilonepsilon#!/usr/bin/env python3 ''' Copyright (C) 2024, WAFW00F Developers. See the LICENSE file for copying permission. ''' NAME = 'Janusec Application Gateway (Janusec)' def is_waf(self): if self.matchContent(r'janusec application gateway'): return True return False wafw00f-2.3.1/wafw00f/plugins/f5bigipasm.py0000664000175000017500000000102414734711633020236 0ustar epsilonepsilon#!/usr/bin/env python3 ''' Copyright (C) 2024, WAFW00F Developers. See the LICENSE file for copying permission. ''' NAME = 'BIG-IP AppSec Manager (F5 Networks)' def is_waf(self): if check_schema_01(self): return True if self.matchCookie(r'^TS.+?'): return True return False def check_schema_01(self): if not self.matchContent('the requested url was rejected'): return False if not self.matchContent('please consult with your administrator'): return False return True wafw00f-2.3.1/wafw00f/plugins/squarespace.py0000664000175000017500000000121014734711633020521 0ustar epsilonepsilon#!/usr/bin/env python3 ''' Copyright (C) 2024, WAFW00F Developers. See the LICENSE file for copying permission. ''' NAME = 'Squarespace (Squarespace)' def is_waf(self): if self.matchHeader(('Server', 'Squarespace')): return True if self.matchCookie(r'^SS_ANALYTICS_ID='): return True if self.matchCookie(r'^SS_MATTR='): return True if self.matchCookie(r'^SS_MID='): return True if self.matchCookie(r'SS_CVT='): return True if self.matchContent(r'status\.squarespace\.com'): return True if self.matchContent(r'BRICK\-\d{2}'): return True return False wafw00f-2.3.1/wafw00f/plugins/cachefly.py0000664000175000017500000000050214734711633017766 0ustar epsilonepsilon#!/usr/bin/env python3 ''' Copyright (C) 2024, WAFW00F Developers. See the LICENSE file for copying permission. ''' NAME = 'CacheFly CDN (CacheFly)' def is_waf(self): if self.matchHeader(('BestCDN', r'Cachefly')): return True if self.matchCookie(r'^cfly_req.*='): return True return False wafw00f-2.3.1/wafw00f/plugins/wallarm.py0000664000175000017500000000041214734711633017647 0ustar epsilonepsilon#!/usr/bin/env python3 ''' Copyright (C) 2024, WAFW00F Developers. See the LICENSE file for copying permission. ''' NAME = 'Wallarm (Wallarm Inc.)' def is_waf(self): if self.matchHeader(('Server', r'nginx[\-_]wallarm')): return True return False wafw00f-2.3.1/wafw00f/plugins/sophos.py0000664000175000017500000000200014734711633017516 0ustar epsilonepsilon#!/usr/bin/env python3 ''' Copyright (C) 2024, WAFW00F Developers. See the LICENSE file for copying permission. ''' NAME = 'UTM Web Protection (Sophos)' def is_waf(self): if check_schema_01(self): return True if check_schema_02(self): return True return False def check_schema_01(self): if self.matchContent(r'www\.sophos\.com'): return True if self.matchContent(r'Powered by.?(Sophos)? UTM Web Protection'): return True return False def check_schema_02(self): if not self.matchContent(r'Access to the requested URL was blocked'): return False if not self.matchContent(r'Access to the requested URL was blocked'): return False if not self.matchContent(r'incident was logged with the following log identifier'): return False if not self.matchContent(r'Inbound Anomaly Score exceeded'): return False if not self.matchContent(r'Your cache administrator is'): return False return True wafw00f-2.3.1/wafw00f/plugins/isaserver.py����������������������������������������������������������0000664�0001750�0001750�00000000503�14734711633�020214� 0����������������������������������������������������������������������������������������������������ustar �epsilon�������������������������epsilon����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/usr/bin/env python3 ''' Copyright (C) 2024, WAFW00F Developers. See the LICENSE file for copying permission. ''' NAME = 'ISA Server (Microsoft)' def is_waf(self): if self.matchContent(r'The.{0,10}?(isa.)?server.{0,10}?denied the specified uniform resource locator \(url\)'): return True return False ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������wafw00f-2.3.1/wafw00f/plugins/incapsula.py����������������������������������������������������������0000664�0001750�0001750�00000001031�14734711633�020165� 0����������������������������������������������������������������������������������������������������ustar �epsilon�������������������������epsilon����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/usr/bin/env python3 ''' Copyright (C) 2024, WAFW00F Developers. See the LICENSE file for copying permission. ''' NAME = 'Incapsula (Imperva Inc.)' def is_waf(self): if self.matchCookie(r'^incap_ses.*?='): return True if self.matchCookie(r'^visid_incap.*?='): return True if self.matchContent(r'incapsula incident id'): return True if self.matchContent(r'powered by incapsula'): return True if self.matchContent(r'/_Incapsula_Resource'): return True return False �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������wafw00f-2.3.1/wafw00f/plugins/netcontinuum.py�������������������������������������������������������0000664�0001750�0001750�00000000410�14734711633�020736� 0����������������������������������������������������������������������������������������������������ustar �epsilon�������������������������epsilon����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/usr/bin/env python3 ''' Copyright (C) 2024, WAFW00F Developers. See the LICENSE file for copying permission. ''' NAME = 'NetContinuum (Barracuda Networks)' def is_waf(self): if self.matchCookie(r'^NCI__SessionId='): return True return False ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������wafw00f-2.3.1/wafw00f/plugins/f5trafficshield.py����������������������������������������������������0000664�0001750�0001750�00000000507�14734711633�021257� 0����������������������������������������������������������������������������������������������������ustar �epsilon�������������������������epsilon����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/usr/bin/env python3 ''' Copyright (C) 2024, WAFW00F Developers. See the LICENSE file for copying permission. ''' NAME = 'Trafficshield (F5 Networks)' def is_waf(self): if self.matchCookie('^ASINFO='): return True if self.matchHeader(('Server', 'F5-TrafficShield')): return True return False �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������wafw00f-2.3.1/wafw00f/plugins/nullddos.py�����������������������������������������������������������0000664�0001750�0001750�00000000423�14734711633�020036� 0����������������������������������������������������������������������������������������������������ustar �epsilon�������������������������epsilon����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/usr/bin/env python3 ''' Copyright (C) 2024, WAFW00F Developers. See the LICENSE file for copying permission. ''' NAME = 'NullDDoS Protection (NullDDoS)' def is_waf(self): if self.matchHeader(('Server', r'NullDDoS(.System)?')): return True return False ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������wafw00f-2.3.1/wafw00f/plugins/shieldsecurity.py�����������������������������������������������������0000664�0001750�0001750�00000000761�14734711633�021257� 0����������������������������������������������������������������������������������������������������ustar �epsilon�������������������������epsilon����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/usr/bin/env python3 ''' Copyright (C) 2024, WAFW00F Developers. See the LICENSE file for copying permission. ''' NAME = 'Shield Security (One Dollar Plugin)' def is_waf(self): if self.matchContent(r"You were blocked by the Shield"): return True if self.matchContent(r"remaining transgression\(s\) against this site"): return True if self.matchContent(r"Something in the URL.{0,5}?Form or Cookie data wasn\'t appropriate"): return True return False ���������������wafw00f-2.3.1/wafw00f/plugins/arvancloud.py���������������������������������������������������������0000664�0001750�0001750�00000000403�14734711633�020346� 0����������������������������������������������������������������������������������������������������ustar �epsilon�������������������������epsilon����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/usr/bin/env python3 ''' Copyright (C) 2024, WAFW00F Developers. See the LICENSE file for copying permission. ''' NAME = 'ArvanCloud (ArvanCloud)' def is_waf(self): if self.matchHeader(('Server', 'ArvanCloud')): return True return False �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������wafw00f-2.3.1/wafw00f/plugins/yundun.py�������������������������������������������������������������0000664�0001750�0001750�00000001204�14734711633�017532� 0����������������������������������������������������������������������������������������������������ustar �epsilon�������������������������epsilon����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/usr/bin/env python3 ''' Copyright (C) 2024, WAFW00F Developers. See the LICENSE file for copying permission. ''' NAME = 'Yundun (Yundun)' def is_waf(self): if self.matchHeader(('Server', 'YUNDUN')): return True if self.matchHeader(('X-Cache', 'YUNDUN')): return True if self.matchCookie(r'^yd_cookie='): return True if self.matchContent(r'Blocked by YUNDUN Cloud WAF'): return True if self.matchContent(r'yundun\.com/yd[-_]http[_-]error/'): return True if self.matchContent(r'www\.yundun\.com/(static/js/fingerprint\d{1}?\.js)?'): return True return False ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������wafw00f-2.3.1/wafw00f/plugins/yunsuo.py�������������������������������������������������������������0000664�0001750�0001750�00000000476�14734711633�017564� 0����������������������������������������������������������������������������������������������������ustar �epsilon�������������������������epsilon����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/usr/bin/env python3 ''' Copyright (C) 2024, WAFW00F Developers. See the LICENSE file for copying permission. ''' NAME = 'Yunsuo (Yunsuo)' def is_waf(self): if self.matchCookie(r'^yunsuo_session='): return True if self.matchContent(r'class=\"yunsuologo\"'): return True return False ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������wafw00f-2.3.1/wafw00f/plugins/tencent.py������������������������������������������������������������0000664�0001750�0001750�00000000437�14734711633�017657� 0����������������������������������������������������������������������������������������������������ustar �epsilon�������������������������epsilon����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/usr/bin/env python3 ''' Copyright (C) 2024, WAFW00F Developers. See the LICENSE file for copying permission. ''' NAME = 'Tencent Cloud Firewall (Tencent Technologies)' def is_waf(self): if self.matchContent(r'waf\.tencent\-?cloud\.com/'): return True return False ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������wafw00f-2.3.1/wafw00f/plugins/fastly.py�������������������������������������������������������������0000664�0001750�0001750�00000000406�14734711633�017515� 0����������������������������������������������������������������������������������������������������ustar �epsilon�������������������������epsilon����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/usr/bin/env python3 ''' Copyright (C) 2024, WAFW00F Developers. See the LICENSE file for copying permission. ''' NAME = 'Fastly (Fastly CDN)' def is_waf(self): if self.matchHeader(('X-Fastly-Request-ID', r'\w+')): return True return False ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������wafw00f-2.3.1/wafw00f/plugins/aspnetgen.py����������������������������������������������������������0000664�0001750�0001750�00000001101�14734711633�020170� 0����������������������������������������������������������������������������������������������������ustar �epsilon�������������������������epsilon����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/usr/bin/env python3 ''' Copyright (C) 2024, WAFW00F Developers. See the LICENSE file for copying permission. ''' NAME = 'ASP.NET Generic (Microsoft)' def is_waf(self): if self.matchContent(r'iis (\d+.)+?detailed error'): return True if self.matchContent(r'potentially dangerous request querystring'): return True if self.matchContent(r'application error from being viewed remotely (for security reasons)?'): return True if self.matchContent(r'An application error occurred on the server'): return True return False ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������wafw00f-2.3.1/wafw00f/plugins/hyperguard.py���������������������������������������������������������0000664�0001750�0001750�00000000375�14734711633�020372� 0����������������������������������������������������������������������������������������������������ustar �epsilon�������������������������epsilon����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/usr/bin/env python3 ''' Copyright (C) 2024, WAFW00F Developers. See the LICENSE file for copying permission. ''' NAME = 'HyperGuard (Art of Defense)' def is_waf(self): if self.matchCookie('^WODSESSION='): return True return False �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������wafw00f-2.3.1/wafw00f/plugins/imunify360.py���������������������������������������������������������0000664�0001750�0001750�00000000766�14734711633�020135� 0����������������������������������������������������������������������������������������������������ustar �epsilon�������������������������epsilon����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/usr/bin/env python3 ''' Copyright (C) 2024, WAFW00F Developers. See the LICENSE file for copying permission. ''' NAME = 'Imunify360 (CloudLinux)' def is_waf(self): if self.matchHeader(('Server', r'imunify360.{0,10}?')): return True if self.matchContent(r'protected.by.{0,10}?imunify360'): return True if self.matchContent(r'powered.by.{0,10}?imunify360'): return True if self.matchContent(r'imunify360.preloader'): return True return False ����������wafw00f-2.3.1/wafw00f/plugins/dynamicweb.py���������������������������������������������������������0000664�0001750�0001750�00000000601�14734711633�020332� 0����������������������������������������������������������������������������������������������������ustar �epsilon�������������������������epsilon����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/usr/bin/env python3 ''' Copyright (C) 2024, WAFW00F Developers. See the LICENSE file for copying permission. ''' NAME = 'DynamicWeb Injection Check (DynamicWeb)' def is_waf(self): if self.matchHeader(('X-403-Status-By', r'dw.inj.check'), attack=True): return True if self.matchContent(r'by dynamic check(.{0,10}?module)?'): return True return False �������������������������������������������������������������������������������������������������������������������������������wafw00f-2.3.1/wafw00f/plugins/safeline.py�����������������������������������������������������������0000664�0001750�0001750�00000000412�14734711633�017776� 0����������������������������������������������������������������������������������������������������ustar �epsilon�������������������������epsilon����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/usr/bin/env python3 ''' Copyright (C) 2024, WAFW00F Developers. See the LICENSE file for copying permission. ''' NAME = 'Safeline (Chaitin Tech.)' def is_waf(self): if self.matchContent(r'safeline|<!\-\-\sevent id:'): return True return False ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������wafw00f-2.3.1/wafw00f/plugins/maxcdn.py�������������������������������������������������������������0000664�0001750�0001750�00000000367�14734711633�017473� 0����������������������������������������������������������������������������������������������������ustar �epsilon�������������������������epsilon����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/usr/bin/env python3 ''' Copyright (C) 2024, WAFW00F Developers. See the LICENSE file for copying permission. ''' NAME = 'MaxCDN (MaxCDN)' def is_waf(self): if self.matchHeader(('X-CDN', r'maxcdn')): return True return False �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������wafw00f-2.3.1/wafw00f/plugins/qcloud.py�������������������������������������������������������������0000664�0001750�0001750�00000000505�14734711633�017502� 0����������������������������������������������������������������������������������������������������ustar �epsilon�������������������������epsilon����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/usr/bin/env python3 ''' Copyright (C) 2024, WAFW00F Developers. See the LICENSE file for copying permission. ''' NAME = 'Qcloud (Tencent Cloud)' def is_waf(self): if not self.matchContent(r'腾讯云Web应用防火墙'): return False if not self.matchStatus(403): return False return True �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������wafw00f-2.3.1/wafw00f/plugins/safedog.py������������������������������������������������������������0000664�0001750�0001750�00000001112�14734711633�017616� 0����������������������������������������������������������������������������������������������������ustar �epsilon�������������������������epsilon����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/usr/bin/env python3 ''' Copyright (C) 2024, WAFW00F Developers. See the LICENSE file for copying permission. ''' NAME = 'Safedog (SafeDog)' def is_waf(self): if self.matchCookie(r'^safedog\-flow\-item='): return True if self.matchHeader(('Server', 'Safedog')): return True if self.matchContent(r'safedogsite/broswer_logo\.jpg'): return True if self.matchContent(r'404\.safedog\.cn/sitedog_stat.html'): return True if self.matchContent(r'404\.safedog\.cn/images/safedogsite/head\.png'): return True return False ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������wafw00f-2.3.1/wafw00f/plugins/chuangyu.py�����������������������������������������������������������0000664�0001750�0001750�00000000545�14734711633�020042� 0����������������������������������������������������������������������������������������������������ustar �epsilon�������������������������epsilon����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/usr/bin/env python3 ''' Copyright (C) 2024, WAFW00F Developers. See the LICENSE file for copying permission. ''' NAME = 'Chuang Yu Shield (Yunaq)' def is_waf(self): if self.matchContent(r'www\.365cyd\.com'): return True if self.matchContent(r'help\.365cyd\.com/cyd\-error\-help.html\?code=403'): return True return False �����������������������������������������������������������������������������������������������������������������������������������������������������������wafw00f-2.3.1/wafw00f/plugins/secking.py������������������������������������������������������������0000664�0001750�0001750�00000000403�14734711633�017633� 0����������������������������������������������������������������������������������������������������ustar �epsilon�������������������������epsilon����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/usr/bin/env python3 ''' Copyright (C) 2024, WAFW00F Developers. See the LICENSE file for copying permission. ''' NAME = 'SecKing (SecKing)' def is_waf(self): if self.matchHeader(('Server', r'secking(.?waf)?')): return True return False �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������wafw00f-2.3.1/wafw00f/plugins/profense.py�����������������������������������������������������������0000664�0001750�0001750�00000000472�14734711633�020037� 0����������������������������������������������������������������������������������������������������ustar �epsilon�������������������������epsilon����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/usr/bin/env python3 ''' Copyright (C) 2024, WAFW00F Developers. See the LICENSE file for copying permission. ''' NAME = 'Profense (ArmorLogic)' def is_waf(self): if self.matchHeader(('Server', 'Profense')): return True if self.matchCookie(r'^PLBSID='): return True return False ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������wafw00f-2.3.1/wafw00f/plugins/cloudbric.py����������������������������������������������������������0000664�0001750�0001750�00000001345�14734711633�020164� 0����������������������������������������������������������������������������������������������������ustar �epsilon�������������������������epsilon����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/usr/bin/env python3 ''' Copyright (C) 2024, WAFW00F Developers. See the LICENSE file for copying permission. ''' NAME = 'Cloudbric (Penta Security)' def is_waf(self): if self.matchContent(r'<title>Cloudbric.{0,5}?ERROR!'): return True if self.matchContent(r'Your request was blocked by Cloudbric'): return True if self.matchContent(r'please contact Cloudbric Support'): return True if self.matchContent(r'cloudbric\.zendesk\.com'): return True if self.matchContent(r'Cloudbric Help Center'): return True if self.matchContent(r'malformed request syntax.{0,4}?invalid request message framing.{0,4}?or deceptive request routing'): return True return False �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������wafw00f-2.3.1/wafw00f/plugins/cloudflare.py���������������������������������������������������������0000664�0001750�0001750�00000000726�14734711633�020340� 0����������������������������������������������������������������������������������������������������ustar �epsilon�������������������������epsilon����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/usr/bin/env python3 ''' Copyright (C) 2024, WAFW00F Developers. See the LICENSE file for copying permission. ''' NAME = 'Cloudflare (Cloudflare Inc.)' def is_waf(self): if self.matchHeader(('server', 'cloudflare')): return True if self.matchHeader(('server', r'cloudflare[-_]nginx')): return True if self.matchHeader(('cf-ray', r'.+?')): return True if self.matchCookie('__cfduid'): return True return False ������������������������������������������wafw00f-2.3.1/wafw00f/plugins/anquanbao.py����������������������������������������������������������0000664�0001750�0001750�00000000513�14734711633�020157� 0����������������������������������������������������������������������������������������������������ustar �epsilon�������������������������epsilon����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/usr/bin/env python3 ''' Copyright (C) 2024, WAFW00F Developers. See the LICENSE file for copying permission. ''' NAME = 'Anquanbao (Anquanbao)' def is_waf(self): if self.matchHeader(('X-Powered-By-Anquanbao', '.+?')): return True if self.matchContent(r'aqb_cc/error/'): return True return False �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������wafw00f-2.3.1/wafw00f/plugins/serverdefender.py�����������������������������������������������������0000664�0001750�0001750�00000000421�14734711633�021213� 0����������������������������������������������������������������������������������������������������ustar �epsilon�������������������������epsilon����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/usr/bin/env python3 ''' Copyright (C) 2024, WAFW00F Developers. See the LICENSE file for copying permission. ''' NAME = 'ServerDefender VP (Port80 Software)' def is_waf(self): if self.matchHeader(('X-Pint', r'p(ort\-)?80')): return True return False �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������wafw00f-2.3.1/wafw00f/plugins/aspa.py���������������������������������������������������������������0000664�0001750�0001750�00000000541�14734711633�017137� 0����������������������������������������������������������������������������������������������������ustar �epsilon�������������������������epsilon����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/usr/bin/env python3 ''' Copyright (C) 2024, WAFW00F Developers. See the LICENSE file for copying permission. ''' NAME = 'ASPA Firewall (ASPA Engineering Co.)' def is_waf(self): if self.matchHeader(('Server', r'ASPA[\-_]?WAF')): return True if self.matchHeader(('ASPA-Cache-Status', r'.+?')): return True return False ���������������������������������������������������������������������������������������������������������������������������������������������������������������wafw00f-2.3.1/wafw00f/plugins/greywizard.py���������������������������������������������������������0000664�0001750�0001750�00000001057�14734711633�020405� 0����������������������������������������������������������������������������������������������������ustar �epsilon�������������������������epsilon����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/usr/bin/env python3 ''' Copyright (C) 2024, WAFW00F Developers. See the LICENSE file for copying permission. ''' NAME = 'Greywizard (Grey Wizard)' def is_waf(self): if self.matchHeader(('Server', 'greywizard')): return True if self.matchContent(r'<(title|h\d{1})>Grey Wizard'): return True if self.matchContent(r'contact the website owner or Grey Wizard'): return True if self.matchContent(r'We.ve detected attempted attack or non standard traffic from your ip address'): return True return False ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������wafw00f-2.3.1/wafw00f/plugins/aesecure.py�����������������������������������������������������������0000664�0001750�0001750�00000000507�14734711633�020011� 0����������������������������������������������������������������������������������������������������ustar �epsilon�������������������������epsilon����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/usr/bin/env python3 ''' Copyright (C) 2024, WAFW00F Developers. See the LICENSE file for copying permission. ''' NAME = 'aeSecure (aeSecure)' def is_waf(self): if self.matchHeader(('aeSecure-code', '.+?')): return True if self.matchContent(r'aesecure_denied\.png'): return True return False �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������wafw00f-2.3.1/wafw00f/plugins/chinacache.py���������������������������������������������������������0000664�0001750�0001750�00000000430�14734711633�020256� 0����������������������������������������������������������������������������������������������������ustar �epsilon�������������������������epsilon����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/usr/bin/env python3 ''' Copyright (C) 2024, WAFW00F Developers. See the LICENSE file for copying permission. ''' NAME = 'ChinaCache Load Balancer (ChinaCache)' def is_waf(self): if self.matchHeader(('Powered-By-ChinaCache', '.+')): return True return False ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������wafw00f-2.3.1/wafw00f/plugins/fortiweb.py�����������������������������������������������������������0000664�0001750�0001750�00000001573�14734711633�020042� 0����������������������������������������������������������������������������������������������������ustar �epsilon�������������������������epsilon����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/usr/bin/env python3 ''' Copyright (C) 2024, WAFW00F Developers. See the LICENSE file for copying permission. ''' NAME = 'FortiWeb (Fortinet)' def is_waf(self): if check_schema_01(self): return True if check_schema_02(self): return True return False def check_schema_01(self): if self.matchCookie(r'^FORTIWAFSID='): return True if self.matchContent('.fgd_icon'): return True return False def check_schema_02(self): if not self.matchContent('fgd_icon'): return False if not self.matchContent('web.page.blocked'): return False if not self.matchContent('url'): return False if not self.matchContent('attack.id'): return False if not self.matchContent('message.id'): return False if not self.matchContent('client.ip'): return False return True �������������������������������������������������������������������������������������������������������������������������������������wafw00f-2.3.1/wafw00f/plugins/webray.py�������������������������������������������������������������0000664�0001750�0001750�00000000537�14734711633�017511� 0����������������������������������������������������������������������������������������������������ustar �epsilon�������������������������epsilon����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/usr/bin/env python3 ''' Copyright (C) 2024, WAFW00F Developers. See the LICENSE file for copying permission. ''' NAME = 'RayWAF (WebRay Solutions)' def is_waf(self): if self.matchHeader(('Server', r'WebRay\-WAF')): return True if self.matchHeader(('DrivedBy', r'RaySrv.RayEng/[0-9\.]+?')): return True return False �����������������������������������������������������������������������������������������������������������������������������������������������������������������wafw00f-2.3.1/wafw00f/plugins/envoy.py��������������������������������������������������������������0000664�0001750�0001750�00000001741�14734711633�017356� 0����������������������������������������������������������������������������������������������������ustar �epsilon�������������������������epsilon����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/usr/bin/env python ''' Copyright (C) 2022, WAFW00F Developers. See the LICENSE file for copying permission. ''' NAME = 'Envoy (EnvoyProxy)' def is_waf(self): if self.matchHeader(('server', 'envoy')): return True if self.matchHeader(('x-envoy-upstream-service-time', '.+')): return True if self.matchHeader(('x-envoy-downstream-service-cluster', '.+')): return True if self.matchHeader(('x-envoy-downstream-service-node', '.+')): return True if self.matchHeader(('x-envoy-external-address', '.+')): return True if self.matchHeader(('x-envoy-force-trace', '.+')): return True if self.matchHeader(('x-envoy-internal', '.+')): return True if self.matchHeader(('x-envoy-original-dst-host', '.+')): return True if self.matchHeader(('x-envoy-original-path', '.+')): return True if self.matchHeader(('x-envoy-local-overloaded', '.+')): return True return False �������������������������������wafw00f-2.3.1/wafw00f/plugins/denyall.py������������������������������������������������������������0000664�0001750�0001750�00000000516�14734711633�017645� 0����������������������������������������������������������������������������������������������������ustar �epsilon�������������������������epsilon����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/usr/bin/env python3 ''' Copyright (C) 2024, WAFW00F Developers. See the LICENSE file for copying permission. ''' NAME = 'DenyALL (Rohde & Schwarz CyberSecurity)' def is_waf(self): if not self.matchStatus(200): return False if not self.matchReason('Condition Intercepted'): return False return True ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������wafw00f-2.3.1/wafw00f/plugins/qiniu.py��������������������������������������������������������������0000664�0001750�0001750�00000000375�14734711633�017345� 0����������������������������������������������������������������������������������������������������ustar �epsilon�������������������������epsilon����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/usr/bin/env python3 ''' Copyright (C) 2024, WAFW00F Developers. See the LICENSE file for copying permission. ''' NAME = 'Qiniu (Qiniu CDN)' def is_waf(self): if self.matchHeader(('X-Qiniu-CDN', r'\d+?')): return True return False �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������wafw00f-2.3.1/wafw00f/plugins/teros.py��������������������������������������������������������������0000664�0001750�0001750�00000000364�14734711633�017352� 0����������������������������������������������������������������������������������������������������ustar �epsilon�������������������������epsilon����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/usr/bin/env python3 ''' Copyright (C) 2024, WAFW00F Developers. See the LICENSE file for copying permission. ''' NAME = 'Teros (Citrix Systems)' def is_waf(self): if self.matchCookie(r'^st8id='): return True return False ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������wafw00f-2.3.1/wafw00f/plugins/webtotem.py�����������������������������������������������������������0000664�0001750�0001750�00000000432�14734711633�020040� 0����������������������������������������������������������������������������������������������������ustar �epsilon�������������������������epsilon����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/usr/bin/env python3 ''' Copyright (C) 2024, WAFW00F Developers. See the LICENSE file for copying permission. ''' NAME = 'WebTotem (WebTotem)' def is_waf(self): if self.matchContent(r"The current request was blocked.{0,8}?>WebTotem"): return True return False ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������wafw00f-2.3.1/wafw00f/plugins/fortigate.py����������������������������������������������������������0000664�0001750�0001750�00000001372�14734711633�020202� 0����������������������������������������������������������������������������������������������������ustar �epsilon�������������������������epsilon����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/usr/bin/env python3 ''' Copyright (C) 2023, WAFW00F Developers. See the LICENSE file for copying permission. ''' NAME = 'FortiGate (Fortinet)' def is_waf(self): if check_schema_01(self): return True if check_schema_02(self): return True return False def check_schema_01(self): if not self.matchContent('//globalurl.fortinet.net'): return False if not self.matchContent('FortiGate Application Control'): return False return True def check_schema_02(self): if not self.matchContent('Web Application Firewall'): return False if not self.matchContent('Event ID'): return False if not self.matchContent('//globalurl.fortinet.net'): return False return True ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������wafw00f-2.3.1/wafw00f/plugins/xuanwudun.py����������������������������������������������������������0000664�0001750�0001750�00000000577�14734711633�020262� 0����������������������������������������������������������������������������������������������������ustar �epsilon�������������������������epsilon����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/usr/bin/env python3 ''' Copyright (C) 2024, WAFW00F Developers. See the LICENSE file for copying permission. ''' NAME = 'Xuanwudun (Xuanwudun)' def is_waf(self): if self.matchContent(r"admin\.dbappwaf\.cn/(index\.php/Admin/ClientMisinform/)?"): return True if self.matchContent(r'class=.(db[\-_]?)?waf(.)?([\-_]?row)?>'): return True return False ���������������������������������������������������������������������������������������������������������������������������������wafw00f-2.3.1/wafw00f/plugins/awswaf.py�������������������������������������������������������������0000664�0001750�0001750�00000001135�14734711633�017503� 0����������������������������������������������������������������������������������������������������ustar �epsilon�������������������������epsilon����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/usr/bin/env python3 ''' Copyright (C) 2024, WAFW00F Developers. See the LICENSE file for copying permission. ''' NAME = 'AWS Elastic Load Balancer (Amazon)' def is_waf(self): if self.matchHeader(('X-AMZ-ID', '.+?')): return True if self.matchHeader(('X-AMZ-Request-ID', '.+?')): return True if self.matchCookie(r'^aws.?alb='): return True if self.matchHeader(('Server', r'aws.?elb'), attack=True): return True if self.matchHeader(('X-Blocked-By-WAF', 'Blocked_by_custom_response_for_AWSManagedRules.*')): return True return False �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������wafw00f-2.3.1/wafw00f/plugins/airlock.py������������������������������������������������������������0000664�0001750�0001750�00000000663�14734711633�017644� 0����������������������������������������������������������������������������������������������������ustar �epsilon�������������������������epsilon����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/usr/bin/env python3 ''' Copyright (C) 2024, WAFW00F Developers. See the LICENSE file for copying permission. ''' NAME = 'Airlock (Phion/Ergon)' def is_waf(self): # This method of detection is old (though most reliable), so we check it first if self.matchCookie(r'^al[_-]?(sess|lb)='): return True if self.matchContent(r'server detected a syntax error in your request'): return True return False �����������������������������������������������������������������������������wafw00f-2.3.1/wafw00f/plugins/nevisproxy.py���������������������������������������������������������0000664�0001750�0001750�00000000453�14734711633�020443� 0����������������������������������������������������������������������������������������������������ustar �epsilon�������������������������epsilon����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/usr/bin/env python3 ''' Copyright (C) 2024, WAFW00F Developers. See the LICENSE file for copying permission. ''' NAME = 'NevisProxy (AdNovum)' def is_waf(self): if self.matchCookie(r'^Navajo'): return True if self.matchCookie(r'^NP_ID'): return True return False ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������wafw00f-2.3.1/wafw00f/plugins/f5bigipapm.py���������������������������������������������������������0000664�0001750�0001750�00000001705�14734711633�020241� 0����������������������������������������������������������������������������������������������������ustar �epsilon�������������������������epsilon����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/usr/bin/env python3 ''' Copyright (C) 2024, WAFW00F Developers. See the LICENSE file for copying permission. ''' NAME = 'BIG-IP AP Manager (F5 Networks)' def is_waf(self): if check_schema_01(self): return True if check_schema_02(self): return True if check_schema_03(self): return True return False def check_schema_01(self): if not self.matchCookie('^LastMRH_Session'): return False if not self.matchCookie('^MRHSession'): return False return True def check_schema_02(self): if not self.matchCookie('^MRHSession'): return False if not self.matchHeader(('Server', r'Big([-_])?IP'), attack=True): return False return True def check_schema_03(self): if self.matchCookie('^F5_fullWT'): return True if self.matchCookie('^F5_fullWT'): return True if self.matchCookie('^F5_HT_shrinked'): return True return False �����������������������������������������������������������wafw00f-2.3.1/wafw00f/plugins/kona.py���������������������������������������������������������������0000664�0001750�0001750�00000000576�14734711633�017153� 0����������������������������������������������������������������������������������������������������ustar �epsilon�������������������������epsilon����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/usr/bin/env python3 #!/usr/bin/env python3 ''' Copyright (C) 2024, WAFW00F Developers. See the LICENSE file for copying permission. ''' NAME = 'Kona SiteDefender (Akamai)' def is_waf(self): if self.matchHeader(('Server', 'AkamaiGHost')): return True if self.matchHeader(('Server', 'AkamaiGHost'), attack=True) : return True return False ����������������������������������������������������������������������������������������������������������������������������������wafw00f-2.3.1/wafw00f/plugins/gcparmor.py�����������������������������������������������������������0000664�0001750�0001750�00000000416�14734711633�020026� 0����������������������������������������������������������������������������������������������������ustar �epsilon�������������������������epsilon����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/usr/bin/env python3 ''' Copyright (C) 2024, WAFW00F Developers. See the LICENSE file for copying permission. ''' NAME = 'Google Cloud App Armor (Google Cloud)' def is_waf(self): if self.matchHeader(('Via', '1.1 google')): return True return False ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������wafw00f-2.3.1/wafw00f/plugins/__init__.py�����������������������������������������������������������0000664�0001750�0001750�00000000000�14734711633�017740� 0����������������������������������������������������������������������������������������������������ustar �epsilon�������������������������epsilon����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������wafw00f-2.3.1/wafw00f/plugins/bulletproof.py��������������������������������������������������������0000664�0001750�0001750�00000000700�14734711633�020545� 0����������������������������������������������������������������������������������������������������ustar �epsilon�������������������������epsilon����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/usr/bin/env python3 ''' Copyright (C) 2024, WAFW00F Developers. See the LICENSE file for copying permission. ''' NAME = 'BulletProof Security Pro (AITpro Security)' def is_waf(self): if not self.matchContent(r'\+?bpsMessage'): return False if not self.matchContent(r'403 Forbidden Error Page'): return False if not self.matchContent(r'If you arrived here due to a search'): return False return True ����������������������������������������������������������������wafw00f-2.3.1/wafw00f/plugins/nemesida.py�����������������������������������������������������������0000664�0001750�0001750�00000000751�14734711633�020003� 0����������������������������������������������������������������������������������������������������ustar �epsilon�������������������������epsilon����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/usr/bin/env python3 ''' Copyright (C) 2024, WAFW00F Developers. See the LICENSE file for copying permission. ''' NAME = 'Nemesida (PentestIt)' def is_waf(self): if self.matchContent(r'@?nemesida(\-security)?\.com'): return True if self.matchContent(r'Suspicious activity detected.{0,10}?Access to the site is blocked'): return True if self.matchContent(r'nwaf@'): return True if self.matchStatus(222): return True return False �����������������������wafw00f-2.3.1/wafw00f/plugins/variti.py�������������������������������������������������������������0000664�0001750�0001750�00000000413�14734711633�017507� 0����������������������������������������������������������������������������������������������������ustar �epsilon�������������������������epsilon����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/usr/bin/env python3 ''' Copyright (C) 2024, WAFW00F Developers. See the LICENSE file for copying permission. ''' NAME = 'Variti (Variti)' def is_waf(self): if self.matchHeader(('Server', r'Variti(?:\/[a-z0-9\.\-]+)?')): return True return False �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������wafw00f-2.3.1/wafw00f/plugins/powercdn.py�����������������������������������������������������������0000664�0001750�0001750�00000000645�14734711633�020041� 0����������������������������������������������������������������������������������������������������ustar �epsilon�������������������������epsilon����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/usr/bin/env python3 ''' Copyright (C) 2024, WAFW00F Developers. See the LICENSE file for copying permission. ''' NAME = 'PowerCDN (PowerCDN)' def is_waf(self): if self.matchHeader(('Via', r'(.*)?powercdn.com(.*)?')): return True if self.matchHeader(('X-Cache', r'(.*)?powercdn.com(.*)?')): return True if self.matchHeader(('X-CDN', r'PowerCDN')): return True return False �������������������������������������������������������������������������������������������wafw00f-2.3.1/wafw00f/plugins/azion.py��������������������������������������������������������������0000664�0001750�0001750�00000000531�14734711633�017332� 0����������������������������������������������������������������������������������������������������ustar �epsilon�������������������������epsilon����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/usr/bin/env python3 ''' Copyright (C) 2024, WAFW00F Developers. See the LICENSE file for copying permission. ''' NAME = 'Azion Edge Firewall (Azion)' def is_waf(self): if self.matchHeader(('x-azion-edge-pop', r'.+?')): return True if self.matchHeader(('x-azion-request-id', r'.+?')): return True return False �����������������������������������������������������������������������������������������������������������������������������������������������������������������������wafw00f-2.3.1/wafw00f/plugins/wts.py����������������������������������������������������������������0000664�0001750�0001750�00000000511�14734711633�017025� 0����������������������������������������������������������������������������������������������������ustar �epsilon�������������������������epsilon����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/usr/bin/env python3 ''' Copyright (C) 2024, WAFW00F Developers. See the LICENSE file for copying permission. ''' NAME = 'WTS-WAF (WTS)' def is_waf(self): if self.matchHeader(('Server', r'wts/[0-9\.]+?')): return True if self.matchContent(r"<(title|h\d{1})>WTS\-WAF"): return True return False ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������wafw00f-2.3.1/wafw00f/plugins/approach.py�����������������������������������������������������������0000664�0001750�0001750�00000000711�14734711633�020007� 0����������������������������������������������������������������������������������������������������ustar �epsilon�������������������������epsilon����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/usr/bin/env python3 ''' Copyright (C) 2024, WAFW00F Developers. See the LICENSE file for copying permission. ''' NAME = 'Approach (Approach)' def is_waf(self): # This method of detection is old (though most reliable), so we check it first if self.matchContent(r'approach.{0,10}?web application (firewall|filtering)'): return True if self.matchContent(r'approach.{0,10}?infrastructure team'): return True return False �������������������������������������������������������wafw00f-2.3.1/wafw00f/plugins/openresty.py����������������������������������������������������������0000664�0001750�0001750�00000001224�14734711633�020242� 0����������������������������������������������������������������������������������������������������ustar �epsilon�������������������������epsilon����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/usr/bin/env python3 ''' Copyright (C) 2024, WAFW00F Developers. See the LICENSE file for copying permission. ''' NAME = 'Open-Resty Lua Nginx (FLOSS)' def is_waf(self): if check_schema_01(self): return True if check_schema_02(self): return True return False def check_schema_01(self): if not self.matchHeader(('Server', r'^openresty/[0-9\.]+?')): return False if not self.matchStatus(403): return False return True def check_schema_02(self): if not self.matchContent(r'openresty/[0-9\.]+?'): return False if not self.matchStatus(406): return False return True ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������wafw00f-2.3.1/wafw00f/plugins/securesphere.py�������������������������������������������������������0000664�0001750�0001750�00000001013�14734711633�020703� 0����������������������������������������������������������������������������������������������������ustar �epsilon�������������������������epsilon����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/usr/bin/env python3 ''' Copyright (C) 2024, WAFW00F Developers. See the LICENSE file for copying permission. ''' NAME = 'SecureSphere (Imperva Inc.)' def is_waf(self): if not self.matchContent(r'<(title|h2)>Error'): return False if not self.matchContent(r'The incident ID is'): return False if not self.matchContent(r"This page can't be displayed"): return False if not self.matchContent(r'Contact support for additional information'): return False return True ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������wafw00f-2.3.1/wafw00f/plugins/crawlprotect.py�������������������������������������������������������0000664�0001750�0001750�00000000647�14734711633�020733� 0����������������������������������������������������������������������������������������������������ustar �epsilon�������������������������epsilon����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/usr/bin/env python3 ''' Copyright (C) 2024, WAFW00F Developers. See the LICENSE file for copying permission. ''' NAME = 'CrawlProtect (Jean-Denis Brun)' def is_waf(self): if self.matchCookie(r'^crawlprotecttag='): return True if self.matchContent(r'<title>crawlprotect'): return True if self.matchContent(r'this site is protected by crawlprotect'): return True return False �����������������������������������������������������������������������������������������wafw00f-2.3.1/wafw00f/plugins/cerber.py�������������������������������������������������������������0000664�0001750�0001750�00000001256�14734711633�017461� 0����������������������������������������������������������������������������������������������������ustar �epsilon�������������������������epsilon����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/usr/bin/env python3 ''' Copyright (C) 2024, WAFW00F Developers. See the LICENSE file for copying permission. ''' NAME = 'WP Cerber Security (Cerber Tech)' def is_waf(self): if not self.matchContent(r'your request looks suspicious or similar to automated'): return False if not self.matchContent(r'our server stopped processing your request'): return False if not self.matchContent(r'We.re sorry.{0,10}?you are not allowed to proceed'): return False if not self.matchContent(r'requests from spam posting software'): return False if not self.matchContent(r'<title>403 Access Forbidden'): return False return True ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������wafw00f-2.3.1/wafw00f/plugins/siteguard.py����������������������������������������������������������0000664�0001750�0001750�00000000533�14734711633�020203� 0����������������������������������������������������������������������������������������������������ustar �epsilon�������������������������epsilon����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/usr/bin/env python3 ''' Copyright (C) 2024, WAFW00F Developers. See the LICENSE file for copying permission. ''' NAME = 'SiteGuard (Sakura Inc.)' def is_waf(self): if self.matchContent(r"Powered by SiteGuard"): return True if self.matchContent(r'The server refuse to browse the page'): return True return False ���������������������������������������������������������������������������������������������������������������������������������������������������������������������wafw00f-2.3.1/wafw00f/plugins/senginx.py������������������������������������������������������������0000664�0001750�0001750�00000000403�14734711633�017663� 0����������������������������������������������������������������������������������������������������ustar �epsilon�������������������������epsilon����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/usr/bin/env python3 ''' Copyright (C) 2024, WAFW00F Developers. See the LICENSE file for copying permission. ''' NAME = 'SEnginx (Neusoft)' def is_waf(self): if self.matchContent(r'SENGINX\-ROBOT\-MITIGATION'): return True return False �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������wafw00f-2.3.1/wafw00f/plugins/secureentry.py��������������������������������������������������������0000664�0001750�0001750�00000000435�14734711633�020565� 0����������������������������������������������������������������������������������������������������ustar �epsilon�������������������������epsilon����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/usr/bin/env python3 ''' Copyright (C) 2024, WAFW00F Developers. See the LICENSE file for copying permission. ''' NAME = 'Secure Entry (United Security Providers)' def is_waf(self): if self.matchHeader(('Server', 'Secure Entry Server')): return True return False �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������wafw00f-2.3.1/wafw00f/plugins/wzb360.py�������������������������������������������������������������0000664�0001750�0001750�00000001136�14734711633�017247� 0����������������������������������������������������������������������������������������������������ustar �epsilon�������������������������epsilon����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/usr/bin/env python3 ''' Copyright (C) 2024, WAFW00F Developers. See the LICENSE file for copying permission. ''' NAME = '360WangZhanBao (360 Technologies)' def is_waf(self): if self.matchHeader(('Server', r'qianxin\-waf')): return True if self.matchHeader(('WZWS-Ray', r'.+?')): return True if self.matchHeader(('X-Powered-By-360WZB', r'.+?')): return True if self.matchContent(r'wzws\-waf\-cgi/'): return True if self.matchContent(r'wangshan\.360\.cn'): return True if self.matchStatus(493): return True return False ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������wafw00f-2.3.1/wafw00f/plugins/paloalto.py�����������������������������������������������������������0000664�0001750�0001750�00000000610�14734711633�020023� 0����������������������������������������������������������������������������������������������������ustar �epsilon�������������������������epsilon����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/usr/bin/env python3 ''' Copyright (C) 2024, WAFW00F Developers. See the LICENSE file for copying permission. ''' NAME = 'Palo Alto Next Gen Firewall (Palo Alto Networks)' def is_waf(self): if self.matchContent(r'Download of virus.spyware blocked'): return True if self.matchContent(r'Palo Alto Next Generation Security Platform'): return True return False ������������������������������������������������������������������������������������������������������������������������wafw00f-2.3.1/wafw00f/plugins/onmessage.py����������������������������������������������������������0000664�0001750�0001750�00000001115�14734711633�020172� 0����������������������������������������������������������������������������������������������������ustar �epsilon�������������������������epsilon����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/usr/bin/env python3 ''' Copyright (C) 2024, WAFW00F Developers. See the LICENSE file for copying permission. ''' NAME = 'OnMessage Shield (BlackBaud)' def is_waf(self): if self.matchHeader(('X-Engine', 'onMessage Shield')): return True if self.matchContent(r'Blackbaud K\-12 conducts routine maintenance'): return True if self.matchContent(r'onMessage SHEILD'): return True if self.matchContent(r'maintenance\.blackbaud\.com'): return True if self.matchContent(r'status\.blackbaud\.com'): return True return False ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������wafw00f-2.3.1/wafw00f/plugins/cachewall.py����������������������������������������������������������0000664�0001750�0001750�00000001272�14734711633�020140� 0����������������������������������������������������������������������������������������������������ustar �epsilon�������������������������epsilon����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/usr/bin/env python3 ''' Copyright (C) 2024, WAFW00F Developers. See the LICENSE file for copying permission. ''' NAME = 'CacheWall (Varnish)' def is_waf(self): if self.matchHeader(('Server', 'Varnish')): return True if self.matchHeader(('X-Varnish', '.+')): return True if self.matchHeader(('X-Cachewall-Action', '.+?')): return True if self.matchHeader(('X-Cachewall-Reason', '.+?')): return True if self.matchContent(r'security by cachewall'): return True if self.matchContent(r'403 naughty.{0,10}?not nice!'): return True if self.matchContent(r'varnish cache server'): return True return False ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������wafw00f-2.3.1/wafw00f/plugins/expressionengine.py���������������������������������������������������0000664�0001750�0001750�00000001510�14734711633�021575� 0����������������������������������������������������������������������������������������������������ustar �epsilon�������������������������epsilon����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/usr/bin/env python3 ''' Copyright (C) 2024, WAFW00F Developers. See the LICENSE file for copying permission. ''' NAME = 'Expression Engine (EllisLab)' def is_waf(self): # I have seen some sites use a tracking header and sets a cookie upon authentication # 'Set-Cookie: _exp_tracking=rufyhweiuitefgcxyniercyft5-6dctuxeygfr' if self.matchCookie(r'^exp_track.+?='): return True # There are traces found where cookie is returning values like: # Set-Cookie: exp_last_query=834y8d73y94d8g983u4shn8u4shr3uh3 # Set-Cookie: exp_last_id=b342b432b1a876r8 if self.matchCookie(r'^exp_last_.+?=', attack=True): return True # In-page fingerprints vary a lot in different sites. Hence these are not quite reliable. if self.matchContent(r'invalid get data'): return True return False ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������wafw00f-2.3.1/wafw00f/plugins/baidu.py��������������������������������������������������������������0000664�0001750�0001750�00000000662�14734711633�017303� 0����������������������������������������������������������������������������������������������������ustar �epsilon�������������������������epsilon����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/usr/bin/env python3 ''' Copyright (C) 2024, WAFW00F Developers. See the LICENSE file for copying permission. ''' NAME = 'Yunjiasu (Baidu Cloud Computing)' def is_waf(self): if self.matchHeader(('Server', r'yunjiasu.*')): return True if self.matchContent(r'href="/.well-known/yunjiasu-cgi/'): return True if self.matchContent(r"document.cookie='yjs_use_ob=0"): return True return False ������������������������������������������������������������������������������wafw00f-2.3.1/wafw00f/plugins/limelight.py����������������������������������������������������������0000664�0001750�0001750�00000000473�14734711633�020175� 0����������������������������������������������������������������������������������������������������ustar �epsilon�������������������������epsilon����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/usr/bin/env python3 ''' Copyright (C) 2024, WAFW00F Developers. See the LICENSE file for copying permission. ''' NAME = 'LimeLight CDN (LimeLight)' def is_waf(self): if self.matchCookie(r'^limelight'): return True if self.matchCookie(r'^l[mg]_sessid='): return True return False �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������wafw00f-2.3.1/wafw00f/plugins/binarysec.py����������������������������������������������������������0000664�0001750�0001750�00000000626�14734711633�020176� 0����������������������������������������������������������������������������������������������������ustar �epsilon�������������������������epsilon����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/usr/bin/env python3 ''' Copyright (C) 2024, WAFW00F Developers. See the LICENSE file for copying permission. ''' NAME = 'BinarySec (BinarySec)' def is_waf(self): if self.matchHeader(('Server', 'BinarySec')): return True if self.matchHeader(('x-binarysec-via', '.+')): return True if self.matchHeader(('x-binarysec-nocache', '.+')): return True return False ����������������������������������������������������������������������������������������������������������wafw00f-2.3.1/wafw00f/plugins/shieldon.py�����������������������������������������������������������0000664�0001750�0001750�00000002444�14734711633�020024� 0����������������������������������������������������������������������������������������������������ustar �epsilon�������������������������epsilon����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/usr/bin/env python3 ''' Copyright (C) 2021, WAFW00F Developers. See the LICENSE file for copying permission. ''' NAME = 'Shieldon Firewall (Shieldon.io)' def is_waf(self): if check_schema_01(self): return True if check_schema_02(self): return True if check_schema_03(self): return True if self.matchHeader((r'[Xx]-[Pp]rotected-[Bb]y', 'shieldon.io')): return True return False def check_schema_01(self): if not self.matchContent('Please solve CAPTCHA'): return False if not self.matchContent('shieldon_captcha'): return False if not self.matchContent('Unusual behavior detected'): return False if not self.matchContent('status-user-info'): return False return True def check_schema_02(self): if not self.matchContent('Access denied'): return False if not self.matchContent('The IP address you are using has been blocked.'): return False if not self.matchContent('status-user-info'): return False return True def check_schema_03(self): if not self.matchContent('Please line up'): return False if not self.matchContent('This page is limiting the number of people online. Please wait a moment.'): return False return True ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������wafw00f-2.3.1/wafw00f/plugins/secureiis.py����������������������������������������������������������0000664�0001750�0001750�00000000720�14734711633�020205� 0����������������������������������������������������������������������������������������������������ustar �epsilon�������������������������epsilon����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/usr/bin/env python3 ''' Copyright (C) 2024, WAFW00F Developers. See the LICENSE file for copying permission. ''' NAME = 'eEye SecureIIS (BeyondTrust)' def is_waf(self): if self.matchContent(r'SecureIIS is an internet security application'): return True if self.matchContent(r'Download SecureIIS Personal Edition'): return True if self.matchContent(r'https?://www\.eeye\.com/Secure\-?IIS'): return True return False ������������������������������������������������wafw00f-2.3.1/wafw00f/plugins/shadowd.py������������������������������������������������������������0000664�0001750�0001750�00000000564�14734711633�017651� 0����������������������������������������������������������������������������������������������������ustar �epsilon�������������������������epsilon����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/usr/bin/env python3 ''' Copyright (C) 2024, WAFW00F Developers. See the LICENSE file for copying permission. ''' NAME = 'Shadow Daemon (Zecure)' def is_waf(self): if not self.matchContent(r"<h\d{1}>\d{3}.forbidden<.h\d{1}>"): return False if not self.matchContent(r"request forbidden by administrative rules"): return False return True ��������������������������������������������������������������������������������������������������������������������������������������������wafw00f-2.3.1/wafw00f/plugins/dotdefender.py��������������������������������������������������������0000664�0001750�0001750�00000000752�14734711633�020502� 0����������������������������������������������������������������������������������������������������ustar �epsilon�������������������������epsilon����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/usr/bin/env python3 ''' Copyright (C) 2024, WAFW00F Developers. See the LICENSE file for copying permission. ''' NAME = 'DotDefender (Applicure Technologies)' def is_waf(self): if self.matchHeader(('X-dotDefender-denied', r'.+?'), attack=True): return True if self.matchContent(r'dotdefender blocked your request'): return True if self.matchContent(r'Applicure is the leading provider of web application security'): return True return False ����������������������wafw00f-2.3.1/wafw00f/plugins/webseal.py������������������������������������������������������������0000664�0001750�0001750�00000000672�14734711633�017642� 0����������������������������������������������������������������������������������������������������ustar �epsilon�������������������������epsilon����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/usr/bin/env python3 ''' Copyright (C) 2024, WAFW00F Developers. See the LICENSE file for copying permission. ''' NAME = 'WebSEAL (IBM)' def is_waf(self): if self.matchHeader(('Server', 'WebSEAL')): return True if self.matchContent(r"This is a WebSEAL error message template file"): return True if self.matchContent(r"WebSEAL server received an invalid HTTP request"): return True return False ����������������������������������������������������������������������wafw00f-2.3.1/wafw00f/plugins/modsecurity.py��������������������������������������������������������0000664�0001750�0001750�00000002437�14734711633�020570� 0����������������������������������������������������������������������������������������������������ustar �epsilon�������������������������epsilon����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/usr/bin/env python3 ''' Copyright (C) 2024, WAFW00F Developers. See the LICENSE file for copying permission. ''' NAME = 'ModSecurity (SpiderLabs)' def is_waf(self): if check_schema_01(self): return True if check_schema_02(self): return True if check_schema_03(self): return True return False def check_schema_01(self): if self.matchHeader(('Server', r'(mod_security|Mod_Security|NOYB)')): return True if self.matchContent(r'This error was generated by Mod.?Security'): return True if self.matchContent(r'rules of the mod.security.module'): return True if self.matchContent(r'mod.security.rules triggered'): return True if self.matchContent(r'Protected by Mod.?Security'): return True if self.matchContent(r'/modsecurity[\-_]errorpage/'): return True if self.matchContent(r'modsecurity iis'): return True return False def check_schema_02(self): if not self.matchReason('ModSecurity Action'): return False if not self.matchStatus(403): return False return True def check_schema_03(self): if not self.matchReason('ModSecurity Action'): return False if not self.matchStatus(406): return False return True ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������wafw00f-2.3.1/wafw00f/plugins/missioncontrol.py�����������������������������������������������������0000664�0001750�0001750�00000000454�14734711633�021300� 0����������������������������������������������������������������������������������������������������ustar �epsilon�������������������������epsilon����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/usr/bin/env python3 ''' Copyright (C) 2024, WAFW00F Developers. See the LICENSE file for copying permission. ''' NAME = 'Mission Control Shield (Mission Control)' def is_waf(self): if self.matchHeader(('Server', 'Mission Control Application Shield')): return True return False ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������wafw00f-2.3.1/wafw00f/plugins/wordfence.py����������������������������������������������������������0000664�0001750�0001750�00000000775�14734711633�020200� 0����������������������������������������������������������������������������������������������������ustar �epsilon�������������������������epsilon����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/usr/bin/env python3 ''' Copyright (C) 2024, WAFW00F Developers. See the LICENSE file for copying permission. ''' NAME = 'Wordfence (Defiant)' def is_waf(self): if self.matchHeader(('Server', r'wf[_\-]?WAF')): return True if self.matchContent(r"Generated by Wordfence"): return True if self.matchContent(r'broke one of (the )?Wordfence (advanced )?blocking rules'): return True if self.matchContent(r"/plugins/wordfence"): return True return False ���wafw00f-2.3.1/wafw00f/plugins/beluga.py�������������������������������������������������������������0000664�0001750�0001750�00000000505�14734711633�017452� 0����������������������������������������������������������������������������������������������������ustar �epsilon�������������������������epsilon����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/usr/bin/env python3 ''' Copyright (C) 2024, WAFW00F Developers. See the LICENSE file for copying permission. ''' NAME = 'Beluga CDN (Beluga)' def is_waf(self): if self.matchHeader(('Server', r'Beluga')): return True if self.matchCookie(r'^beluga_request_trail='): return True return False �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������wafw00f-2.3.1/wafw00f/plugins/stackpath.py����������������������������������������������������������0000664�0001750�0001750�00000001471�14734711633�020200� 0����������������������������������������������������������������������������������������������������ustar �epsilon�������������������������epsilon����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/usr/bin/env python3 ''' Copyright (C) 2024, WAFW00F Developers. See the LICENSE file for copying permission. ''' NAME = 'StackPath (StackPath)' def is_waf(self): if check_schema_01(self): return True if check_schema_02(self): return True return False def check_schema_01(self): if self.matchContent(r'<title>StackPath[^<]+'): return True if self.matchContent(r'Protected by ]+>StackPath'): return True return False def check_schema_02(self): if not self.matchContent(r"is using a security service for protection against online attacks"): return False if not self.matchContent(r'An action has triggered the service and blocked your request'): return False return True wafw00f-2.3.1/wafw00f/plugins/nexusguard.py0000664000175000017500000000054214734711633020401 0ustar epsilonepsilon#!/usr/bin/env python3 ''' Copyright (C) 2024, WAFW00F Developers. See the LICENSE file for copying permission. ''' NAME = 'NexusGuard Firewall (NexusGuard)' def is_waf(self): if self.matchContent(r'Powered by Nexusguard'): return True if self.matchContent(r'nexusguard\.com/wafpage/.+#\d{3};'): return True return False wafw00f-2.3.1/wafw00f/plugins/litespeed.py0000664000175000017500000000127514734711633020176 0ustar epsilonepsilon#!/usr/bin/env python3 ''' Copyright (C) 2024, WAFW00F Developers. See the LICENSE file for copying permission. ''' NAME = 'LiteSpeed (LiteSpeed Technologies)' def is_waf(self): if check_schema_01(self): return True if check_schema_02(self): return True return False def check_schema_01(self): if not self.matchHeader(('Server', 'LiteSpeed')): return False if not self.matchStatus(403): return False return True def check_schema_02(self): if self.matchContent(r'Proudly powered by litespeed web server'): return True if self.matchContent(r'www\.litespeedtech\.com/error\-page'): return True return False wafw00f-2.3.1/wafw00f/plugins/alertlogic.py0000664000175000017500000000117614734711633020345 0ustar epsilonepsilon#!/usr/bin/env python3 ''' Copyright (C) 2024, WAFW00F Developers. See the LICENSE file for copying permission. ''' NAME = 'Alert Logic (Alert Logic)' def is_waf(self): if not self.matchContent(r'<(title|h\d{1})>requested url cannot be found'): return False if not self.matchContent(r'we are sorry.{0,10}?but the page you are looking for cannot be found'): return False if not self.matchContent(r'back to previous page'): return False if not self.matchContent(r'proceed to homepage'): return False if not self.matchContent(r'reference id'): return False return True wafw00f-2.3.1/wafw00f/plugins/godaddy.py0000664000175000017500000000043714734711633017632 0ustar epsilonepsilon#!/usr/bin/env python3 ''' Copyright (C) 2024, WAFW00F Developers. See the LICENSE file for copying permission. ''' NAME = 'GoDaddy Website Protection (GoDaddy)' def is_waf(self): if self.matchContent(r'GoDaddy (security|website firewall)'): return True return False wafw00f-2.3.1/wafw00f/plugins/ddosguard.py0000664000175000017500000000100514734711633020163 0ustar epsilonepsilon#!/usr/bin/env python3 ''' Copyright (C) 2024, WAFW00F Developers. See the LICENSE file for copying permission. ''' NAME = 'DDoS-GUARD (DDOS-GUARD CORP.)' def is_waf(self): if self.matchCookie(r'^__ddg1.*?='): return True if self.matchCookie(r'^__ddg2.*?='): return True if self.matchCookie(r'^__ddgid.*?='): return True if self.matchCookie(r'^__ddgmark.*?='): return True if self.matchHeader(('Server', 'ddos-guard')): return True return False wafw00f-2.3.1/wafw00f/plugins/rsfirewall.py0000664000175000017500000000042514734711633020366 0ustar epsilonepsilon#!/usr/bin/env python3 ''' Copyright (C) 2024, WAFW00F Developers. See the LICENSE file for copying permission. ''' NAME = 'RSFirewall (RSJoomla!)' def is_waf(self): if self.matchContent(r'com_rsfirewall_(\d{3}_forbidden|event)?'): return True return False wafw00f-2.3.1/wafw00f/plugins/reblaze.py0000664000175000017500000000141114734711633017634 0ustar epsilonepsilon#!/usr/bin/env python3 ''' Copyright (C) 2024, WAFW00F Developers. See the LICENSE file for copying permission. ''' NAME = 'Reblaze (Reblaze)' def is_waf(self): if check_schema_01(self): return True if check_schema_02(self): return True return False def check_schema_01(self): if self.matchCookie(r'^rbzid'): return True if self.matchHeader(('Server', 'Reblaze Secure Web Gateway')): return True return False def check_schema_02(self): if not self.matchContent(r'current session has been terminated'): return False if not self.matchContent(r'do not hesitate to contact us'): return False if not self.matchContent(r'access denied \(\d{3}\)'): return False return True wafw00f-2.3.1/wafw00f/plugins/netscaler.py0000664000175000017500000000176214734711633020201 0ustar epsilonepsilon#!/usr/bin/env python3 ''' Copyright (C) 2024, WAFW00F Developers. See the LICENSE file for copying permission. ''' NAME = 'NetScaler AppFirewall (Citrix Systems)' def is_waf(self): # This header can be obtained without attack mode if self.matchHeader(('Via', r'NS\-CACHE')): return True # Cookies are set only when someone is authenticated. # Not much reliable since wafw00f isn't authenticating. if self.matchCookie(r'^(ns_af=|citrix_ns_id|NSC_)'): return True if self.matchContent(r'(NS Transaction|AppFW Session) id'): return True if self.matchContent(r'Violation Category.{0,5}?APPFW_'): return True if self.matchContent(r'Citrix\|NetScaler'): return True # Reliable but not all servers return this header if self.matchHeader(('Cneonction', r'^(keep alive|close)'), attack=True): return True if self.matchHeader(('nnCoection', r'^(keep alive|close)'), attack=True): return True return False wafw00f-2.3.1/wafw00f/plugins/yxlink.py0000664000175000017500000000062314734711633017532 0ustar epsilonepsilon#!/usr/bin/env python3 ''' Copyright (C) 2024, WAFW00F Developers. See the LICENSE file for copying permission. ''' NAME = 'YXLink (YxLink Technologies)' def is_waf(self): if self.matchCookie(r'^yx_ci_session='): return True if self.matchCookie(r'^yx_language='): return True if self.matchHeader(('Server', r'Yxlink([\-_]?WAF)?')): return True return False wafw00f-2.3.1/wafw00f/plugins/eisoo.py0000664000175000017500000000100414734711633017324 0ustar epsilonepsilon#!/usr/bin/env python3 ''' Copyright (C) 2024, WAFW00F Developers. See the LICENSE file for copying permission. ''' NAME = 'Eisoo Cloud Firewall (Eisoo)' def is_waf(self): if self.matchHeader(('Server', r'EisooWAF(\-AZURE)?/?')): return True if self.matchContent(r'fw_error_www'): return True if self.matchContent(r'src=\"/oralogo_small\.gif\"'): return True if self.matchContent(r'www\.oracleimg\.com/us/assets/metrics/ora_ocom\.js'): return True return False wafw00f-2.3.1/wafw00f/plugins/urlscan.py0000664000175000017500000000054714734711633017670 0ustar epsilonepsilon#!/usr/bin/env python3 ''' Copyright (C) 2024, WAFW00F Developers. See the LICENSE file for copying permission. ''' NAME = 'URLScan (Microsoft)' def is_waf(self): if self.matchContent(r"Rejected[-_]By[_-]UrlScan"): return True if self.matchContent(r'A custom filter or module.{0,4}?such as URLScan'): return True return False wafw00f-2.3.1/wafw00f/plugins/sitelock.py0000664000175000017500000000125614734711633020034 0ustar epsilonepsilon#!/usr/bin/env python3 ''' Copyright (C) 2024, WAFW00F Developers. See the LICENSE file for copying permission. ''' NAME = 'Sitelock (TrueShield)' # Well this is confusing, Sitelock itself uses Incapsula from Imperva # So the fingerprints obtained on blockpage are similar to those of Incapsula. def is_waf(self): if self.matchContent(r"SiteLock will remember you"): return True if self.matchContent(r"Sitelock is leader in Business Website Security Services"): return True if self.matchContent(r"sitelock[_\-]shield([_\-]logo|[\-_]badge)?"): return True if self.matchContent(r'SiteLock incident ID'): return True return False wafw00f-2.3.1/wafw00f/plugins/jiasule.py0000664000175000017500000000101514734711633017644 0ustar epsilonepsilon#!/usr/bin/env python3 ''' Copyright (C) 2024, WAFW00F Developers. See the LICENSE file for copying permission. ''' NAME = 'Jiasule (Jiasule)' def is_waf(self): if self.matchHeader(('Server', r'jiasule\-waf')): return True if self.matchCookie(r'^jsl_tracking(.+)?='): return True if self.matchCookie(r'__jsluid='): return True if self.matchContent(r'notice\-jiasule'): return True if self.matchContent(r'static\.jiasule\.com'): return True return False wafw00f-2.3.1/wafw00f/plugins/siteground.py0000664000175000017500000000056514734711633020404 0ustar epsilonepsilon#!/usr/bin/env python3 ''' Copyright (C) 2024, WAFW00F Developers. See the LICENSE file for copying permission. ''' NAME = 'SiteGround (SiteGround)' def is_waf(self): if self.matchContent(r"Our system thinks you might be a robot!"): return True if self.matchContent(r'access is restricted due to a security rule'): return True return False wafw00f-2.3.1/wafw00f/plugins/sucuri.py0000664000175000017500000000172614734711633017533 0ustar epsilonepsilon#!/usr/bin/env python3 ''' Copyright (C) 2024, WAFW00F Developers. See the LICENSE file for copying permission. ''' NAME = 'Sucuri CloudProxy (Sucuri Inc.)' def is_waf(self): if self.matchHeader(('X-Sucuri-ID', r'.+?')): return True if self.matchHeader(('X-Sucuri-Cache', r'.+?')): return True if self.matchHeader(('Server', r'Sucuri(\-Cloudproxy)?')): return True if self.matchHeader(('X-Sucuri-Block', r'.+?'), attack=True): return True if self.matchContent(r"Access Denied.{0,6}?Sucuri Website Firewall"): return True if self.matchContent(r"Sucuri WebSite Firewall.{0,6}?(CloudProxy)?.{0,6}?Access Denied"): return True if self.matchContent(r"sucuri\.net/privacy\-policy"): return True if self.matchContent(r"cdn\.sucuri\.net/sucuri[-_]firewall[-_]block\.css"): return True if self.matchContent(r'cloudproxy@sucuri\.net'): return True return False ������������������������������������������wafw00f-2.3.1/wafw00f/plugins/wpmudev.py������������������������������������������������������������0000664�0001750�0001750�00000002034�14734711633�017701� 0����������������������������������������������������������������������������������������������������ustar �epsilon�������������������������epsilon����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/usr/bin/env python3 ''' Copyright (C) 2024, WAFW00F Developers. See the LICENSE file for copying permission. ''' NAME = 'wpmudev WAF (Incsub)' def is_waf(self): if check_schema_01(self): return True if check_schema_02(self): return True return False def check_schema_01(self): if not self.matchContent(r'href="http(s)?.\/\/wpmudev.com\/.{0,15}?'): return False if not self.matchContent(r'Click on the Logs tab, then the WAF Log.'): return False if not self.matchContent(r'Choose your site from the list'): return False if not self.matchStatus(403): return False return True def check_schema_02(self): if not self.matchContent(r'<h1>Whoops, this request has been blocked!'): return False if not self.matchContent(r'This request has been deemed suspicious'): return False if not self.matchContent(r'possible attack on our servers.'): return False if not self.matchStatus(403): return False return True ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������wafw00f-2.3.1/wafw00f/plugins/barikode.py�����������������������������������������������������������0000664�0001750�0001750�00000000407�14734711633�017774� 0����������������������������������������������������������������������������������������������������ustar �epsilon�������������������������epsilon����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/usr/bin/env python3 ''' Copyright (C) 2024, WAFW00F Developers. See the LICENSE file for copying permission. ''' NAME = 'Barikode (Ethic Ninja)' def is_waf(self): if self.matchContent(r'<strong>barikode<.strong>'): return True return False ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������wafw00f-2.3.1/wafw00f/plugins/cloudprotector.py�����������������������������������������������������0000664�0001750�0001750�00000000676�14734711633�021274� 0����������������������������������������������������������������������������������������������������ustar �epsilon�������������������������epsilon����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/usr/bin/env python3 ''' Copyright (C) 2024, WAFW00F Developers. See the LICENSE file for copying permission. ''' NAME = 'Cloud Protector (Rohde & Schwarz CyberSecurity)' def is_waf(self): if self.matchContent(r'Cloud Protector.*?by Rohde.{3,8}?Schwarz Cybersecurity'): return True if self.matchContent(r"<a href='https?:\/\/(?:www\.)?cloudprotector\.com\/'>R.{1,6}?S.Cloud Protector"): return True return False ������������������������������������������������������������������wafw00f-2.3.1/wafw00f/plugins/nsfocus.py������������������������������������������������������������0000664�0001750�0001750�00000000406�14734711633�017673� 0����������������������������������������������������������������������������������������������������ustar �epsilon�������������������������epsilon����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/usr/bin/env python3 ''' Copyright (C) 2024, WAFW00F Developers. See the LICENSE file for copying permission. ''' NAME = 'NSFocus (NSFocus Global Inc.)' def is_waf(self): if self.matchHeader(('Server', 'NSFocus')): return True return False ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������wafw00f-2.3.1/wafw00f/plugins/viettel.py������������������������������������������������������������0000664�0001750�0001750�00000000633�14734711633�017671� 0����������������������������������������������������������������������������������������������������ustar �epsilon�������������������������epsilon����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/usr/bin/env python3 ''' Copyright (C) 2024, WAFW00F Developers. See the LICENSE file for copying permission. ''' NAME = 'Viettel (Cloudrity)' def is_waf(self): if self.matchContent(r"Access Denied.{0,10}?Viettel WAF"): return True if self.matchContent(r"cloudrity\.com\.(vn)?/"): return True if self.matchContent(r"Viettel WAF System"): return True return False �����������������������������������������������������������������������������������������������������wafw00f-2.3.1/wafw00f/plugins/kemp.py���������������������������������������������������������������0000664�0001750�0001750�00000000565�14734711633�017155� 0����������������������������������������������������������������������������������������������������ustar �epsilon�������������������������epsilon����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/usr/bin/env python3 ''' Copyright (C) 2024, WAFW00F Developers. See the LICENSE file for copying permission. ''' NAME = 'Kemp LoadMaster (Progress Software)' def is_waf(self): if self.matchHeader(('X-ServedBy', 'KEMP-LM')) and \ self.matchStatus(403) and \ self.matchContent(r'<title>403 Forbidden'): return True return False wafw00f-2.3.1/wafw00f/plugins/xlabssecuritywaf.py0000664000175000017500000000066714734711633021623 0ustar epsilonepsilon#!/usr/bin/env python3 ''' Copyright (C) 2024, WAFW00F Developers. See the LICENSE file for copying permission. ''' NAME = 'XLabs Security WAF (XLabs)' def is_waf(self): if self.matchHeader(('X-CDN', r'XLabs Security')): return True if self.matchHeader(('Secured', r'^By XLabs Security')): return True if self.matchHeader(('Server', r'XLabs[-_]?.?WAF'), attack=True): return True return False wafw00f-2.3.1/wafw00f/plugins/secupress.py0000664000175000017500000000042214734711633020225 0ustar epsilonepsilon#!/usr/bin/env python3 ''' Copyright (C) 2024, WAFW00F Developers. See the LICENSE file for copying permission. ''' NAME = 'SecuPress WP Security (SecuPress)' def is_waf(self): if self.matchContent(r'<(title|h\d{1})>SecuPress'): return True return False wafw00f-2.3.1/wafw00f/plugins/watchguard.py0000664000175000017500000000067214734711633020351 0ustar epsilonepsilon#!/usr/bin/env python3 ''' Copyright (C) 2024, WAFW00F Developers. See the LICENSE file for copying permission. ''' NAME = 'WatchGuard (WatchGuard Technologies)' def is_waf(self): if self.matchHeader(('Server', 'WatchGuard')): return True if self.matchContent(r"Request denied by WatchGuard Firewall"): return True if self.matchContent(r'WatchGuard Technologies Inc\.'): return True return False wafw00f-2.3.1/wafw00f/plugins/pksec.py0000664000175000017500000000152714734711633017325 0ustar epsilonepsilon#!/usr/bin/env python3 ''' Copyright (C) 2024, WAFW00F Developers. See the LICENSE file for copying permission. ''' NAME = 'pkSecurity IDS (pkSec)' def is_waf(self): if check_schema_01(self): return True if check_schema_02(self): return True return False def check_schema_01(self): if self.matchContent(r'pk.?Security.?Module'): return True if self.matchContent(r'Security.Alert'): return True return False def check_schema_02(self): if not self.matchContent(r'As this could be a potential hack attack'): return False if not self.matchContent(r'A safety critical (call|request) was (detected|discovered) and blocked'): return False if not self.matchContent(r'maximum number of reloads per minute and prevented access'): return False return True wafw00f-2.3.1/wafw00f/plugins/barracuda.py0000664000175000017500000000104314734711633020135 0ustar epsilonepsilon#!/usr/bin/env python3 ''' Copyright (C) 2024, WAFW00F Developers. See the LICENSE file for copying permission. ''' NAME = 'Barracuda (Barracuda Networks)' def is_waf(self): if self.matchCookie(r'^barra_counter_session='): return True if self.matchCookie(r'^BNI__BARRACUDA_LB_COOKIE='): return True if self.matchCookie(r'^BNI_persistence='): return True if self.matchCookie(r'^BN[IE]S_.*?='): return True if self.matchContent(r'Barracuda.Networks'): return True return False wafw00f-2.3.1/wafw00f/plugins/applicationgateway.py0000664000175000017500000000055614734711633022106 0ustar epsilonepsilon#!/usr/bin/env python ''' Copyright (C) 2024, WAFW00F Developers. See the LICENSE file for copying permission. ''' NAME = 'Azure Application Gateway (Microsoft)' def is_waf(self): if self.matchContent(r'
Microsoft-Azure-Application-Gateway/v2
') and \ self.matchContent(r'

403 Forbidden

'): return True return False wafw00f-2.3.1/wafw00f/plugins/ibmdatapower.py0000664000175000017500000000041114734711633020665 0ustar epsilonepsilon#!/usr/bin/env python3 ''' Copyright (C) 2024, WAFW00F Developers. See the LICENSE file for copying permission. ''' NAME = 'DataPower (IBM)' def is_waf(self): if self.matchHeader(('X-Backside-Transport', r'(OK|FAIL)')): return True return False wafw00f-2.3.1/wafw00f/plugins/cloudfloordns.py0000664000175000017500000000073314734711633021073 0ustar epsilonepsilon#!/usr/bin/env python3 ''' Copyright (C) 2024, WAFW00F Developers. See the LICENSE file for copying permission. ''' NAME = 'Cloudfloor (Cloudfloor DNS)' def is_waf(self): if self.matchHeader(('Server', r'CloudfloorDNS(.WAF)?')): return True if self.matchContent(r'<(title|h\d{1})>CloudfloorDNS.{0,6}?Web Application Firewall Error'): return True if self.matchContent(r'www\.cloudfloordns\.com/contact'): return True return False wafw00f-2.3.1/wafw00f/plugins/ciscoacexml.py0000664000175000017500000000041014734711633020500 0ustar epsilonepsilon#!/usr/bin/env python3 ''' Copyright (C) 2024, WAFW00F Developers. See the LICENSE file for copying permission. ''' NAME = 'ACE XML Gateway (Cisco)' def is_waf(self): if self.matchHeader(('Server', 'ACE XML Gateway')): return True return False wafw00f-2.3.1/wafw00f/plugins/bluedon.py0000664000175000017500000000061214734711633017642 0ustar epsilonepsilon#!/usr/bin/env python3 ''' Copyright (C) 2024, WAFW00F Developers. See the LICENSE file for copying permission. ''' NAME = 'Bluedon (Bluedon IST)' def is_waf(self): # Found sample servers returning 'Server: BDWAF/2.0' if self.matchHeader(('Server', r'BDWAF')): return True if self.matchContent(r'bluedon web application firewall'): return True return False wafw00f-2.3.1/wafw00f/plugins/qrator.py0000664000175000017500000000037014734711633017523 0ustar epsilonepsilon#!/usr/bin/env python3 ''' Copyright (C) 2024, WAFW00F Developers. See the LICENSE file for copying permission. ''' NAME = 'Qrator (Qrator)' def is_waf(self): if self.matchHeader(('Server', r'QRATOR')): return True return False wafw00f-2.3.1/wafw00f/plugins/virusdie.py0000664000175000017500000000054514734711633020051 0ustar epsilonepsilon#!/usr/bin/env python3 ''' Copyright (C) 2024, WAFW00F Developers. See the LICENSE file for copying permission. ''' NAME = 'VirusDie (VirusDie LLC)' def is_waf(self): if self.matchContent(r"cdn\.virusdie\.ru/splash/firewallstop\.png"): return True if self.matchContent(r'copy.{0,10}?Virusdie\.ru'): return True return False wafw00f-2.3.1/wafw00f/plugins/bekchy.py0000664000175000017500000000117014734711633017457 0ustar epsilonepsilon#!/usr/bin/env python3 ''' Copyright (C) 2024, WAFW00F Developers. See the LICENSE file for copying permission. ''' NAME = 'Bekchy (Faydata Technologies Inc.)' def is_waf(self): # Both signatures are contained within response, so checking for any one of them # Sometimes I observed that there is an XHR request being being made to submit the # report data automatically upon page load. In those cases a missing https is causing # false negatives. if self.matchContent(r'Bekchy.{0,10}?Access Denied'): return True if self.matchContent(r'bekchy\.com/report'): return True return False wafw00f-2.3.1/wafw00f/plugins/anyu.py0000664000175000017500000000055114734711633017170 0ustar epsilonepsilon#!/usr/bin/env python3 ''' Copyright (C) 2024, WAFW00F Developers. See the LICENSE file for copying permission. ''' NAME = 'AnYu (AnYu Technologies)' def is_waf(self): if self.matchContent(r'anyu.{0,10}?the green channel'): return True if self.matchContent(r'your access has been intercepted by anyu'): return True return False wafw00f-2.3.1/wafw00f/plugins/huaweicloud.py0000664000175000017500000000072014734711633020523 0ustar epsilonepsilon#!/usr/bin/env python3 ''' Copyright (C) 2024, WAFW00F Developers. See the LICENSE file for copying permission. ''' NAME = 'Huawei Cloud Firewall (Huawei)' def is_waf(self): if self.matchCookie(r'^HWWAFSESID='): return True if self.matchHeader(('Server', r'HuaweiCloudWAF')): return True if self.matchContent(r'hwclouds\.com'): return True if self.matchContent(r'hws_security@'): return True return False wafw00f-2.3.1/wafw00f/plugins/instartdx.py0000664000175000017500000000153514734711633020237 0ustar epsilonepsilon#!/usr/bin/env python3 ''' Copyright (C) 2024, WAFW00F Developers. See the LICENSE file for copying permission. ''' NAME = 'Instart DX (Instart Logic)' def is_waf(self): if check_schema_01(self): return True if check_schema_02(self): return True return False def check_schema_01(self): if self.matchHeader(('X-Instart-Request-ID', '.+')): return True if self.matchHeader(('X-Instart-Cache', '.+')): return True if self.matchHeader(('X-Instart-WL', '.+')): return True return False def check_schema_02(self): if not self.matchContent(r'the requested url was rejected'): return False if not self.matchContent(r'please consult with your administrator'): return False if not self.matchContent(r'your support id is'): return False return True wafw00f-2.3.1/wafw00f/plugins/zscaler.py0000664000175000017500000000144214734711633017657 0ustar epsilonepsilon#!/usr/bin/env python3 ''' Copyright (C) 2024, WAFW00F Developers. See the LICENSE file for copying permission. ''' NAME = 'ZScaler (Accenture)' def is_waf(self): if self.matchHeader(('Server', r'ZScaler')): return True if self.matchContent(r"Access Denied.{0,10}?Accenture Policy"): return True if self.matchContent(r'policies\.accenture\.com'): return True if self.matchContent(r'login\.zscloud\.net/img_logo_new1\.png'): return True if self.matchContent(r'Zscaler to protect you from internet threats'): return True if self.matchContent(r"Internet Security by ZScaler"): return True if self.matchContent(r"Accenture.{0,10}?webfilters indicate that the site likely contains"): return True return False wafw00f-2.3.1/wafw00f/plugins/f5firepass.py0000664000175000017500000000123314734711633020261 0ustar epsilonepsilon#!/usr/bin/env python3 ''' Copyright (C) 2024, WAFW00F Developers. See the LICENSE file for copying permission. ''' NAME = 'FirePass (F5 Networks)' def is_waf(self): if check_schema_01(self): return True if check_schema_02(self): return True return False def check_schema_01(self): if not self.matchCookie('^VHOST'): return False if not self.matchHeader(('Location', r'\/my\.logon\.php3')): return False return True def check_schema_02(self): if not self.matchCookie(r'^F5_fire.+?'): return False if not self.matchCookie('^F5_passid_shrinked'): return False return True wafw00f-2.3.1/wafw00f/plugins/radware.py0000664000175000017500000000163114734711633017641 0ustar epsilonepsilon#!/usr/bin/env python3 ''' Copyright (C) 2024, WAFW00F Developers. See the LICENSE file for copying permission. ''' NAME = 'AppWall (Radware)' def is_waf(self): if check_schema_01(self): return True if check_schema_02(self): return True return False def check_schema_01(self): if self.matchContent(r'CloudWebSec\.radware\.com'): return True if self.matchHeader(('X-SL-CompState', '.+')): return True return False def check_schema_02(self): if not self.matchContent(r'because we have detected unauthorized activity'): return False if not self.matchContent(r'Unauthorized Request Blocked'): return False if not self.matchContent(r'if you believe that there has been some mistake'): return False if not self.matchContent(r'\?Subject=Security Page.{0,10}?Case Number'): return False return True �������������������������������������������������������������������������������������������������������wafw00f-2.3.1/wafw00f/plugins/ninja.py��������������������������������������������������������������0000664�0001750�0001750�00000000620�14734711633�017310� 0����������������������������������������������������������������������������������������������������ustar �epsilon�������������������������epsilon����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/usr/bin/env python3 ''' Copyright (C) 2024, WAFW00F Developers. See the LICENSE file for copying permission. ''' NAME = 'NinjaFirewall (NinTechNet)' def is_waf(self): if not self.matchContent(r'<title>NinjaFirewall.{0,10}?\d{3}.forbidden'): return False if not self.matchContent(r'For security reasons?.{0,10}?it was blocked and logged'): return False return True ����������������������������������������������������������������������������������������������������������������wafw00f-2.3.1/wafw00f/plugins/frontdoor.py����������������������������������������������������������0000664�0001750�0001750�00000000406�14734711633�020227� 0����������������������������������������������������������������������������������������������������ustar �epsilon�������������������������epsilon����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/usr/bin/env python3 ''' Copyright (C) 2024, WAFW00F Developers. See the LICENSE file for copying permission. ''' NAME = 'Azure Front Door (Microsoft)' def is_waf(self): if self.matchHeader(('X-Azure-Ref', '.+?')): return True return False ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������wafw00f-2.3.1/wafw00f/plugins/bitninja.py�����������������������������������������������������������0000664�0001750�0001750�00000000526�14734711633�020014� 0����������������������������������������������������������������������������������������������������ustar �epsilon�������������������������epsilon����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/usr/bin/env python3 ''' Copyright (C) 2024, WAFW00F Developers. See the LICENSE file for copying permission. ''' NAME = 'BitNinja (BitNinja)' def is_waf(self): if self.matchContent(r'Security check by BitNinja'): return True if self.matchContent(r'Visitor anti-robot validation'): return True return False ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������wafw00f-2.3.1/wafw00f/plugins/rvmode.py�������������������������������������������������������������0000664�0001750�0001750�00000000754�14734711633�017515� 0����������������������������������������������������������������������������������������������������ustar �epsilon�������������������������epsilon����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/usr/bin/env python3 ''' Copyright (C) 2024, WAFW00F Developers. See the LICENSE file for copying permission. ''' NAME = 'RequestValidationMode (Microsoft)' def is_waf(self): if self.matchContent(r'Request Validation has detected a potentially dangerous client input'): return True if self.matchContent(r'ASP\.NET has detected data in the request'): return True if self.matchContent(r'HttpRequestValidationException'): return True return False ��������������������wafw00f-2.3.1/wafw00f/plugins/comodo.py�������������������������������������������������������������0000664�0001750�0001750�00000000443�14734711633�017474� 0����������������������������������������������������������������������������������������������������ustar �epsilon�������������������������epsilon����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/usr/bin/env python3 ''' Copyright (C) 2024, WAFW00F Developers. See the LICENSE file for copying permission. ''' NAME = 'Comodo cWatch (Comodo CyberSecurity)' def is_waf(self): if self.matchHeader(('Server', r'Protected by COMODO WAF(.+)?')): return True return False �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������wafw00f-2.3.1/wafw00f/plugins/webknight.py����������������������������������������������������������0000664�0001750�0001750�00000002277�14734711633�020205� 0����������������������������������������������������������������������������������������������������ustar �epsilon�������������������������epsilon����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/usr/bin/env python3 ''' Copyright (C) 2024, WAFW00F Developers. See the LICENSE file for copying permission. ''' NAME = 'WebKnight (AQTRONIX)' def is_waf(self): if check_schema_01(self): return True if check_schema_02(self): return True if check_schema_03(self): return True return False def check_schema_01(self): if not self.matchStatus(999): return False if not self.matchReason('No Hacking'): return False return True def check_schema_02(self): if not self.matchStatus(404): return False if not self.matchReason('Hack Not Found'): return False return True def check_schema_03(self): if self.matchContent(r'WebKnight Application Firewall Alert'): return True if self.matchContent(r'What is webknight\?'): return True if self.matchContent(r'AQTRONIX WebKnight is an application firewall'): return True if self.matchContent(r'WebKnight will take over and protect'): return True if self.matchContent(r'aqtronix\.com/WebKnight'): return True if self.matchContent(r'AQTRONIX.{0,10}?WebKnight'): return True return False ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������wafw00f-2.3.1/wafw00f/plugins/cloudfront.py���������������������������������������������������������0000664�0001750�0001750�00000002031�14734711633�020366� 0����������������������������������������������������������������������������������������������������ustar �epsilon�������������������������epsilon����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/usr/bin/env python3 ''' Copyright (C) 2024, WAFW00F Developers. See the LICENSE file for copying permission. ''' NAME = 'Cloudfront (Amazon)' def is_waf(self): # This is standard detection schema, checking the server header if self.matchHeader(('Server', 'Cloudfront')): return True # Found samples returning 'Via: 1.1 58bfg7h6fg76h8fg7jhdf2.cloudfront.net (CloudFront)' if self.matchHeader(('Via', r'([0-9\.]+?)? \w+?\.cloudfront\.net \(Cloudfront\)')): return True # The request token is sent along with this header, eg: # X-Amz-Cf-Id: sX5QSkbAzSwd-xx3RbJmxYHL3iVNNyXa1UIebDNCshQbHxCjVcWDww== if self.matchHeader(('X-Amz-Cf-Id', '.+?'), attack=True): return True # This is another reliable fingerprint found on headers if self.matchHeader(('X-Cache', 'Error from Cloudfront'), attack=True): return True # These fingerprints are found on the blockpage itself if self.matchContent(r'Generated by cloudfront \(CloudFront\)'): return True return False �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������wafw00f-2.3.1/wafw00f/plugins/webland.py������������������������������������������������������������0000664�0001750�0001750�00000000410�14734711633�017622� 0����������������������������������������������������������������������������������������������������ustar �epsilon�������������������������epsilon����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/usr/bin/env python3 ''' Copyright (C) 2024, WAFW00F Developers. See the LICENSE file for copying permission. ''' NAME = 'WebLand (WebLand)' def is_waf(self): if self.matchHeader(('Server', r'protected by webland')): return True return False ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������wafw00f-2.3.1/wafw00f/plugins/fortiguard.py���������������������������������������������������������0000664�0001750�0001750�00000001021�14734711633�020353� 0����������������������������������������������������������������������������������������������������ustar �epsilon�������������������������epsilon����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/usr/bin/env python3 ''' Copyright (C) 2023, WAFW00F Developers. See the LICENSE file for copying permission. ''' NAME = 'FortiGuard (Fortinet)' def is_waf(self): if check_schema(self): return True return False def check_schema(self): if not self.matchContent('FortiGuard Intrusion Prevention'): return False if not self.matchContent('//globalurl.fortinet.net'): return False if not self.matchContent('<title>Web Filter Violation'): return False return True ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������wafw00f-2.3.1/wafw00f/plugins/transip.py������������������������������������������������������������0000664�0001750�0001750�00000000531�14734711633�017672� 0����������������������������������������������������������������������������������������������������ustar �epsilon�������������������������epsilon����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/usr/bin/env python3 ''' Copyright (C) 2024, WAFW00F Developers. See the LICENSE file for copying permission. ''' NAME = 'TransIP Web Firewall (TransIP)' def is_waf(self): if self.matchHeader(('X-TransIP-Backend', '.+')): return True if self.matchHeader(('X-TransIP-Balancer', '.+')): return True return False �����������������������������������������������������������������������������������������������������������������������������������������������������������������������wafw00f-2.3.1/wafw00f/plugins/west263cdn.py���������������������������������������������������������0000664�0001750�0001750�00000000406�14734711633�020115� 0����������������������������������������������������������������������������������������������������ustar �epsilon�������������������������epsilon����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/usr/bin/env python3 ''' Copyright (C) 2024, WAFW00F Developers. See the LICENSE file for copying permission. ''' NAME = 'West263 CDN (West263CDN)' def is_waf(self): if self.matchHeader(('X-Cache', r'WS?T263CDN')): return True return False ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������wafw00f-2.3.1/wafw00f/plugins/safe3.py��������������������������������������������������������������0000664�0001750�0001750�00000000653�14734711633�017220� 0����������������������������������������������������������������������������������������������������ustar �epsilon�������������������������epsilon����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/usr/bin/env python3 ''' Copyright (C) 2024, WAFW00F Developers. See the LICENSE file for copying permission. ''' NAME = 'Safe3 Web Firewall (Safe3)' def is_waf(self): if self.matchHeader(('Server', 'Safe3 Web Firewall')): return True if self.matchHeader(('X-Powered-By', r'Safe3WAF/[\.0-9]+?')): return True if self.matchContent(r'Safe3waf/[0-9\.]+?'): return True return False �������������������������������������������������������������������������������������wafw00f-2.3.1/wafw00f/plugins/naxsi.py��������������������������������������������������������������0000664�0001750�0001750�00000000742�14734711633�017340� 0����������������������������������������������������������������������������������������������������ustar �epsilon�������������������������epsilon����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/usr/bin/env python3 ''' Copyright (C) 2024, WAFW00F Developers. See the LICENSE file for copying permission. ''' NAME = 'NAXSI (NBS Systems)' def is_waf(self): if self.matchHeader(('X-Data-Origin', r'^naxsi(.+)?')): return True if self.matchHeader(('Server', r'naxsi(.+)?')): return True if self.matchContent(r'blocked by naxsi'): return True if self.matchContent(r'naxsi blocked information'): return True return False ������������������������������wafw00f-2.3.1/wafw00f/plugins/varnish.py������������������������������������������������������������0000664�0001750�0001750�00000000410�14734711633�017660� 0����������������������������������������������������������������������������������������������������ustar �epsilon�������������������������epsilon����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/usr/bin/env python3 ''' Copyright (C) 2024, WAFW00F Developers. See the LICENSE file for copying permission. ''' NAME = 'Varnish (OWASP)' def is_waf(self): if self.matchContent(r'Request rejected by xVarnish\-WAF'): return True return False ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������wafw00f-2.3.1/wafw00f/plugins/uewaf.py��������������������������������������������������������������0000664�0001750�0001750�00000000622�14734711633�017322� 0����������������������������������������������������������������������������������������������������ustar �epsilon�������������������������epsilon����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/usr/bin/env python3 ''' Copyright (C) 2024, WAFW00F Developers. See the LICENSE file for copying permission. ''' NAME = 'UEWaf (UCloud)' def is_waf(self): if self.matchHeader(('Server', r'uewaf(/[0-9\.]+)?')): return True if self.matchContent(r'/uewaf_deny_pages/default/img/'): return True if self.matchContent(r'ucloud\.cn'): return True return False ��������������������������������������������������������������������������������������������������������������wafw00f-2.3.1/wafw00f/plugins/cdnns.py��������������������������������������������������������������0000664�0001750�0001750�00000000436�14734711633�017323� 0����������������������������������������������������������������������������������������������������ustar �epsilon�������������������������epsilon����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/usr/bin/env python3 ''' Copyright (C) 2024, WAFW00F Developers. See the LICENSE file for copying permission. ''' NAME = 'CdnNS Application Gateway (CdnNs/WdidcNet)' def is_waf(self): if self.matchContent(r'cdnnswaf application gateway'): return True return False ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������wafw00f-2.3.1/wafw00f/plugins/ptaf.py���������������������������������������������������������������0000664�0001750�0001750�00000000613�14734711633�017145� 0����������������������������������������������������������������������������������������������������ustar �epsilon�������������������������epsilon����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/usr/bin/env python3 ''' Copyright (C) 2024, WAFW00F Developers. See the LICENSE file for copying permission. ''' NAME = 'PT Application Firewall (Positive Technologies)' def is_waf(self): if not self.matchContent(r'<h1.{0,10}?Forbidden'): return False if not self.matchContent(r'<pre>Request.ID:.{0,10}?\d{4}\-(\d{2})+.{0,35}?pre>'): return False return True ���������������������������������������������������������������������������������������������������������������������wafw00f-2.3.1/wafw00f/plugins/zenedge.py������������������������������������������������������������0000664�0001750�0001750�00000000577�14734711633�017645� 0����������������������������������������������������������������������������������������������������ustar �epsilon�������������������������epsilon����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/usr/bin/env python3 ''' Copyright (C) 2024, WAFW00F Developers. See the LICENSE file for copying permission. ''' NAME = 'Zenedge (Zenedge)' def is_waf(self): if self.matchHeader(('Server', 'ZENEDGE')): return True if self.matchHeader(('X-Zen-Fury', r'.+?')): return True if self.matchContent(r'/__zenedge/'): return True return False ���������������������������������������������������������������������������������������������������������������������������������wafw00f-2.3.1/wafw00f/plugins/pentawaf.py�����������������������������������������������������������0000664�0001750�0001750�00000000550�14734711633�020020� 0����������������������������������������������������������������������������������������������������ustar �epsilon�������������������������epsilon����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/usr/bin/env python3 ''' Copyright (C) 2024, WAFW00F Developers. See the LICENSE file for copying permission. ''' NAME = 'PentaWAF (Global Network Services)' def is_waf(self): if self.matchHeader(('Server', r'PentaWaf(/[0-9\.]+)?')): return True if self.matchContent(r'Penta.?Waf/[0-9\.]+?.server'): return True return False ��������������������������������������������������������������������������������������������������������������������������������������������������������wafw00f-2.3.1/wafw00f/plugins/edgecast.py�����������������������������������������������������������0000664�0001750�0001750�00000000524�14734711633�017773� 0����������������������������������������������������������������������������������������������������ustar �epsilon�������������������������epsilon����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/usr/bin/env python3 ''' Copyright (C) 2024, WAFW00F Developers. See the LICENSE file for copying permission. ''' NAME = 'Edgecast (Verizon Digital Media)' def is_waf(self): if self.matchHeader(('Server', r'^ECD(.+)?')): return True if self.matchHeader(('Server', r'^ECS(.*)?')): return True return False ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������wafw00f-2.3.1/wafw00f/plugins/squidproxy.py���������������������������������������������������������0000664�0001750�0001750�00000000576�14734711633�020452� 0����������������������������������������������������������������������������������������������������ustar �epsilon�������������������������epsilon����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/usr/bin/env python3 ''' Copyright (C) 2024, WAFW00F Developers. See the LICENSE file for copying permission. ''' NAME = 'SquidProxy IDS (SquidProxy)' def is_waf(self): if not self.matchHeader(('Server', r'squid(/[0-9\.]+)?')): return False if not self.matchContent(r'Access control configuration prevents your request'): return False return True ����������������������������������������������������������������������������������������������������������������������������������wafw00f-2.3.1/wafw00f/plugins/keycdn.py�������������������������������������������������������������0000664�0001750�0001750�00000000367�14734711633�017476� 0����������������������������������������������������������������������������������������������������ustar �epsilon�������������������������epsilon����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/usr/bin/env python3 ''' Copyright (C) 2024, WAFW00F Developers. See the LICENSE file for copying permission. ''' NAME = 'KeyCDN (KeyCDN)' def is_waf(self): if self.matchHeader(('Server', 'KeyCDN')): return True return False �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������wafw00f-2.3.1/wafw00f/plugins/perimeterx.py���������������������������������������������������������0000664�0001750�0001750�00000000725�14734711633�020403� 0����������������������������������������������������������������������������������������������������ustar �epsilon�������������������������epsilon����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/usr/bin/env python3 ''' Copyright (C) 2024, WAFW00F Developers. See the LICENSE file for copying permission. ''' NAME = 'PerimeterX (PerimeterX)' def is_waf(self): if self.matchContent(r'www\.perimeterx\.(com|net)/whywasiblocked'): return True if self.matchContent(r'client\.perimeterx\.(net|com)'): return True if self.matchContent(r'denied because we believe you are using automation tools'): return True return False �������������������������������������������wafw00f-2.3.1/wafw00f/plugins/dosarrest.py����������������������������������������������������������0000664�0001750�0001750�00000000645�14734711633�020226� 0����������������������������������������������������������������������������������������������������ustar �epsilon�������������������������epsilon����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/usr/bin/env python3 ''' Copyright (C) 2024, WAFW00F Developers. See the LICENSE file for copying permission. ''' NAME = 'DOSarrest (DOSarrest Internet Security)' def is_waf(self): if self.matchHeader(('X-DIS-Request-ID', '.+')): return True # Found samples of DOSArrest returning 'Server: DoSArrest/3.5' if self.matchHeader(('Server', r'DOSarrest(.*)?')): return True return False �������������������������������������������������������������������������������������������wafw00f-2.3.1/wafw00f/plugins/webarx.py�������������������������������������������������������������0000664�0001750�0001750�00000000705�14734711633�017505� 0����������������������������������������������������������������������������������������������������ustar �epsilon�������������������������epsilon����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/usr/bin/env python3 ''' Copyright (C) 2024, WAFW00F Developers. See the LICENSE file for copying permission. ''' NAME = 'WebARX (WebARX Security Solutions)' def is_waf(self): if self.matchContent(r"WebARX.{0,10}?Web Application Firewall"): return True if self.matchContent(r"www\.webarxsecurity\.com"): return True if self.matchContent(r'/wp\-content/plugins/webarx/includes/'): return True return False �����������������������������������������������������������wafw00f-2.3.1/wafw00f/plugins/armor.py��������������������������������������������������������������0000664�0001750�0001750�00000000556�14734711633�017341� 0����������������������������������������������������������������������������������������������������ustar �epsilon�������������������������epsilon����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/usr/bin/env python3 ''' Copyright (C) 2024, WAFW00F Developers. See the LICENSE file for copying permission. ''' NAME = 'Armor Defense (Armor)' def is_waf(self): if self.matchContent(r'blocked by website protection from armor'): return True if self.matchContent(r'please create an armor support ticket'): return True return False ��������������������������������������������������������������������������������������������������������������������������������������������������wafw00f-2.3.1/wafw00f/plugins/malcare.py������������������������������������������������������������0000664�0001750�0001750�00000000567�14734711633�017627� 0����������������������������������������������������������������������������������������������������ustar �epsilon�������������������������epsilon����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/usr/bin/env python3 ''' Copyright (C) 2024, WAFW00F Developers. See the LICENSE file for copying permission. ''' NAME = 'Malcare (Inactiv)' def is_waf(self): if self.matchContent(r'firewall.{0,15}?powered.by.{0,15}?malcare.{0,15}?pro'): return True if self.matchContent('blocked because of malicious activities'): return True return False �����������������������������������������������������������������������������������������������������������������������������������������wafw00f-2.3.1/wafw00f/plugins/distil.py�������������������������������������������������������������0000664�0001750�0001750�00000000662�14734711633�017507� 0����������������������������������������������������������������������������������������������������ustar �epsilon�������������������������epsilon����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/usr/bin/env python3 ''' Copyright (C) 2024, WAFW00F Developers. See the LICENSE file for copying permission. ''' NAME = 'Distil (Distil Networks)' def is_waf(self): if self.matchContent(r'cdn\.distilnetworks\.com/images/anomaly\.detected\.png'): return True if self.matchContent(r'distilCaptchaForm'): return True if self.matchContent(r'distilCallbackGuard'): return True return False ������������������������������������������������������������������������������wafw00f-2.3.1/wafw00f/plugins/f5bigipltm.py���������������������������������������������������������0000664�0001750�0001750�00000000540�14734711633�020254� 0����������������������������������������������������������������������������������������������������ustar �epsilon�������������������������epsilon����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/usr/bin/env python3 ''' Copyright (C) 2024, WAFW00F Developers. See the LICENSE file for copying permission. ''' NAME = 'BIG-IP Local Traffic Manager (F5 Networks)' def is_waf(self): if self.matchCookie('^bigipserver'): return True if self.matchHeader(('X-Cnection', 'close'), attack=True): return True return False ����������������������������������������������������������������������������������������������������������������������������������������������������������������wafw00f-2.3.1/wafw00f/plugins/blockdos.py�����������������������������������������������������������0000664�0001750�0001750�00000000403�14734711633�020010� 0����������������������������������������������������������������������������������������������������ustar �epsilon�������������������������epsilon����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/usr/bin/env python3 ''' Copyright (C) 2024, WAFW00F Developers. See the LICENSE file for copying permission. ''' NAME = 'BlockDoS (BlockDoS)' def is_waf(self): if self.matchHeader(('Server', r'blockdos\.net')): return True return False �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������wafw00f-2.3.1/wafw00f/plugins/urlmaster.py����������������������������������������������������������0000664�0001750�0001750�00000001266�14734711633�020236� 0����������������������������������������������������������������������������������������������������ustar �epsilon�������������������������epsilon����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/usr/bin/env python3 ''' Copyright (C) 2024, WAFW00F Developers. See the LICENSE file for copying permission. ''' NAME = 'URLMaster SecurityCheck (iFinity/DotNetNuke)' def is_waf(self): if check_schema_01(self): return True if check_schema_02(self): return True return False def check_schema_01(self): if self.matchHeader(('X-UrlMaster-Debug', '.+')): return True if self.matchHeader(('X-UrlMaster-Ex', '.+')): return True return False def check_schema_02(self): if not self.matchContent(r"Ur[li]RewriteModule"): return False if not self.matchContent(r'SecurityCheck'): return False return True ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������wafw00f-2.3.1/wafw00f/plugins/aliyundun.py����������������������������������������������������������0000664�0001750�0001750�00000001166�14734711633�020227� 0����������������������������������������������������������������������������������������������������ustar �epsilon�������������������������epsilon����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/usr/bin/env python3 ''' Copyright (C) 2024, WAFW00F Developers. See the LICENSE file for copying permission. ''' NAME = 'AliYunDun (Alibaba Cloud Computing)' def is_waf(self): if not self.matchContent(r'error(s)?\.aliyun(dun)?\.(com|net)?'): return False if not self.matchContent(r'alicdn\.com\/sd\-base\/static\/\d{1,2}\.\d{1,2}\.\d{1,2}\/image\/405\.png'): return False if not self.matchContent(r'Sorry, your request has been blocked as it may cause potential threats to the server\'s security.'): return False if not self.matchStatus(405): return False return True ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������wafw00f-2.3.1/wafw00f/plugins/newdefend.py����������������������������������������������������������0000664�0001750�0001750�00000001012�14734711633�020144� 0����������������������������������������������������������������������������������������������������ustar �epsilon�������������������������epsilon����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/usr/bin/env python3 ''' Copyright (C) 2024, WAFW00F Developers. See the LICENSE file for copying permission. ''' NAME = 'Newdefend (NewDefend)' def is_waf(self): # This header can be obtained without attack mode # Most reliable fingerprint if self.matchHeader(('Server', 'Newdefend')): return True # Reliable ones within blockpage if self.matchContent(r'www\.newdefend\.com/feedback'): return True if self.matchContent(r'/nd\-block/'): return True return False ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������wafw00f-2.3.1/wafw00f/plugins/sonicwall.py����������������������������������������������������������0000664�0001750�0001750�00000000620�14734711633�020204� 0����������������������������������������������������������������������������������������������������ustar �epsilon�������������������������epsilon����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/usr/bin/env python3 ''' Copyright (C) 2024, WAFW00F Developers. See the LICENSE file for copying permission. ''' NAME = 'SonicWall (Dell)' def is_waf(self): if self.matchHeader(('Server', 'SonicWALL')): return True if self.matchContent(r"<(title|h\d{1})>Web Site Blocked"): return True if self.matchContent(r'\+?nsa_banner'): return True return False ����������������������������������������������������������������������������������������������������������������wafw00f-2.3.1/wafw00f/plugins/knownsec.py�����������������������������������������������������������0000664�0001750�0001750�00000000401�14734711633�020035� 0����������������������������������������������������������������������������������������������������ustar �epsilon�������������������������epsilon����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/usr/bin/env python3 ''' Copyright (C) 2024, WAFW00F Developers. See the LICENSE file for copying permission. ''' NAME = 'KS-WAF (KnownSec)' def is_waf(self): if self.matchContent(r'/ks[-_]waf[-_]error\.png'): return True return False ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������wafw00f-2.3.1/wafw00f/plugins/indusguard.py���������������������������������������������������������0000664�0001750�0001750�00000000573�14734711633�020365� 0����������������������������������������������������������������������������������������������������ustar �epsilon�������������������������epsilon����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/usr/bin/env python3 ''' Copyright (C) 2024, WAFW00F Developers. See the LICENSE file for copying permission. ''' NAME = 'IndusGuard (Indusface)' def is_waf(self): if self.matchHeader(('Server', r'IF_WAF')): return True if self.matchContent(r'This website is secured against online attacks. Your request was blocked'): return True return False �������������������������������������������������������������������������������������������������������������������������������������wafw00f-2.3.1/wafw00f/plugins/puhui.py��������������������������������������������������������������0000664�0001750�0001750�00000000376�14734711633�017353� 0����������������������������������������������������������������������������������������������������ustar �epsilon�������������������������epsilon����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/usr/bin/env python3 ''' Copyright (C) 2024, WAFW00F Developers. See the LICENSE file for copying permission. ''' NAME = 'Puhui (Puhui)' def is_waf(self): if self.matchHeader(('Server', r'Puhui[\-_]?WAF')): return True return False ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������wafw00f-2.3.1/wafw00f/plugins/airee.py��������������������������������������������������������������0000664�0001750�0001750�00000000613�14734711633�017300� 0����������������������������������������������������������������������������������������������������ustar �epsilon�������������������������epsilon����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/usr/bin/env python3 ''' Copyright (C) 2024, WAFW00F Developers. See the LICENSE file for copying permission. ''' NAME = 'AireeCDN (Airee)' def is_waf(self): if self.matchHeader(('Server', 'Airee')): return True if self.matchHeader(('X-Cache', r'(\w+\.)?airee\.cloud')): return True if self.matchContent(r'airee\.cloud'): return True return False ���������������������������������������������������������������������������������������������������������������������wafw00f-2.3.1/wafw00f/plugins/sabre.py��������������������������������������������������������������0000664�0001750�0001750�00000001063�14734711633�017307� 0����������������������������������������������������������������������������������������������������ustar �epsilon�������������������������epsilon����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/usr/bin/env python3 ''' Copyright (C) 2024, WAFW00F Developers. See the LICENSE file for copying permission. ''' NAME = 'Sabre Firewall (Sabre)' def is_waf(self): if self.matchContent(r'dxsupport\.sabre\.com'): return True if check_schema_01(self): return True return False def check_schema_01(self): if not self.matchContent(r'<title>Application Firewall Error'): return False if not self.matchContent(r'add some important details to the email for us to investigate'): return False return True �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������wafw00f-2.3.1/wafw00f/plugins/astra.py��������������������������������������������������������������0000664�0001750�0001750�00000000653�14734711633�017331� 0����������������������������������������������������������������������������������������������������ustar �epsilon�������������������������epsilon����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/usr/bin/env python3 ''' Copyright (C) 2024, WAFW00F Developers. See the LICENSE file for copying permission. ''' NAME = 'Astra (Czar Securities)' def is_waf(self): if self.matchCookie(r'^cz_astra_csrf_cookie'): return True if self.matchContent(r'astrawebsecurity\.freshdesk\.com'): return True if self.matchContent(r'www\.getastra\.com/assets/images'): return True return False �������������������������������������������������������������������������������������wafw00f-2.3.1/wafw00f/wafprio.py��������������������������������������������������������������������0000664�0001750�0001750�00000012322�14734711633�016201� 0����������������������������������������������������������������������������������������������������ustar �epsilon�������������������������epsilon����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/usr/bin/env python3 ''' Copyright (C) 2024, WAFW00F Developers. See the LICENSE file for copying permission. ''' # NOTE: this priority list is used so that each check can be prioritized, # so that the quick checks are done first and ones that require more # requests, are done later wafdetectionsprio = [ '360WangZhanBao (360 Technologies)', 'ACE XML Gateway (Cisco)', 'ASP.NET Generic (Microsoft)', 'ASPA Firewall (ASPA Engineering Co.)', 'AWS Elastic Load Balancer (Amazon)', 'AireeCDN (Airee)', 'Airlock (Phion/Ergon)', 'Alert Logic (Alert Logic)', 'AliYunDun (Alibaba Cloud Computing)', 'AnYu (AnYu Technologies)', 'Anquanbao (Anquanbao)', 'AppWall (Radware)', 'Approach (Approach)', 'Armor Defense (Armor)', 'ArvanCloud (ArvanCloud)', 'Astra (Czar Securities)', 'Azion Edge Firewall (Azion)', 'Azure Application Gateway (Microsoft)', 'Azure Front Door (Microsoft)', 'BIG-IP AP Manager (F5 Networks)', 'BIG-IP AppSec Manager (F5 Networks)', 'BIG-IP Local Traffic Manager (F5 Networks)', 'Barikode (Ethic Ninja)', 'Barracuda (Barracuda Networks)', 'Bekchy (Faydata Technologies Inc.)', 'Beluga CDN (Beluga)', 'BinarySec (BinarySec)', 'BitNinja (BitNinja)', 'BlockDoS (BlockDoS)', 'Bluedon (Bluedon IST)', 'BulletProof Security Pro (AITpro Security)', 'CacheFly CDN (CacheFly)', 'CacheWall (Varnish)', 'CdnNS Application Gateway (CdnNs/WdidcNet)', 'ChinaCache Load Balancer (ChinaCache)', 'Chuang Yu Shield (Yunaq)', 'Cloud Protector (Rohde & Schwarz CyberSecurity)', 'Cloudbric (Penta Security)', 'Cloudflare (Cloudflare Inc.)', 'Cloudfloor (Cloudfloor DNS)', 'Cloudfront (Amazon)', 'Comodo cWatch (Comodo CyberSecurity)', 'CrawlProtect (Jean-Denis Brun)', 'DDoS-GUARD (DDOS-GUARD CORP.)', 'DOSarrest (DOSarrest Internet Security)', 'DataPower (IBM)', 'DenyALL (Rohde & Schwarz CyberSecurity)', 'Distil (Distil Networks)', 'DotDefender (Applicure Technologies)', 'DynamicWeb Injection Check (DynamicWeb)', 'Edgecast (Verizon Digital Media)', 'Eisoo Cloud Firewall (Eisoo)', 'Envoy (EnvoyProxy)', 'Expression Engine (EllisLab)', 'Fastly (Fastly CDN)', 'FirePass (F5 Networks)', 'FortiGate (Fortinet)', 'FortiGuard (Fortinet)', 'FortiWeb (Fortinet)', 'GoDaddy Website Protection (GoDaddy)', 'Google Cloud App Armor (Google Cloud)', 'Greywizard (Grey Wizard)', 'Huawei Cloud Firewall (Huawei)', 'HyperGuard (Art of Defense)', 'ISA Server (Microsoft)', 'Imunify360 (CloudLinux)', 'Incapsula (Imperva Inc.)', 'IndusGuard (Indusface)', 'Instart DX (Instart Logic)', 'Janusec Application Gateway (Janusec)', 'Jiasule (Jiasule)', 'KS-WAF (KnownSec)', 'Kemp LoadMaster (Progress Software)', 'KeyCDN (KeyCDN)', 'Kona SiteDefender (Akamai)', 'LimeLight CDN (LimeLight)', 'LiteSpeed (LiteSpeed Technologies)', 'Malcare (Inactiv)', 'MaxCDN (MaxCDN)', 'Mission Control Shield (Mission Control)', 'ModSecurity (SpiderLabs)', 'NAXSI (NBS Systems)', 'NSFocus (NSFocus Global Inc.)', 'Nemesida (PentestIt)', 'NetContinuum (Barracuda Networks)', 'NetScaler AppFirewall (Citrix Systems)', 'NevisProxy (AdNovum)', 'Newdefend (NewDefend)', 'NexusGuard Firewall (NexusGuard)', 'NinjaFirewall (NinTechNet)', 'NullDDoS Protection (NullDDoS)', 'OnMessage Shield (BlackBaud)', 'Open-Resty Lua Nginx (FLOSS)', 'Oracle Cloud (Oracle)', 'PT Application Firewall (Positive Technologies)', 'Palo Alto Next Gen Firewall (Palo Alto Networks)', 'PentaWAF (Global Network Services)', 'PerimeterX (PerimeterX)', 'PowerCDN (PowerCDN)', 'Profense (ArmorLogic)', 'Puhui (Puhui)', 'Qcloud (Tencent Cloud)', 'Qiniu (Qiniu CDN)', 'Qrator (Qrator)', 'RSFirewall (RSJoomla!)', 'RayWAF (WebRay Solutions)', 'Reblaze (Reblaze)', 'RequestValidationMode (Microsoft)', 'SEnginx (Neusoft)', 'Sabre Firewall (Sabre)', 'Safe3 Web Firewall (Safe3)', 'Safedog (SafeDog)', 'Safeline (Chaitin Tech.)', 'SecKing (SecKing)', 'SecuPress WP Security (SecuPress)', 'Secure Entry (United Security Providers)', 'SecureSphere (Imperva Inc.)', 'ServerDefender VP (Port80 Software)', 'Shadow Daemon (Zecure)', 'Shield Security (One Dollar Plugin)', 'SiteGround (SiteGround)', 'SiteGuard (Sakura Inc.)', 'Sitelock (TrueShield)', 'SonicWall (Dell)', 'Squarespace (Squarespace)', 'SquidProxy IDS (SquidProxy)', 'StackPath (StackPath)', 'Sucuri CloudProxy (Sucuri Inc.)', 'Tencent Cloud Firewall (Tencent Technologies)', 'Teros (Citrix Systems)', 'Trafficshield (F5 Networks)', 'TransIP Web Firewall (TransIP)', 'UEWaf (UCloud)', 'URLMaster SecurityCheck (iFinity/DotNetNuke)', 'URLScan (Microsoft)', 'UTM Web Protection (Sophos)', 'Variti (Variti)', 'Varnish (OWASP)', 'Viettel (Cloudrity)', 'VirusDie (VirusDie LLC)', 'WP Cerber Security (Cerber Tech)', 'WTS-WAF (WTS)', 'Wallarm (Wallarm Inc.)', 'WatchGuard (WatchGuard Technologies)', 'WebARX (WebARX Security Solutions)', 'WebKnight (AQTRONIX)', 'WebLand (WebLand)', 'WebSEAL (IBM)', 'WebTotem (WebTotem)', 'West263 CDN (West263CDN)', 'Wordfence (Defiant)', 'XLabs Security WAF (XLabs)', 'Xuanwudun (Xuanwudun)', 'YXLink (YxLink Technologies)', 'Yundun (Yundun)', 'Yunjiasu (Baidu Cloud Computing)', 'Yunsuo (Yunsuo)', 'ZScaler (Accenture)', 'Zenedge (Zenedge)', 'aeSecure (aeSecure)', 'eEye SecureIIS (BeyondTrust)', 'pkSecurity IDS (pkSec)', 'wpmudev WAF (Incsub)' ]��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������wafw00f-2.3.1/wafw00f/__init__.py�������������������������������������������������������������������0000664�0001750�0001750�00000000113�14734711633�016264� 0����������������������������������������������������������������������������������������������������ustar �epsilon�������������������������epsilon����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/usr/bin/env python3 __version__ = '2.3.1' __license__ = 'BSD 3-Clause' �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������wafw00f-2.3.1/wafw00f/bin/��������������������������������������������������������������������������0000775�0001750�0001750�00000000000�14734711633�014730� 5����������������������������������������������������������������������������������������������������ustar �epsilon�������������������������epsilon����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������wafw00f-2.3.1/wafw00f/bin/wafw00f�������������������������������������������������������������������0000775�0001750�0001750�00000000136�14734711633�016130� 0����������������������������������������������������������������������������������������������������ustar �epsilon�������������������������epsilon����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/usr/bin/env python from wafw00f import main if __name__ == '__main__': main.main() ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������wafw00f-2.3.1/wafw00f/lib/��������������������������������������������������������������������������0000775�0001750�0001750�00000000000�14734711633�014726� 5����������������������������������������������������������������������������������������������������ustar �epsilon�������������������������epsilon����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������wafw00f-2.3.1/wafw00f/lib/__init__.py���������������������������������������������������������������0000664�0001750�0001750�00000000000�14734711633�017025� 0����������������������������������������������������������������������������������������������������ustar �epsilon�������������������������epsilon����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������wafw00f-2.3.1/wafw00f/lib/evillib.py����������������������������������������������������������������0000775�0001750�0001750�00000004352�14734711633�016735� 0����������������������������������������������������������������������������������������������������ustar �epsilon�������������������������epsilon����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/usr/bin/env python3 ''' Copyright (C) 2024, WAFW00F Developers. See the LICENSE file for copying permission. ''' import time import logging from copy import copy import requests import urllib3 # For requests < 2.16, this should be used. # requests.packages.urllib3.disable_warnings(InsecureRequestWarning) # For requests >= 2.16, this is the convention urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning) def_headers = { 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3', 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:130.0) Gecko/20100101 Firefox/130.0', 'Accept-Language': 'en-US,en;q=0.5', 'Upgrade-Insecure-Requests': '1', 'Sec-Fetch-Dest': 'document', 'Sec-Fetch-Mode': 'navigate', 'Sec-Fetch-Site': 'cross-site', 'Priority': 'u=0, i', 'DNT': '1', } proxies = {} class waftoolsengine: def __init__( self, target='https://example.com', debuglevel=0, path='/', proxies=None, redir=True, head=None, timeout=7 ): self.target = target self.debuglevel = debuglevel self.requestnumber = 0 self.path = path self.redirectno = 0 self.allowredir = redir self.proxies = proxies self.log = logging.getLogger('wafw00f') self.timeout = timeout if head: self.headers = head else: self.headers = copy(def_headers) #copy object by value not reference. Fix issue #90 def Request(self, headers=None, path=None, params={}, delay=0): try: time.sleep(delay) if not headers: h = self.headers else: h = headers req = requests.get(self.target, proxies=self.proxies, headers=h, timeout=self.timeout, allow_redirects=self.allowredir, params=params, verify=False) self.log.info('Request Succeeded') self.log.debug('Headers: %s\n' % req.headers) self.log.debug('Content: %s\n' % req.content) self.requestnumber += 1 return req except requests.exceptions.RequestException as e: self.log.error('Something went wrong %s' % (e.__str__())) ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������wafw00f-2.3.1/wafw00f/lib/asciiarts.py��������������������������������������������������������������0000664�0001750�0001750�00000007006�14734711633�017265� 0����������������������������������������������������������������������������������������������������ustar �epsilon�������������������������epsilon����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/usr/bin/env python3 ''' Copyright (C) 2024, WAFW00F Developers. See the LICENSE file for copying permission. ''' from dataclasses import dataclass from random import randint from wafw00f import __version__ @dataclass class Color: """ANSI colors.""" W: str = '\033[1;97m' Y: str = '\033[1;93m' G: str = '\033[1;92m' R: str = '\033[1;91m' B: str = '\033[1;94m' C: str = '\033[1;96m' E: str = '\033[0m' @classmethod def disable(cls): """Disables all colors.""" cls.W = '' cls.Y = '' cls.G = '' cls.R = '' cls.B = '' cls.C = '' cls.E = '' @classmethod def unpack(cls): """Unpacks and returns the color values. Useful for brevity, e.g.: (W,Y,G,R,B,C,E) = Color.unpack() """ return ( cls.W, cls.Y, cls.G, cls.R, cls.B, cls.C, cls.E ) def randomArt(): # Colors for terminal (W,Y,G,R,B,C,E) = Color.unpack() woof = ''' '''+W+'''______ '''+W+'''/ \\ '''+W+'''( Woof! ) '''+W+r'''\ ____/ '''+R+''') '''+W+''',, '''+R+''') ('''+Y+'''_ '''+Y+'''.-. '''+W+'''- '''+G+'''_______ '''+R+'''( '''+Y+'''|__| '''+Y+'''()``; '''+G+'''|==|_______) '''+R+'''.)'''+Y+'''|__| '''+Y+'''/ (' '''+G+r'''/|\ '''+R+'''( '''+Y+'''|__| '''+Y+'''( / ) '''+G+r''' / | \ '''+R+'''. '''+Y+'''|__| '''+Y+r'''\(_)_)) '''+G+r'''/ | \ '''+Y+'''|__|'''+E+''' '''+C+'~ WAFW00F : '+B+'v'+__version__+''' ~'''+W+''' The Web Application Firewall Fingerprinting Toolkit '''+E w00f = ''' '''+W+'''______ '''+W+'''/ \\ '''+W+'''( W00f! ) '''+W+r'''\ ____/ '''+W+''',, '''+G+'''__ '''+Y+'''404 Hack Not Found '''+C+'''|`-.__ '''+G+'''/ / '''+R+''' __ __ '''+C+'''/" _/ '''+G+'''/_/ '''+R+r'''\ \ / / '''+B+'''*===* '''+G+'''/ '''+R+r'''\ \_/ / '''+Y+'''405 Not Allowed '''+C+'''/ )__// '''+R+r'''\ / '''+C+'''/| / /---` '''+Y+'''403 Forbidden '''+C+r'''\\/` \ | '''+R+'''/ _ \\ '''+C+r'''`\ /_\\_ '''+Y+'''502 Bad Gateway '''+R+r'''/ / \ \ '''+Y+'''500 Internal Error '''+C+'''`_____``-` '''+R+r'''/_/ \_\\ '''+C+'~ WAFW00F : '+B+'v'+__version__+''' ~'''+W+''' The Web Application Firewall Fingerprinting Toolkit '''+E wo0f = r''' ? ,. ( . ) . " __ ?? (" ) )' ,' ) . (` '` (___()'`; ??? .; ) ' (( (" ) ;(, (( ( ;) " )") /,___ /` _"., ,._'_.,)_(..,( . )_ _' )_') (. _..( ' ) \\ \\ |____|____|____|____|____|____|____|____|____| ~ WAFW00F : v'''+__version__+''' ~ ~ Sniffing Web Application Firewalls since 2014 ~ ''' arts = [woof, w00f, wo0f] return arts[randint(0, len(arts)-1)] ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������wafw00f-2.3.1/README.md�����������������������������������������������������������������������������0000664�0001750�0001750�00000030103�14734711633�014162� 0����������������������������������������������������������������������������������������������������ustar �epsilon�������������������������epsilon����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<h1 align="center"> <a href="https://github.com/enablesecurity/wafw00f"><img src="https://i.imgur.com/uAgp49o.png" alt="wafw00f"/></a> <br> WAFW00F </h1> <p align="center"> <b>The Web Application Firewall Fingerprinting Tool.</b> <br> <b> — From <a href="https://enablesecurity.com">Enable Security</a> </b> </p> <p align="center"> <a href="https://docs.python.org/3/download.html"> <img src="https://img.shields.io/badge/Python-3.x/2.x-green.svg"> </a> <a href="https://github.com/EnableSecurity/wafw00f/releases"> <img src="https://img.shields.io/badge/Version-v2.3.1%20(stable)-blue.svg"> </a> <a href="https://github.com/EnableSecurity/wafw00f/blob/master/LICENSE"> <img src="https://img.shields.io/badge/License-BSD%203%20Clause-orange.svg"> </a> <a href="https://app.travis-ci.com/github/EnableSecurity/wafw00f"> <img src="https://app.travis-ci.com/EnableSecurity/wafw00f.svg"> </a> </p> ## How does it work? To do its magic, WAFW00F does the following: - Sends a _normal_ HTTP request and analyses the response; this identifies a number of WAF solutions. - If that is not successful, it sends a number of (potentially malicious) HTTP requests and uses simple logic to deduce which WAF it is. - If that is also not successful, it analyses the responses previously returned and uses another simple algorithm to guess if a WAF or security solution is actively responding to our attacks. For further details, check out the source code on our [main repository](https://github.com/EnableSecurity/wafw00f). ## What does it detect? WAFW00F can detect a number of firewalls, a list of which is as below: ``` $ wafw00f -l ? ,. ( . ) . " __ ?? (" ) )' ,' ) . (` '` (___()'`; ??? .; ) ' (( (" ) ;(, (( ( ;) " )") /,___ /` _"., ,._'_.,)_(..,( . )_ _' )_') (. _..( ' ) \\ \\ |____|____|____|____|____|____|____|____|____| ~ WAFW00F : v2.3.1 ~ ~ Sniffing Web Application Firewalls since 2014 ~ [+] Can test for these WAFs: WAF Name Manufacturer -------- ------------ 360WangZhanBao 360 Technologies ACE XML Gateway Cisco ASP.NET Generic Microsoft ASPA Firewall ASPA Engineering Co. AWS Elastic Load Balancer Amazon AireeCDN Airee Airlock Phion/Ergon Alert Logic Alert Logic AliYunDun Alibaba Cloud Computing AnYu AnYu Technologies Anquanbao Anquanbao AppWall Radware Approach Approach Armor Defense Armor ArvanCloud ArvanCloud Astra Czar Securities Azion Edge Firewall Azion Azure Application Gateway Microsoft Azure Front Door Microsoft BIG-IP AP Manager F5 Networks BIG-IP AppSec Manager F5 Networks BIG-IP Local Traffic Manager F5 Networks Barikode Ethic Ninja Barracuda Barracuda Networks Bekchy Faydata Technologies Inc. Beluga CDN Beluga BinarySec BinarySec BitNinja BitNinja BlockDoS BlockDoS Bluedon Bluedon IST BulletProof Security Pro AITpro Security CacheFly CDN CacheFly CacheWall Varnish CdnNS Application Gateway CdnNs/WdidcNet ChinaCache Load Balancer ChinaCache Chuang Yu Shield Yunaq Cloud Protector Rohde & Schwarz CyberSecurity Cloudbric Penta Security Cloudflare Cloudflare Inc. Cloudfloor Cloudfloor DNS Cloudfront Amazon Comodo cWatch Comodo CyberSecurity CrawlProtect Jean-Denis Brun DDoS-GUARD DDOS-GUARD CORP. DOSarrest DOSarrest Internet Security DataPower IBM DenyALL Rohde & Schwarz CyberSecurity Distil Distil Networks DotDefender Applicure Technologies DynamicWeb Injection Check DynamicWeb Edgecast Verizon Digital Media Eisoo Cloud Firewall Eisoo Envoy EnvoyProxy Expression Engine EllisLab Fastly Fastly CDN FirePass F5 Networks FortiGate Fortinet FortiGuard Fortinet FortiWeb Fortinet GoDaddy Website Protection GoDaddy Google Cloud App Armor Google Cloud Greywizard Grey Wizard Huawei Cloud Firewall Huawei HyperGuard Art of Defense ISA Server Microsoft Imunify360 CloudLinux Incapsula Imperva Inc. IndusGuard Indusface Instart DX Instart Logic Janusec Application Gateway Janusec Jiasule Jiasule KS-WAF KnownSec Kemp LoadMaster Progress Software KeyCDN KeyCDN Kona SiteDefender Akamai LimeLight CDN LimeLight LiteSpeed LiteSpeed Technologies Malcare Inactiv MaxCDN MaxCDN Mission Control Shield Mission Control ModSecurity SpiderLabs NAXSI NBS Systems NSFocus NSFocus Global Inc. Nemesida PentestIt NetContinuum Barracuda Networks NetScaler AppFirewall Citrix Systems NevisProxy AdNovum Newdefend NewDefend NexusGuard Firewall NexusGuard NinjaFirewall NinTechNet NullDDoS Protection NullDDoS OnMessage Shield BlackBaud Open-Resty Lua Nginx FLOSS Oracle Cloud Oracle PT Application Firewall Positive Technologies Palo Alto Next Gen Firewall Palo Alto Networks PentaWAF Global Network Services PerimeterX PerimeterX PowerCDN PowerCDN Profense ArmorLogic Puhui Puhui Qcloud Tencent Cloud Qiniu Qiniu CDN Qrator Qrator RSFirewall RSJoomla! RayWAF WebRay Solutions Reblaze Reblaze RequestValidationMode Microsoft SEnginx Neusoft Sabre Firewall Sabre Safe3 Web Firewall Safe3 Safedog SafeDog Safeline Chaitin Tech. SecKing SecKing SecuPress WP Security SecuPress Secure Entry United Security Providers SecureSphere Imperva Inc. ServerDefender VP Port80 Software Shadow Daemon Zecure Shield Security One Dollar Plugin SiteGround SiteGround SiteGuard Sakura Inc. Sitelock TrueShield SonicWall Dell Squarespace Squarespace SquidProxy IDS SquidProxy StackPath StackPath Sucuri CloudProxy Sucuri Inc. Tencent Cloud Firewall Tencent Technologies Teros Citrix Systems Trafficshield F5 Networks TransIP Web Firewall TransIP UEWaf UCloud URLMaster SecurityCheck iFinity/DotNetNuke URLScan Microsoft UTM Web Protection Sophos Variti Variti Varnish OWASP Viettel Cloudrity VirusDie VirusDie LLC WP Cerber Security Cerber Tech WTS-WAF WTS Wallarm Wallarm Inc. WatchGuard WatchGuard Technologies WebARX WebARX Security Solutions WebKnight AQTRONIX WebLand WebLand WebSEAL IBM WebTotem WebTotem West263 CDN West263CDN Wordfence Defiant XLabs Security WAF XLabs Xuanwudun Xuanwudun YXLink YxLink Technologies Yundun Yundun Yunjiasu Baidu Cloud Computing Yunsuo Yunsuo ZScaler Accenture Zenedge Zenedge aeSecure aeSecure eEye SecureIIS BeyondTrust pkSecurity IDS pkSec wpmudev WAF Incsub Shieldon Firewall Shieldon.io ``` ## How do I use it? First, install the tools as described [here](#how-do-i-install-it). For help you can make use of the `--help` option. The basic usage is to pass an URL as an argument. Example: ``` $ wafw00f https://example.org ______ / \ ( Woof! ) \ ____/ ) ,, ) (_ .-. - _______ ( |__| ()``; |==|_______) .)|__| / (' /|\ ( |__| ( / ) / | \ . |__| \(_)_)) / | \ |__| ~ WAFW00F : v2.3.1 ~ The Web Application Firewall Fingerprinting Toolkit [*] Checking https://example.org [+] The site https://example.org is behind Edgecast (Verizon Digital Media) WAF. [~] Number of requests: 2 ``` ## How do I install it? ### Install from PyPI (recommended) Run: ``` python3 -m pip install wafw00f ``` or ``` pip3 install wafw00f ``` ### Via Docker It is also possible to run it within a docker container. Clone this repository first and build the Docker image using: ``` docker build . -t wafw00f ``` Now you can run: ``` docker run --rm -it wafw00f https://example.com ``` ### From source > NOTE: Be careful to not break your system packages while installing wafw00f. Use venv as and when required. Clone the repository: ``` git clone https://github.com/enablesecurity/wafw00f.git ``` Then: ``` cd wafw00f/ python3 -m pip install . ``` Or, by using pipx directly: ``` pipx install git+https://github.com/EnableSecurity/wafw00f.git ``` ## Final Words __Questions?__ Pull up an [issue on GitHub Issue Tracker](https://github.com/enablesecurity/wafw00f/issues/new) or contact [me](mailto:sandro@enablesecurity.com). [Pull requests](https://github.com/enablesecurity/wafw00f/pulls), [ideas and issues](https://github.com/enablesecurity/wafw00f/issues) are highly welcome. Some useful links: - [Documentation/Wiki](https://github.com/enablesecurity/wafw00f/wiki/) - [Pypi Package Repository](https://pypi.org/project/wafw00f) Presently being developed and maintained by: - Sandro Gauci ([@SandroGauci](https://twitter.com/sandrogauci)) - Pinaki Mondal ([@0xInfection](https://twitter.com/0xinfection)) �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������wafw00f-2.3.1/Makefile������������������������������������������������������������������������������0000664�0001750�0001750�00000000523�14734711633�014346� 0����������������������������������������������������������������������������������������������������ustar �epsilon�������������������������epsilon����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������SRC_DIR = wafw00f DOC_DIR = docs MAKE = make all: make install make test make html make clean install: pip install -q -e .[dev,docs] lint: prospector $(SRC_DIR) --strictness veryhigh testall: tox html: cd $(DOC_DIR) && $(MAKE) html clean: rm -rf *.egg-info build dist .coverage find $(SRC_DIR) -name "*.pyc" | xargs rm -rf �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������wafw00f-2.3.1/docs/���������������������������������������������������������������������������������0000775�0001750�0001750�00000000000�14734711633�013636� 5����������������������������������������������������������������������������������������������������ustar �epsilon�������������������������epsilon����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������wafw00f-2.3.1/docs/conf.py��������������������������������������������������������������������������0000664�0001750�0001750�00000020137�14734711633�015140� 0����������������������������������������������������������������������������������������������������ustar �epsilon�������������������������epsilon����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������# -*- coding: utf-8 -*- # # wafw00f documentation build configuration file, created by # sphinx-quickstart on Thu May 15 20:04:22 2014. # # This file is execfile()d with the current directory set to its # containing dir. # # Note that not all possible configuration values are present in this # autogenerated file. # # All configuration values have a default; values that are commented out # serve to show the default. import os import sys BASE_DIR = os.path.dirname(os.path.dirname(os.path.realpath(__file__))) sys.path.insert(0, BASE_DIR) from wafw00f import __version__ # If extensions (or modules to document with autodoc) are in another directory, # add these directories to sys.path here. If the directory is relative to the # documentation root, use os.path.abspath to make it absolute, like shown here. #sys.path.insert(0, os.path.abspath('.')) # -- General configuration ------------------------------------------------ # If your documentation needs a minimal Sphinx version, state it here. #needs_sphinx = '1.0' # Add any Sphinx extension module names here, as strings. They can be # extensions coming with Sphinx (named 'sphinx.ext.*') or your custom # ones. extensions = [] # Add any paths that contain templates here, relative to this directory. templates_path = ['_templates'] # The suffix of source filenames. source_suffix = '.rst' # The encoding of source files. #source_encoding = 'utf-8-sig' # The master toctree document. master_doc = 'index' # General information about the project. project = u'wafw00f' copyright = u'2020, WAFW00F Developers' # The version info for the project you're documenting, acts as replacement for # |version| and |release|, also used in various other places throughout the # built documents. # # The short X.Y version. version = __version__ # The full version, including alpha/beta/rc tags. release = __version__ # The language for content autogenerated by Sphinx. Refer to documentation # for a list of supported languages. #language = None # There are two options for replacing |today|: either, you set today to some # non-false value, then it is used: #today = '' # Else, today_fmt is used as the format for a strftime call. #today_fmt = '%B %d, %Y' # List of patterns, relative to source directory, that match files and # directories to ignore when looking for source files. exclude_patterns = ['_build'] # The reST default role (used for this markup: `text`) to use for all # documents. #default_role = None # If true, '()' will be appended to :func: etc. cross-reference text. #add_function_parentheses = True # If true, the current module name will be prepended to all description # unit titles (such as .. function::). #add_module_names = True # If true, sectionauthor and moduleauthor directives will be shown in the # output. They are ignored by default. #show_authors = False # The name of the Pygments (syntax highlighting) style to use. pygments_style = 'sphinx' # A list of ignored prefixes for module index sorting. #modindex_common_prefix = [] # If true, keep warnings as "system message" paragraphs in the built documents. #keep_warnings = False # -- Options for HTML output ---------------------------------------------- # The theme to use for HTML and HTML Help pages. See the documentation for # a list of builtin themes. html_theme = 'default' # Theme options are theme-specific and customize the look and feel of a theme # further. For a list of options available for each theme, see the # documentation. #html_theme_options = {} # Add any paths that contain custom themes here, relative to this directory. #html_theme_path = [] # The name for this set of Sphinx documents. If None, it defaults to # "<project> v<release> documentation". #html_title = None # A shorter title for the navigation bar. Default is the same as html_title. #html_short_title = None # The name of an image file (relative to this directory) to place at the top # of the sidebar. #html_logo = None # The name of an image file (within the static path) to use as favicon of the # docs. This file should be a Windows icon file (.ico) being 16x16 or 32x32 # pixels large. #html_favicon = None # Add any paths that contain custom static files (such as style sheets) here, # relative to this directory. They are copied after the builtin static files, # so a file named "default.css" will overwrite the builtin "default.css". html_static_path = ['_static'] # Add any extra paths that contain custom files (such as robots.txt or # .htaccess) here, relative to this directory. These files are copied # directly to the root of the documentation. #html_extra_path = [] # If not '', a 'Last updated on:' timestamp is inserted at every page bottom, # using the given strftime format. #html_last_updated_fmt = '%b %d, %Y' # If true, SmartyPants will be used to convert quotes and dashes to # typographically correct entities. #html_use_smartypants = True # Custom sidebar templates, maps document names to template names. #html_sidebars = {} # Additional templates that should be rendered to pages, maps page names to # template names. #html_additional_pages = {} # If false, no module index is generated. #html_domain_indices = True # If false, no index is generated. #html_use_index = True # If true, the index is split into individual pages for each letter. #html_split_index = False # If true, links to the reST sources are added to the pages. #html_show_sourcelink = True # If true, "Created using Sphinx" is shown in the HTML footer. Default is True. #html_show_sphinx = True # If true, "(C) Copyright ..." is shown in the HTML footer. Default is True. #html_show_copyright = True # If true, an OpenSearch description file will be output, and all pages will # contain a <link> tag referring to it. The value of this option must be the # base URL from which the finished HTML is served. #html_use_opensearch = '' # This is the file name suffix for HTML files (e.g. ".xhtml"). #html_file_suffix = None # Output file base name for HTML help builder. htmlhelp_basename = 'wafw00fdoc' # -- Options for LaTeX output --------------------------------------------- latex_elements = { # The paper size ('letterpaper' or 'a4paper'). #'papersize': 'letterpaper', # The font size ('10pt', '11pt' or '12pt'). #'pointsize': '10pt', # Additional stuff for the LaTeX preamble. #'preamble': '', } # Grouping the document tree into LaTeX files. List of tuples # (source start file, target name, title, # author, documentclass [howto, manual, or own class]). latex_documents = [ ('index', 'wafw00f.tex', u'wafw00f Documentation', u'sandrogauci', 'manual'), ] # The name of an image file (relative to this directory) to place at the top of # the title page. #latex_logo = None # For "manual" documents, if this is true, then toplevel headings are parts, # not chapters. #latex_use_parts = False # If true, show page references after internal links. #latex_show_pagerefs = False # If true, show URL addresses after external links. #latex_show_urls = False # Documents to append as an appendix to all manuals. #latex_appendices = [] # If false, no module index is generated. #latex_domain_indices = True # -- Options for manual page output --------------------------------------- # One entry per manual page. List of tuples # (source start file, name, description, authors, manual section). man_pages = [ ('index', 'wafw00f', u'wafw00f Documentation', [u'sandrogauci'], 1) ] # If true, show URL addresses after external links. #man_show_urls = False # -- Options for Texinfo output ------------------------------------------- # Grouping the document tree into Texinfo files. List of tuples # (source start file, target name, title, author, # dir menu entry, description, category) texinfo_documents = [ ('index', 'wafw00f', u'wafw00f Documentation', u'sandrogauci', 'wafw00f', 'One line description of project.', 'Miscellaneous'), ] # Documents to append as an appendix to all manuals. #texinfo_appendices = [] # If false, no module index is generated. #texinfo_domain_indices = True # How to display URL addresses: 'footnote', 'no', or 'inline'. #texinfo_show_urls = 'footnote' # If true, do not generate a @detailmenu in the "Top" node's menu. #texinfo_no_detailmenu = False ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������wafw00f-2.3.1/docs/index.rst������������������������������������������������������������������������0000664�0001750�0001750�00000000652�14734711633�015502� 0����������������������������������������������������������������������������������������������������ustar �epsilon�������������������������epsilon����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������.. wafw00f documentation master file, created by sphinx-quickstart on Thu May 15 20:04:22 2014. You can adapt this file completely to your liking, but it should at least contain the root `toctree` directive. Welcome to wafw00f's documentation! =================================== Contents: .. toctree:: :maxdepth: 2 Indices and tables ================== * :ref:`genindex` * :ref:`modindex` * :ref:`search` ��������������������������������������������������������������������������������������wafw00f-2.3.1/docs/Makefile�������������������������������������������������������������������������0000664�0001750�0001750�00000015156�14734711633�015306� 0����������������������������������������������������������������������������������������������������ustar �epsilon�������������������������epsilon����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Makefile for Sphinx documentation # # You can set these variables from the command line. SPHINXOPTS = SPHINXBUILD = sphinx-build PAPER = BUILDDIR = _build # User-friendly check for sphinx-build ifeq ($(shell which $(SPHINXBUILD) >/dev/null 2>&1; echo $$?), 1) $(error The '$(SPHINXBUILD)' command was not found. Make sure you have Sphinx installed, then set the SPHINXBUILD environment variable to point to the full path of the '$(SPHINXBUILD)' executable. Alternatively you can add the directory with the executable to your PATH. If you don't have Sphinx installed, grab it from http://sphinx-doc.org/) endif # Internal variables. PAPEROPT_a4 = -D latex_paper_size=a4 PAPEROPT_letter = -D latex_paper_size=letter ALLSPHINXOPTS = -d $(BUILDDIR)/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) . # the i18n builder cannot share the environment and doctrees with the others I18NSPHINXOPTS = $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) . .PHONY: help clean html dirhtml singlehtml pickle json htmlhelp qthelp devhelp epub latex latexpdf text man changes linkcheck doctest gettext help: @echo "Please use \`make <target>' where <target> is one of" @echo " html to make standalone HTML files" @echo " dirhtml to make HTML files named index.html in directories" @echo " singlehtml to make a single large HTML file" @echo " pickle to make pickle files" @echo " json to make JSON files" @echo " htmlhelp to make HTML files and a HTML help project" @echo " qthelp to make HTML files and a qthelp project" @echo " devhelp to make HTML files and a Devhelp project" @echo " epub to make an epub" @echo " latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter" @echo " latexpdf to make LaTeX files and run them through pdflatex" @echo " latexpdfja to make LaTeX files and run them through platex/dvipdfmx" @echo " text to make text files" @echo " man to make manual pages" @echo " texinfo to make Texinfo files" @echo " info to make Texinfo files and run them through makeinfo" @echo " gettext to make PO message catalogs" @echo " changes to make an overview of all changed/added/deprecated items" @echo " xml to make Docutils-native XML files" @echo " pseudoxml to make pseudoxml-XML files for display purposes" @echo " linkcheck to check all external links for integrity" @echo " doctest to run all doctests embedded in the documentation (if enabled)" clean: rm -rf $(BUILDDIR)/* html: $(SPHINXBUILD) -b html $(ALLSPHINXOPTS) $(BUILDDIR)/html @echo @echo "Build finished. The HTML pages are in $(BUILDDIR)/html." dirhtml: $(SPHINXBUILD) -b dirhtml $(ALLSPHINXOPTS) $(BUILDDIR)/dirhtml @echo @echo "Build finished. The HTML pages are in $(BUILDDIR)/dirhtml." singlehtml: $(SPHINXBUILD) -b singlehtml $(ALLSPHINXOPTS) $(BUILDDIR)/singlehtml @echo @echo "Build finished. The HTML page is in $(BUILDDIR)/singlehtml." pickle: $(SPHINXBUILD) -b pickle $(ALLSPHINXOPTS) $(BUILDDIR)/pickle @echo @echo "Build finished; now you can process the pickle files." json: $(SPHINXBUILD) -b json $(ALLSPHINXOPTS) $(BUILDDIR)/json @echo @echo "Build finished; now you can process the JSON files." htmlhelp: $(SPHINXBUILD) -b htmlhelp $(ALLSPHINXOPTS) $(BUILDDIR)/htmlhelp @echo @echo "Build finished; now you can run HTML Help Workshop with the" \ ".hhp project file in $(BUILDDIR)/htmlhelp." qthelp: $(SPHINXBUILD) -b qthelp $(ALLSPHINXOPTS) $(BUILDDIR)/qthelp @echo @echo "Build finished; now you can run "qcollectiongenerator" with the" \ ".qhcp project file in $(BUILDDIR)/qthelp, like this:" @echo "# qcollectiongenerator $(BUILDDIR)/qthelp/wafw00f.qhcp" @echo "To view the help file:" @echo "# assistant -collectionFile $(BUILDDIR)/qthelp/wafw00f.qhc" devhelp: $(SPHINXBUILD) -b devhelp $(ALLSPHINXOPTS) $(BUILDDIR)/devhelp @echo @echo "Build finished." @echo "To view the help file:" @echo "# mkdir -p $$HOME/.local/share/devhelp/wafw00f" @echo "# ln -s $(BUILDDIR)/devhelp $$HOME/.local/share/devhelp/wafw00f" @echo "# devhelp" epub: $(SPHINXBUILD) -b epub $(ALLSPHINXOPTS) $(BUILDDIR)/epub @echo @echo "Build finished. The epub file is in $(BUILDDIR)/epub." latex: $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex @echo @echo "Build finished; the LaTeX files are in $(BUILDDIR)/latex." @echo "Run \`make' in that directory to run these through (pdf)latex" \ "(use \`make latexpdf' here to do that automatically)." latexpdf: $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex @echo "Running LaTeX files through pdflatex..." $(MAKE) -C $(BUILDDIR)/latex all-pdf @echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex." latexpdfja: $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex @echo "Running LaTeX files through platex and dvipdfmx..." $(MAKE) -C $(BUILDDIR)/latex all-pdf-ja @echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex." text: $(SPHINXBUILD) -b text $(ALLSPHINXOPTS) $(BUILDDIR)/text @echo @echo "Build finished. The text files are in $(BUILDDIR)/text." man: $(SPHINXBUILD) -b man $(ALLSPHINXOPTS) $(BUILDDIR)/man @echo @echo "Build finished. The manual pages are in $(BUILDDIR)/man." texinfo: $(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo @echo @echo "Build finished. The Texinfo files are in $(BUILDDIR)/texinfo." @echo "Run \`make' in that directory to run these through makeinfo" \ "(use \`make info' here to do that automatically)." info: $(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo @echo "Running Texinfo files through makeinfo..." make -C $(BUILDDIR)/texinfo info @echo "makeinfo finished; the Info files are in $(BUILDDIR)/texinfo." gettext: $(SPHINXBUILD) -b gettext $(I18NSPHINXOPTS) $(BUILDDIR)/locale @echo @echo "Build finished. The message catalogs are in $(BUILDDIR)/locale." changes: $(SPHINXBUILD) -b changes $(ALLSPHINXOPTS) $(BUILDDIR)/changes @echo @echo "The overview file is in $(BUILDDIR)/changes." linkcheck: $(SPHINXBUILD) -b linkcheck $(ALLSPHINXOPTS) $(BUILDDIR)/linkcheck @echo @echo "Link check complete; look for any errors in the above output " \ "or in $(BUILDDIR)/linkcheck/output.txt." doctest: $(SPHINXBUILD) -b doctest $(ALLSPHINXOPTS) $(BUILDDIR)/doctest @echo "Testing of doctests in the sources finished, look at the " \ "results in $(BUILDDIR)/doctest/output.txt." xml: $(SPHINXBUILD) -b xml $(ALLSPHINXOPTS) $(BUILDDIR)/xml @echo @echo "Build finished. The XML files are in $(BUILDDIR)/xml." pseudoxml: $(SPHINXBUILD) -b pseudoxml $(ALLSPHINXOPTS) $(BUILDDIR)/pseudoxml @echo @echo "Build finished. The pseudo-XML files are in $(BUILDDIR)/pseudoxml." ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������wafw00f-2.3.1/docs/wafw00f.8������������������������������������������������������������������������0000664�0001750�0001750�00000005254�14734711633�015207� 0����������������������������������������������������������������������������������������������������ustar �epsilon�������������������������epsilon����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������.TH WAFW00F "8" "October 2020" "wafw00f " "User Commands" .SH NAME WAFW00F \- Identify and fingerprint Web Application Firewall products .SH SYNOPSIS .B wafw00f \fI\,url1 \/\fR[\fI\,url2 \/\fR[\fI\,url3 \/\fR... ]] .SH DESCRIPTION .TP The Web Application Firewall Identification and Fingerprinting Tool. .TP .TP To do its magic, WAFW00F does the following: Sends a normal HTTP request and analyses the response; this identifies a number of WAF solutions. If that is not successful, it sends a number of (potentially malicious) HTTP requests and uses simple logic to deduce which WAF it is. If that is also not successful, it analyses the responses previously returned and uses another simple algorithm to guess if a WAF or security solution is active> .SH OPTIONS .TP \fB\-h\fR, \fB\-\-help\fR Show available options. .TP \fB\-v\fR, \fB\-\-verbose\fR Enable verbosity \- multiple \fB\-v\fR options increase verbosity. .TP \fB\-a\fR, \fB\-\-findall\fR Find all WAFs, do not stop testing on the first one. .TP \fB\-r\fR, \fB\-\-noredirect\fR Do not follow redirections given by 3xx responses. .TP \fB\-t\fR WAF, \fB\-\-test\fR=\fI\,WAF\/\fR Test for one specific WAF product. .TP \fB\-o\fR OUTPUT, \fB\-\-output\fR=\fI\,OUTPUT\/\fR Write output to csv, json or text file depending on file extension. For stdout, specify - as filename. .TP \fB\-f\fR, \fB\-\-format\fR=\fI\,FORMAT\/\fR Force output format to csv, json or text. .TP \fB\-i\fR INPUT, \fB\-\-input\fR=\fI\,INPUT\/\fR 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. .TP \fB\-l\fR, \fB\-\-list\fR List all the WAFs that WAFW00F is able to detect. .TP \fB\-p\fR PROXY, \fB\-\-proxy\fR=\fI\,PROXY\/\fR Use an HTTP proxy to perform requests, example: http://hostname:8080, socks5://hostname:1080. .TP \fB\-V\fR, \fB\-\-version\fR Print out the version. .TP \fB\-H\fR FILE, \fB\-\-headers\fR=\fI\,FILE\/\fR Pass custom headers, for example to overwrite the default user\-agent string. .TP \fB\-T\fR TIMEOUT, \fB\-\-timeout\fR=\fI\,TIMEOUT\/\fR Set the timeout for the requests. .TP \fB\-\-no\-colors\fR Disable ANSI colors in output. .SH AUTHORS Sandro Gauci (@SandroGauci) .br Pinaki Mondal (@0xInfection) .SH REPORTING BUGS You can report bugs at the project homepage issue tracker: <https://github.com/EnableSecurity/wafw00f/issues/>. .SH COPYRIGHT Copyright (C) 2009-2022 WAFW00F Developers. License: BSD 3-Clause <https://opensource.org/licenses/BSD-3-Clause>. .br This is free software: you are free to modify and distribute under the terms as permitted by the license provided alongwith. .SH SEE ALSO Full documentation is available at: <https://github.com/EnableSecurity/wafw00f/wiki/>. .PP ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������