
CVE-2019-3396 के लिए चरण-दर-चरण विश्लेषण और शोषण मार्गदर्शिका, जो Confluence Server & Data Center में एक गंभीर SSTI भेद्यता है, जिसमें डिबगिंग और RCE पेलोड निष्पादन शामिल है।
प्रभावित उत्पाद: Confluence Server & Data Center
प्रभावित संस्करण: 6.0.0 से 6.15.4 तक
गंभीरता स्तर: Critical (CVSS ~9.8)
कारण:
Confluence में Widget Connector प्लगिन है (वीडियो, बाहरी सामग्री जैसे YouTube, Vimeo आदि एम्बेड करने के लिए)।
यह कार्यक्षमता उपयोगकर्ता के इनपुट को सही ढंग से नियंत्रित नहीं करती, जिससे Server-Side Template Injection (SSTI) होता है।
हमलावर दुर्भावनापूर्ण payload भेज सकता है → Confluence इसे Velocity template engine द्वारा render करता है → सर्वर पर कोड निष्पादित होता है।
https://www.atlassian.com/software/confluence/downloads/binary/atlassian-confluence-6.9.0.zip
https://nguyendt.hashnode.dev/confluence-cve-2019-3396




Widget Connector का उल्लेख है, हम Confluence के सोर्स फोल्डर में खोजते हैं
com.atlassian.confluence.extra.widgetconnector.WidgetMacro.class पर breakpoint सेट करेंDefaultRenderManager.class क्लास को कॉल करें
getEmbeddedHtml() फ़ंक्शन उपयोग होता है
YoutubeRenderer क्लास में जाएंurl → वह मूल YouTube लिंक जो उपयोगकर्ता ने डाला हैparams → एक map जिसमें render करने के लिए कॉन्फ़िगरेशन पैरामीटर होते हैं (उदाहरण: चौड़ाई, ऊँचाई, render के लिए टेम्पलेट आदि)।
getEmbedUrl(), setDefaultParam() और DefaultVelocityRenderService.render() को कॉल करते हैंsetDefaultParam() पर ध्यान केंद्रित करें
यदि _template नहीं है → डिफ़ॉल्ट टेम्पलेट youtube.vm असाइन करें।
=> इसलिए प्रोग्राम में _template को स्वयं जोड़ा जा सकता है
अगला, DefaultVelocityRenderService.render() में जाएं
फ़ंक्शन का उद्देश्य
url और params पैरामीटर लेता है।
Velocity टेम्पलेट (.vm) का उपयोग करके एम्बेडेड HTML (iframe, embed, …) render करता है।
टेम्पलेट पहचानना
यदि params में _template है → उस टेम्पलेट का उपयोग करें।
यदि नहीं → डिफ़ॉल्ट embed.vm का उपयोग करें।
MacroUtils.defaultVelocityContext() द्वारा डिफ़ॉल्ट context बनाएं।
सभी पैरामीटर को params से context में डालें:
यदि key = tweetHtml है → HTML को वैसे ही रखें।
अन्यथा → GeneralUtil.htmlEncode() द्वारा सुरक्षित encode करें।
context में urlHtml, width, height जोड़ें (यदि खाली हैं तो डिफ़ॉल्ट 400 × 300 असाइन करें)।

VelocityUtils.getRenderedTemplate() को कॉल करें
getRenderedTemplate और getRenderedTemplateWithoutSwallowingErrors() को कॉल किया गया
getTemplate() को कॉल करें
यहाँ templateName वही _template है जो ऊपर है।
आगे VelocityEngine.Template() को कॉल करें

VelocityEngine क्लास में RuntimeInstance.getTemplate() को कॉल करें
RuntimeInstance (Velocity core)
यह Velocity Engine का "दिल" है। यह निम्न कार्य करता है:
Engine आरंभ करना (init)
कॉन्फ़िगरेशन, मैक्रो, parser, directives, event handlers आदि प्रबंधित करना
और विशेष रूप से: ResourceManager के माध्यम से resource प्रबंधित करना
→ इसका मतलब है कि RuntimeInstance खुद resource लोड नहीं करता, बल्कि resourceManager को अधिकार सौंपता है।
CompatibleVelocityResourceManager.getResource() को कॉल करें
ConfigurableResourceManager (Confluence custom)
यह ResourceManager इंटरफ़ेस का एक implementation है।
यह निम्न के लिए ज़िम्मेदार है:
resource loaders प्रबंधित करना (file loader, classpath loader, URL loader…)।
globalCache प्रबंधित करना (resourceKey के अनुसार टेम्पलेट कैश करना)।
जब RuntimeInstance अनुरोध करता है तो टेम्पलेट (.vm फ़ाइल) लोड/refresh करना।

try {
this.refreshResource(resource, encoding);
} catch (ResourceNotFoundException var7) {
this.globalCache.remove(resourceKey);
return this.getResource(resourceName, resourceType, encoding);
}
जब resource कैश में होता है, तो यह तुरंत नहीं लौटाता, बल्कि refreshResource(...) को कॉल करता है।
refreshResource डिस्क पर lastModified time की तुलना कैश से करता है।
यदि फ़ाइल बदल गई है → कैश में resource अमान्य हो जाएगा → डिस्क से पुनः लोड होगा → कैश अपडेट होगा।
👉 इसलिए आपको resourceKey को हाथ से बदलने की आवश्यकता नहीं है। refresh तंत्र सुनिश्चित करता है कि टेम्पलेट बदलने पर कैश भी अपडेट हो।
_template जोड़ें और अनुरोध फिर से भेजें

ResourceLoader इंस्टेंस की सूची (आरंभिक ऑब्जेक्ट) देखते हैं