
CVE-2021-26084 के लिए तकनीकी विश्लेषण और प्रूफ-ऑफ-कॉन्सेप्ट एक्सप्लॉइट, Atlassian Confluence Server में OGNL इंजेक्शन भेद्यता। मूल कारण विवरण, कमजोर पैरामीटर मैपिंग और पहचान मार्गदर्शन शामिल है।
प्रभावित संस्करण
संस्करण < 6.13.23
6.14.0 ≤ संस्करण < 7.4.11
7.5.0 ≤ संस्करण < 7.11.6
7.12.0 ≤ संस्करण < 7.12.5
कारण और शोषण विधि
Confluence URL को Java कक्षाओं से मैप करने के लिए फ्रेमवर्क का उपयोग करता है, जिससे "action" नामक चीज़ बनती है। Action URLs ".action" में समाप्त होते हैं और confluence-.jar में xwork.xml फ़ाइल तथा शामिल प्लगइन्स की JAR फ़ाइलों में atlassian-plugin.xml फ़ाइल में परिभाषित होते हैं। प्रत्येक action में कम से कम एक name विशेषता होती है, जो क्रिया का नाम निर्धारित करती है, एक class विशेषता होती है, जो action को निष्पादित करने वाली Java class को निर्धारित करती है, और कम से कम एक result तत्व होता है जो action के result के आधार पर action बुलाए जाने के बाद प्रदर्शित होने वाले Velocity template को तय करता है। Actions से लौटाए जाने वाले सामान्य मान "error", "input", "success" हैं, लेकिन कोई भी परिणाम उपयोग किया जा सकता है यदि वह XWork XML में result तत्व से मेल खाता है। Actions में method विशेषता हो सकती है जो निर्दिष्ट Java class के किसी विशेष method को कॉल करने की अनुमति देती है। जब कोई command निर्दिष्ट नहीं होता है, तो doDefault() method को कॉल किया जाता है। नीचे createpage-entervariables action के लिए action प्रविष्टि दी गई है:

class com.atlassian.confluence.pages.actions.PageVariablesAction का doEnter() method, doenterpagevariables.action पर आने वाले अनुरोधों को संसाधित करता है और "error", "input", "success" मान लौटाता है। इसका परिणाम Velocity template प्रदर्शित होता है।
यहाँ, action तत्व के "name" विशेषता का मान एक पथ /.action के अनुरूप होता है, और यह तत्व निर्धारित करता है कि error/success आदि के आधार पर प्रतिक्रिया के भाग के रूप में कौन सा template प्रदर्शित होगा। इसलिए इस उदाहरण के अनुसार, केवल /pages/doenterpagevariables.action तक पहुँचने से velocity template फ़ाइल प्रदर्शित हो जाएगी।

हम देख सकते हैं कि velocity template HTML पृष्ठ में किस प्रकार प्रदर्शित होता है।

टेम्पलेट में टैग नाम को पैरामीटर के रूप में दर्ज करें और ध्यान दें कि मान request पैरामीटर से लिए जाते हैं और response में लौटा दिए जाते हैं।

#tag का उपयोग: #tag ("attribute1", "attribute2", "attribute3")
ये विशेषताएँ render प्रक्रिया के दौरान AbstrctTagDirective.applyAttributes() पर प्राप्त की जाती हैं।

#tag ("Hidden" "name='queryString'" "value='ahihihi'")
विशेषताओं को AbstrctTagDirective.applyAttributes() द्वारा प्राप्त करने के बाद, इसे AbstrctUITag.doEndTag() → AbstractUITag.evaluateParams() में पारित किया जाता है।

फिर इसे expression के रूप में WebWorkTagSupport.findValue() → OgnlValueFinder.findValue() में पारित किया जाता है।

फिर इसे SafeExpressionUtil.isSafeExpression() में पारित किया जाता है।

यहाँ expression को compile करने, blacklist जाँच करने और cache में डालने के लिए पारित किया जाता है। Compile चरण के दौरान इसे ASTConst रूप में compile किया जाता है, और मूल्यांकन करने पर यह पहले से compile की गई स्ट्रिंग लौटाता है।

जब input से expression में "'" जोड़ा जाता है, तो इसे html entity रूप में escape कर दिया जाता है।

Escape बिंदु HtmlAnnotationEscaper.annotatedValueInsert() पर है।

यहाँ ognl.JavaCharStream.readChar() विधि को कॉल किया जाता है और यह Unicode escape वर्णों का मूल्यांकन करती है, इसलिए जब "\u0027" पास किया जाता है, तो यह "'" में परिवर्तित हो जाता है। इस प्रकार escape करके OGNL expression जोड़ा जा सकता है।

लेकिन OGNL की blacklist को पार करना आवश्यक है, जैसा नीचे दिया गया है:

इसे Array accessors का उपयोग करके पार किया जा सकता है, बजाय "getClass" विधि या ".class" गुण का उपयोग करने के।
queryString=aaa\u0027%2b#{\u0022\u0022[\u0022class\u0022]}%2b\u0027bbb

पता लगाने की विधि
सभी HTTP अनुरोध ट्रैफ़िक की निगरानी करें जिसमें अनुरोध के URI के पथ घटक में नीचे दी गई तालिका के "URI पथ" कॉलम में से कोई एक स्ट्रिंग मौजूद हो:
URI पथ | संवेदनशील पैरामीटर
/users/darkfeatures.action | featureKey /users/enabledarkfeature.action | featureKey /users/disabledarkfeature.action | featureKey /login.action | token /dologin.action | token /signup.action | token /dosignup.action | token /pages/createpage-entervariables.action | queryString, linkCreation /pages/doenterpagevariables.action | queryString /pages/createpage.action | queryString /pages/createpage-choosetemplate.action | queryString /pages/docreatepagefromtemplate.action | queryString /pages/docreatepage.action | queryString /pages/createblogpost.action | queryString /pages/docreateblogpost.action | queryString /pages/copypage.action | queryString /pages/docopypage.action | queryString /plugins/editor-loader/editor.action | syncRev
यदि ऐसा अनुरोध मिलता है, तो HTTP अनुरोध की विधि की जाँच करनी चाहिए। यदि अनुरोध विधि POST है, तो HTTP अनुरोध के body में ऊपर दी गई तालिका से संबंधित संवेदनशील पैरामीटर खोजें, और यदि अनुरोध विधि GET है, तो HTTP अनुरोध के request-URI में पैरामीटर खोजें। जाँच करें कि किसी भी संवेदनशील पैरामीटर के मान में "\u0027" या उसका URL-encoded रूप मौजूद है या नहीं। यदि हाँ, तो ट्रैफ़िक को दुर्भावनापूर्ण माना जाएगा और इस भेद्यता का शोषण करने वाला हमला हो सकता है।