
CVE-2021-21380 को कवर करने वाली एक CodeQL कार्यशाला
इस कार्यशाला में हम CVE-2021-21380 द्वारा प्रलेखित XWiki प्लेटफ़ॉर्म के रेटिंग घटक में SQL इंजेक्शन खोजने के लिए वाक्यात्मक और अर्थगत तर्क का उपयोग करेंगे।
यदि संभव हो तो कृपया कार्यशाला से पहले यह अनुभाग पूरा करें।
Visual Studio Code स्थापित करें।
Visual Studio Code के लिए CodeQL एक्सटेंशन स्थापित करें।
आपको CodeQL CLI स्थापित करने की आवश्यकता नहीं है: एक्सटेंशन आपके लिए यह संभाल लेगा।
इस रिपॉजिटरी को क्लोन करें:
git clone https://github.com/advanced-security/codeql-workshop-cve-2021-21380.git
xwiki-platform-CVE-2021-21380.zip फ़ाइल पर राइट-क्लिक करें और CodeQL: Set Current Database कमांड चुनें।Cmd/Ctrl+Shift+P) से, CodeQL: Install Pack Dependencies कमांड खोजें और चलाएँ।github टाइप करें।cve-2021-21380-exercises, cve-2021-21380-exercises-tests, cve-2021-21380-solutions, और cve-2021-21380-solutions-tests के आगे वाले बॉक्स चेक करें।कार्यशाला को कई अभ्यासों में विभाजित किया गया है जो Java के लिए QL भाषा समर्थन का परिचय देते हैं और ज्ञात SQL इंजेक्शन खोजने के लिए एक अंतिम क्वेरी के साथ समाप्त होते हैं। इन अभ्यासों में आप सीखेंगे:
इस कार्यशाला में हम XWiki Platform के रेटिंग्स API घटक में ज्ञात SQL इंजेक्शन भेद्यताओं की तलाश करेंगे। ऐसी भेद्यताएँ अनुप्रयोगों में तब हो सकती हैं जब किसी बाहरी उपयोगकर्ता द्वारा नियंत्रित जानकारी उस अनुप्रयोग कोड तक पहुँचती है जो असुरक्षित रूप से SQL क्वेरी बनाता है और उसे निष्पादित करता है।
इस कार्यशाला में चर्चित ज्ञात SQL इंजेक्शन की समीक्षा GitHub Advisory Database में GHSA-79rg-7mv3-jrr5 पर की गई है। SQL इंजेक्शन और संभावित प्रकारों को खोजने के लिए, हम निम्नलिखित उप-समस्याओं को हल करेंगे:
पहले कुछ अभ्यासों में हम अमूर्त सिंटैक्स ट्री (AST) का उपयोग करके वाक्यात्मक जानकारी के बारे में तर्क करेंगे, ताकि पहचान सकें:
क्वेरी exercise1.ql को पूरा करके प्रोग्राम में getAverageRating नाम वाली सभी विधियाँ और उसके घोषित प्रकार का पता लगाएँ।
java मॉड्यूल प्रोग्राम में विधियों के बारे में तर्क करने के लिए एक वर्ग Method प्रदान करता है।Method एक विधि के नाम के बारे में तर्क करने के लिए सदस्य विधेय getName और hasName प्रदान करता है।Method विधि को घोषित करने वाले प्रकार के बारे में तर्क करने के लिए सदस्य getDeclaringType प्रदान करता है।समाधान क्वेरी exercise1.ql में पाया जा सकता है।
अभ्यास 1 का समाधान विधियों की एक सूची लौटाता है। उनमें से कुछ RatingsManager नामक एक इंटरफ़ेस में परिभाषित हैं और कुछ वर्गों AbstractRatingsManager और RatingsScriptService में परिभाषित हैं।
क्वेरी और XWiki घटक दस्तावेज़ीकरण द्वारा लौटाई गई जानकारी से हम अनुमान लगा सकते हैं कि:
Role से एनोटेट किया जाता है, और एक कार्यान्वयन होता है जिसे Component से एनोटेट किया जाता है।ScriptService का विस्तार करता है, स्क्रिप्टिंग के माध्यम से विकि पृष्ठों के लिए सुलभ बनाया जाता है।क्वेरी exercise2.ql को पूरा करके Component एनोटेशन से एनोटेट किए गए सभी वर्गों का पता लगाएँ। ध्यान दें कि एनोटेशन के प्रकार का पूर्ण योग्य नाम org.xwiki.component.annotation.Component है।
this का उपयोग करके एक्सेस किया जा सकता है।Class वर्ग संबंधित एनोटेशन प्राप्त करने के लिए एक विधि getAnAnnotation प्रदान करता है।Annotation वर्ग अपने प्रकार के बारे में तर्क करने के लिए सदस्य विधेय getType प्रदान करता है।Type वर्ग किसी प्रकार के नाम के बारे में तर्क करने के लिए सदस्य विधेय getName और hasName प्रदान करता है।RefType वर्ग (जो वर्गों और इंटरफ़ेस का प्रतिनिधित्व करता है) रेफ्टाइप के पूर्ण योग्य नाम के बारे में तर्क करने के लिए सदस्य विधेय getQualifiedName और hasQualifiedName प्रदान करता है।समाधान क्वेरी exercise2.ql में पाया जा सकता है।
क्वेरी excercise3.ql को पूरा करके ScriptService इंटरफ़ेस को लागू करने वाले सभी घटकों का पता लगाएँ।
Class प्रकार सदस्य विधेय getASuperType प्रदान करता है ताकि किसी वर्ग के सुपर प्रकारों (अर्थात वे प्रकार जिन्हें वह extends या implements करता है) के बारे में तर्क किया जा सके।समाधान क्वेरी exercise3.ql में पाया जा सकता है।