Files
XSStrike/core/wafDetector.py

44 lines
1.6 KiB
Python
Raw Normal View History

import json
import re
2018-10-27 18:58:52 +05:30
from core.requester import requester
2018-11-16 21:13:45 +05:30
2018-11-10 17:33:48 +05:30
def wafDetector(url, params, headers, GET, delay, timeout):
with open('./db/wafSignatures.json', 'r') as file:
wafSignatures = json.load(file)
2018-11-16 21:13:45 +05:30
# a payload which is noisy enough to provoke the WAF
noise = '<script>alert("XSS")</script>'
2018-10-27 18:58:52 +05:30
params['xss'] = noise
2018-11-16 21:13:45 +05:30
# Opens the noise injected payload
response = requester(url, params, headers, GET, delay, timeout)
page = response.text
2018-10-27 18:58:52 +05:30
code = str(response.status_code)
headers = str(response.headers)
if int(code) >= 400:
bestMatch = [0, None]
for wafName, wafSignature in wafSignatures.items():
score = 0
pageSign = wafSignature['page']
codeSign = wafSignature['code']
headersSign = wafSignature['headers']
if pageSign:
if re.search(pageSign, page, re.I):
score += 1
if codeSign:
if re.search(codeSign, code, re.I):
2018-11-16 21:13:45 +05:30
score += 0.5 # increase the overall score by a smaller amount because http codes aren't strong indicators
if headersSign:
if re.search(headersSign, headers, re.I):
score += 1
2018-11-16 21:13:45 +05:30
# if the overall score of the waf is higher than the previous one
if score > bestMatch[0]:
2018-11-16 21:13:45 +05:30
del bestMatch[:] # delete the previous one
bestMatch.extend([score, wafName]) # and add this one
if bestMatch[0] != 0:
return bestMatch[1]
else:
return None
else:
return None