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

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

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

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

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

श्रेणियाँ

सभी श्रेणियाँ देखें
Loading categories
codeql-workshop-cve-2021-21380 — CVE-2021-21380 को कवर करने वाली एक CodeQL कार्यशाला | Kitploit
उपकरण/GitHubGitHub/rvermeulen/codeql-workshop-cve-2021-21380
स्थैतिक विश्लेषणभेद्यता विश्लेषणकोड विश्लेषणवेब सुरक्षालर्निंग और शिक्षालैब और अभ्यास
GitHubrvermeulen/codeql-workshop-cve-2021-21380

codeql-workshop-cve-2021-21380

CVE-2021-21380 को कवर करने वाली एक CodeQL कार्यशाला

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

सभी देखें →

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

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

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

सभी उपकरण देखें →
साझा करें
रिपॉजिटरी देखें
1251 साल पहलेअभी तक समीक्षित नहीं

जावा के लिए CodeQL कार्यशाला: SQL इंजेक्शन ढूँढना

इस कार्यशाला में हम CVE-2021-21380 द्वारा प्रलेखित XWiki प्लेटफ़ॉर्म के रेटिंग घटक में SQL इंजेक्शन खोजने के लिए वाक्यात्मक और अर्थगत तर्क का उपयोग करेंगे।

सामग्री

  • जावा के लिए CodeQL कार्यशाला: SQL इंजेक्शन ढूँढना
    • सामग्री
    • पूर्वापेक्षाएँ और सेटअप निर्देश
      • आपकी स्थानीय मशीन पर
        • स्थापना
        • सेटअप चरण
    • कार्यशाला
      • सीखने के बिंदु
      • समस्या विवरण
      • अभ्यास
        • अभ्यास 1
        • अंतराल 1
        • अभ्यास 2
        • अभ्यास 3
        • अंतराल 2
        • अभ्यास 4
        • अभ्यास 5
        • अंतराल 3
        • अभ्यास 6
        • अभ्यास 7
        • अभ्यास 8
    • आगे क्या?

पूर्वापेक्षाएँ और सेटअप निर्देश

आपकी स्थानीय मशीन पर

यदि संभव हो तो कृपया कार्यशाला से पहले यह अनुभाग पूरा करें।

स्थापना

  • Visual Studio Code स्थापित करें।

  • Visual Studio Code के लिए CodeQL एक्सटेंशन स्थापित करें।

  • आपको CodeQL CLI स्थापित करने की आवश्यकता नहीं है: एक्सटेंशन आपके लिए यह संभाल लेगा।

  • इस रिपॉजिटरी को क्लोन करें:

    root@kitploit:~
    git clone https://github.com/advanced-security/codeql-workshop-cve-2021-21380.git
    

सेटअप चरण

  • कार्यशाला में उपयोग के लिए CodeQL डेटाबेस आयात करें:
    • Explorer दृश्य में xwiki-platform-CVE-2021-21380.zip फ़ाइल पर राइट-क्लिक करें और CodeQL: Set Current Database कमांड चुनें।
    • डेटाबेस CodeQL डेटाबेस दृश्य में दिखाई देगा जो गतिविधि पट्टी पर QL आइकन से सुलभ है।
  • जावा कोड का विश्लेषण करने और अभ्यासों और समाधानों के परीक्षण चलाने के लिए निर्भरताएँ स्थापित करें।
    • कमांड पैलेट (Cmd/Ctrl+Shift+P) से, CodeQL: Install Pack Dependencies कमांड खोजें और चलाएँ।
    • अपने VS Code विंडो के शीर्ष पर, सूची को फ़िल्टर करने के लिए बॉक्स में github टाइप करें।
    • cve-2021-21380-exercises, cve-2021-21380-exercises-tests, cve-2021-21380-solutions, और cve-2021-21380-solutions-tests के आगे वाले बॉक्स चेक करें।
    • OK/Enter पर क्लिक करें।
  • समाधानों के परीक्षण चलाकर सत्यापित करें कि सब कुछ अपेक्षित रूप से काम करता है।
    • परीक्षण दृश्य खोलें और ट्री में solutions आइटम के बगल में रन टेस्ट (समाधानों पर होवर करने पर प्ले आइकन दिखाई देता है) दबाएँ।

कार्यशाला

सीखने के बिंदु

कार्यशाला को कई अभ्यासों में विभाजित किया गया है जो Java के लिए QL भाषा समर्थन का परिचय देते हैं और ज्ञात SQL इंजेक्शन खोजने के लिए एक अंतिम क्वेरी के साथ समाप्त होते हैं। इन अभ्यासों में आप सीखेंगे:

  • वाक्यात्मक जानकारी के बारे में तर्क कैसे करें।
  • अर्थगत जानकारी के बारे में तर्क कैसे करें।
  • पैटर्न व्यक्त करने के लिए Java के लिए QL भाषा समर्थन का अन्वेषण करें।
  • मौजूदा मॉडलिंग का पुन: उपयोग और विस्तार कैसे करें, इसका अन्वेषण करें।
  • अंतिम क्वेरी बनाने के लिए कई बिल्डिंग ब्लॉक्स का उपयोग करें।

समस्या विवरण

इस कार्यशाला में हम XWiki Platform के रेटिंग्स API घटक में ज्ञात SQL इंजेक्शन भेद्यताओं की तलाश करेंगे। ऐसी भेद्यताएँ अनुप्रयोगों में तब हो सकती हैं जब किसी बाहरी उपयोगकर्ता द्वारा नियंत्रित जानकारी उस अनुप्रयोग कोड तक पहुँचती है जो असुरक्षित रूप से SQL क्वेरी बनाता है और उसे निष्पादित करता है।

इस कार्यशाला में चर्चित ज्ञात SQL इंजेक्शन की समीक्षा GitHub Advisory Database में GHSA-79rg-7mv3-jrr5 पर की गई है। SQL इंजेक्शन और संभावित प्रकारों को खोजने के लिए, हम निम्नलिखित उप-समस्याओं को हल करेंगे:

  • अविश्वसनीय जानकारी के स्रोत की पहचान करें और QL में इसका मॉडल बनाएँ।
  • सिंक (SQL क्वेरी निष्पादित करने वाली विधि) की पहचान करें और QL में इसका मॉडल बनाएँ।
  • स्रोत और सिंक के बीच सूचना प्रवाह है या नहीं यह निर्धारित करने के लिए उपरोक्त समाधानों को टेंट ट्रैकिंग का उपयोग करके संयोजित करें।

अभ्यास

पहले कुछ अभ्यासों में हम अमूर्त सिंटैक्स ट्री (AST) का उपयोग करके वाक्यात्मक जानकारी के बारे में तर्क करेंगे, ताकि पहचान सकें:

  • भेद्यता की समझ बनाने के लिए सुरक्षा सलाह में वर्णित विधि
  • पैरामीटर जिनमें अविश्वसनीय डेटा है, हमारे स्रोत
  • विधि कॉल जो SQL स्टेटमेंट स्वीकार करते हैं, हमारे सिंक

अभ्यास 1

क्वेरी exercise1.ql को पूरा करके प्रोग्राम में getAverageRating नाम वाली सभी विधियाँ और उसके घोषित प्रकार का पता लगाएँ।

संकेत
  • java मॉड्यूल प्रोग्राम में विधियों के बारे में तर्क करने के लिए एक वर्ग Method प्रदान करता है।
  • वर्ग Method एक विधि के नाम के बारे में तर्क करने के लिए सदस्य विधेय getName और hasName प्रदान करता है।
  • वर्ग Method विधि को घोषित करने वाले प्रकार के बारे में तर्क करने के लिए सदस्य getDeclaringType प्रदान करता है।

समाधान क्वेरी exercise1.ql में पाया जा सकता है।

अंतराल 1

अभ्यास 1 का समाधान विधियों की एक सूची लौटाता है। उनमें से कुछ RatingsManager नामक एक इंटरफ़ेस में परिभाषित हैं और कुछ वर्गों AbstractRatingsManager और RatingsScriptService में परिभाषित हैं।

क्वेरी और XWiki घटक दस्तावेज़ीकरण द्वारा लौटाई गई जानकारी से हम अनुमान लगा सकते हैं कि:

  • XWiki एक्सटेंशन और अनुकूलन की अनुमति देने के लिए घटक-उन्मुख डिज़ाइन का उपयोग करता है।
  • भेद्य विधि एक घटक का हिस्सा है।
  • एक घटक में एक इंटरफ़ेस होता है, जिसे Role से एनोटेट किया जाता है, और एक कार्यान्वयन होता है जिसे Component से एनोटेट किया जाता है।
  • एक घटक जो ScriptService का विस्तार करता है, स्क्रिप्टिंग के माध्यम से विकि पृष्ठों के लिए सुलभ बनाया जाता है।

अभ्यास 2

क्वेरी exercise2.ql को पूरा करके Component एनोटेशन से एनोटेट किए गए सभी वर्गों का पता लगाएँ। ध्यान दें कि एनोटेशन के प्रकार का पूर्ण योग्य नाम org.xwiki.component.annotation.Component है।

संकेत
  • /class domain type/ (इसके सुपर प्रकारों का प्रतिच्छेदन) को /characteristic predicate/ में कीवर्ड this का उपयोग करके एक्सेस किया जा सकता है।
  • Class वर्ग संबंधित एनोटेशन प्राप्त करने के लिए एक विधि getAnAnnotation प्रदान करता है।
  • Annotation वर्ग अपने प्रकार के बारे में तर्क करने के लिए सदस्य विधेय getType प्रदान करता है।
  • Type वर्ग किसी प्रकार के नाम के बारे में तर्क करने के लिए सदस्य विधेय getName और hasName प्रदान करता है।
  • RefType वर्ग (जो वर्गों और इंटरफ़ेस का प्रतिनिधित्व करता है) रेफ्टाइप के पूर्ण योग्य नाम के बारे में तर्क करने के लिए सदस्य विधेय getQualifiedName और hasQualifiedName प्रदान करता है।

समाधान क्वेरी exercise2.ql में पाया जा सकता है।

अभ्यास 3

क्वेरी excercise3.ql को पूरा करके ScriptService इंटरफ़ेस को लागू करने वाले सभी घटकों का पता लगाएँ।

संकेत
  • Class प्रकार सदस्य विधेय getASuperType प्रदान करता है ताकि किसी वर्ग के सुपर प्रकारों (अर्थात वे प्रकार जिन्हें वह extends या implements करता है) के बारे में तर्क किया जा सके।

समाधान क्वेरी exercise3.ql में पाया जा सकता है।

अंतराल 2

इस बिंदु पर हमने वाक्यात्मक रूप से उन विधियों की पहचान कर ली है जिन्हें एक उपयोगकर्ता कॉल कर सकता है और जिनके पैरामीटर हम कार्यशाला में आगे अविश्वसनीय डेटा के स्रोत मानेंगे।

अगले अभ्यास में हम संभावित सिंक की जाँच और पहचान करेंगे। अभ्यास 1 के परिणामों से हम अनुमान लगा सकते हैं कि एक कार्यान्वयन विधि getAverageRatingFromQuery को कॉल करता है। समान क्वेरी का उपयोग करके हम getAverageRatingFromQuery के घोषित प्रकार पा सकते हैं, जो हमें यह स्थापित करने की अनुमति देता है कि वर्ग AbstractRatingsManager में कार्यान्वयन एक SQL स्टेटमेंट बनाता है जो search विधि को पारित किया जाता है।

search विधि एक निर्भरता में कार्यान्वित की गई है और इस प्रकार इसका कार्यान्वयन उपलब्ध नहीं है। अगले अभ्यासों में हम इस search विधि कॉल और इसके घोषित प्रकार की पहचान करने के लिए उपलब्ध प्रकार की जानकारी का उपयोग करेंगे।

अभ्यास 4

क्वेरी exercise4.ql को पूरा करके search विधि के सभी विधि कॉल खोजें और उसके घोषित प्रकार की पहचान करें।

संकेत
  • MethodCall प्रकार हमें विधि कॉल के बारे में तर्क करने का साधन प्रदान करता है।
  • MethodAcccess प्रकार विधि कॉल के लक्ष्य के बारे में तर्क करने के लिए सदस्य विधेय getMethod प्रदान करता है।

समाधान क्वेरी exercise4.ql में पाया जा सकता है।

अभ्यास 5

क्वेरी exercise5.ql को पूरा करके इंटरफ़ेस XWikiStorageInterface (योग्य नाम com.xpn.xwiki.store.XWikiStoreInterface के साथ) द्वारा घोषित विधियों के सभी विधि कॉल खोजें।

संकेत
  • यह बताने के लिए कीवर्ड instanceof का उपयोग किया जा सकता है कि कोई मान किसी प्रकार द्वारा दर्शाए गए मानों के सेट से संबंधित है। उदाहरण के लिए, इंटरफ़ेस विधियों के सभी कॉल की पहचान करने के लिए:

    root@kitploit:~
    import java
    
    from MethodCall ma
    where ma.getMethod.getDeclaringType() instanceof Interface
    select ma
    

समाधान क्वेरी exercise5.ql में पाया जा सकता है।

अंतराल 3

इस बिंदु पर हमने QL का उपयोग करके संभावित स्रोतों और सिंक का वाक्यात्मक रूप से वर्णन किया है। यह निर्धारित करने के लिए कि कार्यक्रम में इन बिंदुओं के बीच सूचना प्रवाहित होती है या नहीं, हम टेंट ट्रैकिंग का उपयोग करके कार्यक्रम का अर्थगत विश्लेषण करेंगे।

हमारे द्वारा समर्थित भाषाओं की मानक लाइब्रेरीज़ दो डेटा प्रवाह तंत्र प्रदान करती हैं:

  1. मॉड्यूल DataFlow मान संरक्षित सूचना प्रवाह का समर्थन करता है।
  2. मॉड्यूल TaintTracking मान संशोधित होने पर भी सूचना प्रवाह का समर्थन करता है।

बाद वाला रुचिकर है, क्योंकि SQL इंजेक्शन जैसी इंजेक्शन भेद्यता में अविश्वसनीय डेटा का एक बड़े स्टेटमेंट का हिस्सा बनना सामान्य है जिस पर कार्रवाई की जाती है।

इस कार्यशाला में हम एक मौजूदा SQL इंजेक्शन टेंट ट्रैकिंग कॉन्फ़िगरेशन का पुन: उपयोग करेंगे और SQL इंजेक्शन खोजने के लिए इसे अपने मॉडल किए गए स्रोतों और सिंक के साथ विस्तारित करेंगे। यह समझने के लिए कि हम कॉन्फ़िगरेशन का विस्तार कैसे कर सकते हैं, हम नीचे दिए गए कॉन्फ़िगरेशन की परिभाषा को देखकर शुरू करते हैं।

root@kitploit:~
class QueryInjectionFlowConfig extends TaintTracking::Configuration {
  QueryInjectionFlowConfig() { this = "SqlInjectionLib::QueryInjectionFlowConfig" }

  override predicate isSource(DataFlow::Node src) { src instanceof RemoteFlowSource }

  override predicate isSink(DataFlow::Node sink) { sink instanceof QueryInjectionSink }

  override predicate isSanitizer(DataFlow::Node node) {
    node.getType() instanceof PrimitiveType or
    node.getType() instanceof BoxedType or
    node.getType() instanceof NumberType
  }

  override predicate isAdditionalTaintStep(DataFlow::Node node1, DataFlow::Node node2) {
    any(AdditionalQueryInjectionTaintStep s).step(node1, node2)
  }
}

कॉन्फ़िगरेशन द्वारा उन प्रोग्राम स्थानों की पहचान करने के लिए उपयोग किए जाने वाले isSource और isSink विधेय दोनों ही कीवर्ड instanceof का उपयोग करते हैं जिसे हमने पहले देखा है। RemoteFlowSource और QueryInjectionSink दोनों वर्ग abstract वर्ग हैं। यह एक सामान्य पैटर्न है जिसका सामना आप मानक लाइब्रेरीज़ में करेंगे और यह पैटर्न हमें RemoteFlowSource और QueryInjectionSink वर्गों द्वारा दर्शाए गए मानों के सेट का विस्तार करने की अनुमति देता है।

एक QL class जो एक abstract class का विस्तार करता है, सुपर क्लास द्वारा दर्शाए गए मानों के सेट को परिशोधित नहीं करता, बल्कि उपवर्ग द्वारा दर्शाए गए मानों को सुपरक्लास में जोड़ता है।

अगले अभ्यासों में हम इन उपवर्गों को लागू करेंगे और अपनी अंतिम क्वेरी का निर्माण करेंगे।

अभ्यास 6

अभ्यास 3 में पहचाने गए घटक वर्गों की सार्वजनिक विधियों के पैरामीटर के साथ RemoteFlowSource के मान सेट का विस्तार करने के लिए क्वेरी exercise6.ql को पूरा करें।

संकेत
  • यह बताने के लिए कीवर्ड instanceof का उपयोग किया जा सकता है कि कोई मान किसी प्रकार द्वारा दर्शाए गए मानों के सेट से संबंधित है। उदाहरण के लिए, इंटरफ़ेस विधियों के सभी कॉल की पहचान करने के लिए:

    root@kitploit:~
    import java
    
    from MethodCall ma
    where ma.getMethod.getDeclaringType() instanceof Interface
    select ma
    

समाधान क्वेरी exercise6.ql में पाया जा सकता है।

अभ्यास 7

अभ्यास 5 में पहचाने गए स्टोरेज इंटरफ़ेस की विधियों के कॉल के तर्कों के साथ QueryInjectionSink के मान सेट का विस्तार करने के लिए क्वेरी exercise7.ql को पूरा करें।

संकेत
  • exists सूत्र अस्थायी चर के परिचय की अनुमति देता है जिसके बारे में exists के दायरे में तर्क किया जा सकता है।

    निम्नलिखित उदाहरण विधियों के सेट को केवल उन विधियों तक कम करने के लिए exists अभिव्यक्ति का उपयोग करता है जिन्हें कॉल किया जाता है।

    root@kitploit:~
    from Method m
    where m.hasName("foo") and exists(MethodCall ma | ma.getMethod() = m)
    select m
    
  • MethodCall वर्ग विधि एक्सेस के क्वालिफ़ायर के बारे में तर्क करने के लिए सदस्य विधेय getQualifer प्रदान करता है।

समाधान क्वेरी exercise7.ql में पाया जा सकता है।

अभ्यास 8

क्वेरी exercise8.ql को पूरा करके पिछले अभ्यासों के अपने समाधानों को एक अंतिम समाधान में संयोजित करें।

समाधान क्वेरी exercise8.ql में पाया जा सकता है।

आगे क्या?

  • क्वेरी में XWiki फ्रेमवर्क के भागों को मॉडल करने के लिए एक मॉड्यूल शामिल है। इसे अपनी मॉड्यूल फ़ाइल में रिफैक्टर करें और अपनी क्वेरी में उपयोग करें।
  • हमने अविश्वसनीय डेटा के अपने स्रोत को स्क्रिप्ट सेवा घटकों तक सीमित कर दिया। देखें कि इसे अन्य स्रोतों के साथ कैसे विस्तारित किया जाए।
  • सिंक के लिए हमने खुद को XWikiStoreInterface के प्रत्यक्ष उपयोग तक सीमित रखा। सिंक का विस्तार करें ताकि इंटरफ़ेस के कार्यान्वयन के प्रत्यक्ष उपयोग शामिल हों। Class वर्ग सदस्य विधेय extendsOrImplements प्रदान करता है और Method वर्ग सदस्य विधेय overridesOrInstantiates प्रदान करता है जो सहायक हो सकते हैं।
  • स्रोतों की परिभाषा का उपयोग करके क्वेरी 'Untrusted data passed to external API' के साथ अविश्वसनीय डेटा के दिलचस्प उपयोग खोजें।
टूल डाउनलोड करें