
Atlassian Jira बिना प्रमाणीकरण टेम्पलेट इंजेक्शन
4.4.x
5.x.x
6.x.x
7.0.x
7.1.x
7.2.x
7.3.x
7.4.x
7.5.x
7.6.x before 7.6.14 (the fixed version for 7.6.x)
7.7.x
7.8.x
7.9.x
7.10.x
7.11.x
7.12.x
7.13.x before 7.13.5 (the fixed version for 7.13.x)
8.0.x before 8.0.3 (the fixed version for 8.0.x)
8.1.x before 8.1.2 (the fixed version for 8.1.x)
8.2.x before 8.2.3 (the fixed version for 8.2.x)
set JVM_SUPPORT_RECOMMENDED_ARGS= का मान ./bin/setenv.bat फ़ाइल में संपादित करें (या लिनक्स के लिए ./bin/setenv.sh के समान) ताकि रिमोट डिबग चलाया जा सके।set JVM_SUPPORT_RECOMMENDED_ARGS=-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005
Remote JVM Debug जिसमें host और port का मान localhost:5005 है और Command line aguments for remote JVM-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=*:5005
./bin/config.bat फ़ाइल चलाएँ (या लिनक्स के लिए config.sh फ़ाइल) और "Jira home" को अपने jira home निर्देशिका में संशोधित करें।

./bin/start-jira.bat फ़ाइल चलाएँ (या लिनक्स के लिए ./bin/start-jira.sh). अगर नहीं चलता है तो आप java version, port 8080 और 5005 की जाँच करें कि वे free हैं या नहीं!
हम private mode चुनते हैं।

इस चरण तक, आप एक ऐसे ईमेल पते का उपयोग करें जो ईमेल प्राप्त कर सके :)

कॉन्फ़िगर करें और कनेक्शन टेस्ट अच्छी तरह कर लें।

http://localhost:8080/secure/admin/EditApplicationProperties!default.jspa पर हम Contact Administrators Form सुविधा सक्षम करते हैं।

मैंने building के दौरान कुछ नोट्स ही लिखे हैं, आप building jira from source देख सकते हैं।
Advisory पढ़ने के बाद हमें पता चलता है कि यह बग ContactAdministrators और SendBulkMail में है (इसे मैं छोड़ देता हूँ क्योंकि इसके लिए प्रमाणीकरण आवश्यक है)। इसलिए मैं ContactAdministrators सुविधा का परीक्षण शुरू करता हूँ और अनुरोध पकड़ता हूँ।

मैं देखता हूँ कि अनुरोध /secure/ContactAdministrators.jspa पर जाता है, इसलिए मैं ./atlassian-jira/WEB-INF/web.xml फ़ाइल देखता हूँ कि यह अनुरोध किस क्लास में भेजा जाएगा।


इस तरह अनुरोध JiraWebworkActionDispatcher में संसाधित होगा, इसलिए मैंने इस क्लास के init और server पर breakpoint लगाया और डिबग चलाया।

इस तरह प्रोग्राम server फ़ंक्शन पर रुका, थोड़ा trace करने पर प्रोग्राम ContactAdministrators.doExecute() में प्रवेश करता है।

फिर send से गुजरते हुए, यहाँ प्रोग्राम सक्रिय एडमिन खातों की सूची बनाता है।

फिर प्रोग्राम sendTo फ़ंक्शन से गुजरता है। यहाँ हम देखते हैं कि प्रोग्राम एक MailQueueItem बनाता है और उसे mailQueue में जोड़ता है।

प्रोग्राम EmailBuilder.withSubject फ़ंक्शन को कॉल करता है। यहाँ ईमेल का subject स्ट्रिंग (हमलावर द्वारा भेजा गया) String से TemplateSources में परिवर्तित होता है और EmailBuilder के subjectTemplate पैरामीटर को सौंप दिया जाता है।

renderLater फ़ंक्शन में प्रोग्राम एक EmailRenderer बनाता है और उसका उपयोग RenderingMailQueueItem बनाने के लिए करता है।

यहाँ से, जब हम ContactAdministrators.sendTo फ़ंक्शन पर लौटते हैं। MailQueueItem बनाने के बाद प्रोग्राम आइटम को mailQueue में जोड़ता है और फिर Redirect के लिए doExecute फ़ंक्शन पर लौट जाता है। अगर हम इस डिबग प्रवाह का पालन करें, तो हम उस हिस्से तक नहीं पहुँच सकते जहाँ प्रोग्राम ईमेल render करता है, इसलिए template injection वाले हिस्से तक नहीं पहुँच सकते। तो ईमेल प्रोसेसिंग को ट्रैक करने के लिए मुझे क्या करना चाहिए???
मैंने देखा कि EmailRenderer में renderNow फ़ंक्शन है (प्रोग्राम केवल renderLater को कॉल करता है), मुझे लगा कि जब queue में ईमेल render के लिए बुलाया जाता है, तो वह भी renderNow के समान प्रवाह से गुजरेगा, इसलिए मैंने renderNow फ़ंक्शन से trace करने का निर्णय लिया।

renderNow से प्रोग्राम EmailRenderer.render() को कॉल करता है। मैंने यहाँ breakpoint लगाया और फिर से अनुरोध किया कि प्रोग्राम वास्तव में यहाँ तक चलता है या नहीं।

सौभाग्य से, प्रोग्राम मेरे अनुमान के अनुसार सही दिशा में गया। आगे प्रोग्राम renderEmailSubject को कॉल करता है।

आगे प्रोग्राम DefaultVelocityTemplatingEngine.render(this.subjectTemplate) को कॉल करता है।

DefaultVelocityTemplatingEngine.applying और DefaultVelocityTemplatingEngine.asPlainText पर पहुँचते हैं।

आगे asPlainText(Writer writer) को कॉल करते हैं।

toWriterImpl पर पहुँचते हैं, क्योंकि मैंने जो writer दिया है वह एक Fragment है, इसलिए प्रोग्राम else पर जाता है।
private void toWriterImpl(Writer writer, boolean attachCartridge) throws IOException {
if (this.source instanceof File) {
File template = (File)this.source;
if (attachCartridge) {
this.context.attachEventCartridge(DefaultVelocityTemplatingEngine.this.createDefaultCartridge());
}