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

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

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

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

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

श्रेणियाँ

सभी श्रेणियाँ देखें
Loading categories
CVE-2021-35042 — Django SQL इंजेक्शन भेद्यता | Kitploit
उपकरण/GitHubGitHub/luuanhduc/cve-2021-35042
भेद्यता विश्लेषणशोषणवेब एप्लिकेशन शोषणलर्निंग और शिक्षाडेटाबेस सुरक्षालैब और अभ्यास
GitHubluuanhduc/cve-2021-35042

CVE-2021-35042

Django SQL इंजेक्शन भेद्यता

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

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

सभी देखें →

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

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

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

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

CVE-2021-35042: Django SQL injection भेद्यता

I. अवलोकन

Django एक ओपन-सोर्स वेब एप्लिकेशन फ्रेमवर्क है, जो Python में लिखा गया है और MVC (Model - View - Controller) मॉडल पर आधारित है। प्रारंभ में इसे लॉरेंस प्रकाशन समूह के स्वामित्व वाली समाचार सामग्री वेबसाइटों को प्रबंधित करने के लिए बनाया गया था, जो एक CMS (Content Management System) सॉफ्टवेयर है।

Django संस्करण 3.1.x -> 3.1.13 और संस्करण 3.2.x -> 3.2.5 में SQL injection भेद्यता मौजूद है।

इस भेद्यता का कारण यह है कि QuerySet.order_by() में उपयोगकर्ता द्वारा नियंत्रित इनपुट डेटा को फ़िल्टर करने की कार्यक्षमता SQL injection हमलों से बचाव के लिए पर्याप्त नहीं है। इस भेद्यता का फायदा उठाकर हमलावर अनधिकृत कार्य कर सकता है, जिससे संवेदनशील डेटा का रिसाव हो सकता है।

CVE - IDCVE-2021-35042
Severity9.8 - CRITICAL
CWE - IDCWE-89: Improper Neutralization of Special Elements used in an SQL Command ('SQL Injection')
Vulnerability Publication Date1/7/2021
Affected Software3.1.x < 3.1.13, 3.2.x < 3.2.5
Require AuthenticationNo required

II. विस्तृत अवलोकन x2

0x01. Django का Model

Django में, डेटाबेस में तालिका बनाना और फ़ील्ड परिभाषित करना models.py फ़ाइल में एक model class घोषित करके किया जाता है। इस उदाहरण में, हम Wolf नाम की एक तालिका और name नाम का एक फ़ील्ड घोषित करते हैं।

0x02. Django में QuerySet और Order_by()

Django में निर्मित ORM फ्रेमवर्क का उपयोग डेटाबेस के साथ संचालन के लिए किया जाता है, और क्वेरी का परिणाम एक संग्रह होता है, यह संग्रह एक QuerySet होता है।

order_by(fields) डिफ़ॉल्ट रूप से, order_by() एक QuerySet लौटाता है जो Model की Meta में ordering विकल्प में निर्दिष्ट क्रम में क्रमबद्ध होता है। हम order_by() विधि का उपयोग करके प्रत्येक क्वेरी में order_by शर्त को ओवरराइड कर सकते हैं।

उदाहरण

wolves = Wolf.objects.order_by('-name', 'id')

उपरोक्त क्वेरी का परिणाम name फ़ील्ड के अनुसार घटते क्रम में, फिर id के अनुसार बढ़ते क्रम में क्रमबद्ध होगा। name फ़ील्ड नाम के आगे ऋणात्मक चिह्न इंगित करता है कि परिणाम घटते क्रम में क्रमबद्ध है।

निम्न उदाहरण उपयोगकर्ता से प्राप्त फ़ील्ड के अनुसार लौटाए गए परिणाम को क्रमबद्ध करेगा, यदि कोई मान पारित नहीं किया गया है तो id फ़ील्ड के अनुसार क्रमबद्ध करेगा।

परिणाम

संस्करण 3.1 और 3.2 में, Django क्वेरी विधि को तालिका नाम के साथ order_by क्वेरी में संयोजित करने की अनुमति देता है। यही इस भेद्यता का मुख्य कारण है।

तालिका नाम पारित करने से हमें सामान्य रूप से फ़ील्ड नाम पारित करने के समान परिणाम मिलता है

cve202135042_wolf तालिका का नाम है

सबसे पहले, एप्लिकेशन सीधे order_by() फ़ंक्शन को कॉल करता है, order_by() फ़ंक्शन को संसाधित करने वाला कोड यहाँ परिभाषित है: django/db/models/query.py

order_by() फ़ंक्शन दो कार्य करता है

  1. order_by() द्वारा वर्तमान में कॉल किए जा रहे सभी तरीकों को हटा देता है और order_by को भिन्न मान प्राप्त होने पर पारित किए गए डिफ़ॉल्ट पैरामीटर को भी हटा देता है।
  1. पैरामीटर को order_by में पारित करता है। add_ordering() फ़ंक्शन यह कार्य करता है
def add_ordering(self, *ordering):
        """
        Add items from the 'ordering' sequence to the query's "order by"
        clause. These items are either field names (not column names) --
        possibly with a direction prefix ('-' or '?') -- or OrderBy
        expressions.

        If 'ordering' is empty, clear all ordering from the query.
        """
        errors = []
        for item in ordering:
            if isinstance(item, str):
                if '.' in item:
                    warnings.warn(
                        'Passing column raw column aliases to order_by() is '
                        'deprecated. Wrap %r in a RawSQL expression before '
                        'passing it to order_by().' % item,
                        category=RemovedInDjango40Warning,
                        stacklevel=3,
                    )
                    continue
                if item == '?':
                    continue
                if item.startswith('-'):
                    item = item[1:]
                if item in self.annotations:
                    continue
                if self.extra and item in self.extra:
                    continue
                # names_to_path() validates the lookup. A descriptive
                # FieldError will be raise if it's not.
                self.names_to_path(item.split(LOOKUP_SEP), self.model._meta)
            elif not hasattr(item, 'resolve_expression'):
                errors.append(item)
            if getattr(item, 'contains_aggregate', False):
                raise FieldError(
                    'Using an aggregate in order_by() without also including '
                    'it in annotate() is not allowed: %s' % item
                )
        if errors:
            raise FieldError('Invalid order_by arguments: %s' % errors)
        if ordering:
            self.order_by += ordering
        else:
            self.default_ordering = False
            

add_ordering() में पारित पैरामीटर एक सरणी है।

उदाहरण के लिए, जब पैरामीटर इस प्रकार पारित किया जाता है: wolves = Wolf.objects.order_by( 'name' , 'id' ) उस स्थिति में, एप्लिकेशन इसे डेटाबेस में निम्नलिखित क्वेरी में परिवर्तित करेगा:

SELECT "cve202135042_wolf"."id", "cve202135042_wolf"."name" FROM "cve202135042_wolf" ORDER BY "cve202135042_wolf"."name" ASC, "cve202135042_wolf"."id" ASC

जब पारित किया जाता है, तो add_ordering फ़ंक्शन सरणी के प्रत्येक तत्व की जाँच करता है, यदि यह एक string है, तो निम्न 5 मामलों की जाँच की जाती है:

  1. if '.' in item: यह जाँचता है कि क्या यह एक कॉलम नाम वाली क्वेरी है और क्या उस कॉलम का तालिका नाम SQL कथन में निर्दिष्ट है। यदि हाँ, तो एक चेतावनी दी जाती है और continue किया जाता है।
  2. if item == '?': यदि तत्व का मान '?' है, तो आउटपुट परिणाम यादृच्छिक रूप से क्रमबद्ध किया जाएगा, continue किया जाता है।
  3. if item.startswith('-'): यदि आइटम '–' वर्ण से शुरू होता है, तो क्वेरी का परिणाम DESC (घटते क्रम) में क्रमबद्ध किया जाएगा।
  4. if item in self.annotations: यह जाँचता है कि क्या इसमें कोई टिप्पणी है, यदि हाँ, तो continue किया जाता है।
  5. if self.extra and item in self.extra: यह निर्धारित करता है कि कोई अतिरिक्त परिवर्धन है या नहीं और यदि है तो continue किया जाता है।

5 जाँचों के बाद, पैरामीटर को आगे self.names_to_path(item.split(LOOKUP_SEP), self.model._meta) फ़ंक्शन में पारित किया जाता है ताकि यह जाँचा जा सके कि यह एक मान्य कॉलम नाम है या नहीं, फिर यदि मान्य है, तो उन्हें आगे की प्रक्रिया के लिए Query वर्ग की self.ordering में जोड़ा जाता है।

III. Django में SQL injection भेद्यता का विश्लेषण

0x31. कारण

Django का ORM क्वेरी में डाले गए डेटा को बहुत सख्ती से फ़िल्टर करता है, लेकिन इस बार स्रोत कोड में किया गया परिवर्तन जो SQL injection का कारण बना, वह है लेखक द्वारा यह धारणा बनाना कि यदि कॉलम का नाम एक UUID (Universal Unique Identifer) कॉलम है, तो order_by क्वेरी निष्पादित नहीं की जा सकती।

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