포스트

SSTI 실습(5) - user-supplied object를 통한 정보 유출 (PortSwigger Academy)

Django template에서 debug 기능을 이용해 settings 객체에 접근하고 SECRET_KEY를 탈취하는 과정

SSTI 실습(5) - user-supplied object를 통한 정보 유출 (PortSwigger Academy)

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하는 방식으로 진행 할 수 있었다.
이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.