-
Notifications
You must be signed in to change notification settings - Fork 53
/
waf.py
118 lines (103 loc) · 5.56 KB
/
waf.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
import re
import requests
from concurrent.futures import ThreadPoolExecutor, as_completed
from urllib.parse import urlparse
import Hx_config
'''
输入:待检测的url列表
功能:检测该url是否有waf
输出:没有waf的列表
'''
class WAF(object):
def __init__(self, __list):
self.__list = __list
self.__result = []
self.__waf_info()
def __once_detect(self, url):
headers = Hx_config.GetHeaders()
headers["Referer"] = url
try:
resp = requests.get(url, headers=headers, timeout=3)
if resp.status_code < 400:
if self.__identify(resp.headers, resp.text):
parse = urlparse(resp.url)
new_url = "%s://%s/" % (parse.scheme, parse.netloc)
self.__result.append(new_url)
self.__result.append(url)
except:
print(f"{Hx_config.red}WAF~ {url} 网络连接失败{Hx_config.end}")
return
def run_detect(self):
print(f"{Hx_config.green}WAF检测中~{Hx_config.end}")
with ThreadPoolExecutor() as pool:
pool.map(self.__once_detect, self.__list)
as_completed(True)
print(f"{Hx_config.blue}检测完毕,没有WAF的url:")
for item in list(set(self.__result)):
print(item)
print(Hx_config.end)
return list(set(self.__result))
def __waf_info(self):
self.__mark_list = []
all_waf = '''WAF:Topsec-Waf|index|index|<META NAME="Copyright" CONTENT="Topsec Network Security Technology Co.,Ltd"/>|<META NAME="DESCRIPTION" CONTENT="Topsec web UI"/>
WAF:360|headers|X-Powered-By-360wzb|wangzhan\.360\.cn
WAF:360|url|/wzws-waf-cgi/|360wzws
WAF:Anquanbao|headers|X-Powered-By-Anquanbao|MISS
WAF:Anquanbao|url|/aqb_cc/error/|ASERVER
WAF:BaiduYunjiasu|headers|Server|yunjiasu-nginx
WAF:BigIP|headers|Server|BigIP|BIGipServer
WAF:BigIP|headers|Set-Cookie|BigIP|BIGipServer
WAF:BinarySEC|headers|x-binarysec-cache|fill|miss
WAF:BinarySEC|headers|x-binarysec-via|binarysec\.com
WAF:BlockDoS|headers|Server|BlockDos\.net
WAF:CloudFlare|headers|Server|cloudflare-nginx
WAF:Cloudfront|headers|Server|cloudfront
WAF:Cloudfront|headers|X-Cache|cloudfront
WAF:Comodo|headers|Server|Protected by COMODO
WAF:IBM-DataPower|headers|X-Backside-Transport|\A(OK|FAIL)
WAF:DenyAll|headers|Set-Cookie|\Asessioncookie=
WAF:dotDefender|headers|X-dotDefender-denied|1
WAF:Incapsula|headers|X-CDN|Incapsula
WAF:Jiasule|headers|Set-Cookie|jsluid=
WAF:KSYUN|headers|Server|KSYUN ELB
WAF:KONA|headers|Server|AkamaiGHost
WAF:ModSecurity|headers|Server|Mod_Security|NOYB
WAF:NetContinuum|headers|Cneonction|\Aclose
WAF:NetContinuum|headers|nnCoection|\Aclose
WAF:NetContinuum|headers|Set-Cookie|citrix_ns_id
WAF:Newdefend|headers|Server|newdefend
WAF:NSFOCUS|headers|Server|NSFocus
WAF:Safe3|headers|X-Powered-By|Safe3WAF
WAF:Safe3|headers|Server|Safe3 Web Firewall
WAF:Safedog|headers|X-Powered-By|WAF/2\.0
WAF:Safedog|headers|Server|Safedog
WAF:Safedog|headers|Set-Cookie|Safedog
WAF:SonicWALL|headers|Server|SonicWALL
WAF:Stingray|headers|Set-Cookie|\AX-Mapping-
WAF:Sucuri|headers|Server|Sucuri/Cloudproxy
WAF:Usp-Sec|headers|Server|Secure Entry Server
WAF:Varnish|headers|X-Varnish|.*?
WAF:Varnish|headers|Server|varnish
WAF:Wallarm|headers|Server|nginx-wallarm
WAF:WebKnight|headers|Server|WebKnight
WAF:Yundun|headers|Server|YUNDUN
WAF:Yundun|headers|X-Cache|YUNDUN
WAF:Yunsuo|headers|Set-Cookie|yunsuo
'''
marks = all_waf.strip().splitlines() # 按行显示
for mark in marks:
name, location, key, value = mark.strip().split("|", 3)
self.__mark_list.append([name, location, key, value])
def __identify(self, header, html):
for line in self.__mark_list:
name, location, key, reg = line
if location == "headers":
if key in header and re.search(reg, header[key], re.I):
return False
elif location == "index":
if re.search(reg, html, re.I):
return False
return True
if __name__ == '__main__':
list1 = WAF(['http://59.63.200.79:8014/dom_xss/', 'https://qq.com'])
list1.run_detect()