SSTI 실습(5) - user-supplied object를 통한 정보 유출 (PortSwigger Academy)
Django template에서 debug 기능을 이용해 settings 객체에 접근하고 SECRET_KEY를 탈취하는 과정
Lab: Server-side template injection with information disclosure via user-supplied objects
Lab Link: Server-side template injection with information disclosure via user-supplied objects
개요
이번 lab은 템플릿에서 접근 가능한 객체를 이용해서 정보를 빼오는 케이스다.
주어진 content-manager:C0nt3ntM4n4g3r 계정으로 로그인해서
웹 애플리케이션 내부의 기능을 활용하여 Framework의 Secret Key를 가져오는게 목표이다.
문제 접근
1. 템플릿 수정 가능 지점
로그인 후 product description을 수정할 수 있는 기능이 있다.
내부적으로 사용되는 변수들을 불러 오는걸 확인할 수 있는데,
우리가 직접 템플릿 코드도 수정해서 넣을 수 있게 되어있다.
2. 엔진 확인
일단 평소처럼 테스트 값을 입력 해보자.
1
2
3
${{<%[%'"}}%\
저장하면 에러 메시지가 화면에 출력된다.
여기서 상용되는 템플릿 엔진이 Django 인걸 확인할 수 있다.
debug 기능 사용
Django Documentation을 참조 해보자. 링크: Django docs
Django에는 기본으로 제공되는 기능인 {% debug %}를 입력 해보면,
현재 템플릿에서 접근 가능한 객체들이 쭉 나온다.
Django DEBUG 관련
여기서 Settings 객체를 하나 찾을 수 있다.
이 객체는 Django 내부 설정을 담고 있다.
4. settings 객체 확인
settings 안에는 여러 값이 들어있는데,
ADMINS를 예로 들어보자면,
아래와 같이 Default 값이 [], 즉 빈 문자열 인걸 확인할 수 있는데,
실제로 ` {{settings.ADMINS}} `를 요청해도
빈 문자열 []을 리턴하는것 볼 수 있다.
이로서 settings와 관련된 값을들 지정할 수 있다는 취약점이 드러난다.
우리가 목표로 하는 SECRET_KEY 에 대한 documentaiton이 되어 있는데, 이건 Django에서 중요한 보안 값이다. 세션, 암호화 등에 사용되는 값이라고 한다. {{settings.SECRET_KEY}}로 해당 값을 요청 해볼수 있다.
공격 결과, 화면에 SECRET_KEY 값이 출력되는걸 볼 수 있다..
이 값을 제출하면 lab이 완료된다.
정리
이번 랩은 Documentation을 직접 찾아보고, 그 안에서
- 설정값
- 내부 데이터
- 민감 정보 를 직접 찾아 exploit하는 방식으로 진행 할 수 있었다.









