Try to be the expert.

Ainsetin's Hacking & PS & Math

2021 1人 1 Project

1인 1프로젝트 : 9일차 (웹해킹 문제 설계, 웹개발 계획 설계)

Ainsetin 2021. 6. 17. 08:24

나는 server template으로써 작동하는 Jinja2에서 유저가 입력한 내용을 그대로 템플릿에서 실행할 때 발생하는 Server Side Template Injection (SSTI)를 실습할 수 있는 웹해킹 문제를 만들어 볼 것이다.

 

SSTI는 다음과 같이 발생하게 된다.

위 그림에서는 각 단계가 초록색 화살표(injection O), 빨간색 화살표(injection X) 로 분기되어 있다.

그 이유는 무엇일까?

만약 웹 서비스에서 SSTI 취약점이 발생한다면, 어떤 환경인지에 따라 유저가 위와 같은 구문을 집어넣었을 때 결과값이 내가 넣은 문자가 그대로 나오거나 연산 결과를 출력한다. 이는 어떤 template engine을 사용하였는지에 따라 달라진다.

 

예를 들면, 나는 Jinja2 기반 서비스를 만들 것이기 때문에 ${7*7}은 안먹히고, {{7*7}}{{7*'7'}}은 먹힐 것이다.

그럼 그에 맞는 injection 구문을 시도하면 된다.

 

우선, 내가 만들려고 하는 웹서버는 앞에서 공부했던 flask와 jinja2, 학교에서 배운 mysql, 그리고 bootstrap을 활용한 css customization을 기반으로 코드를 작성할 예정이다.

 

웹페이지의 구조는 다음과 같이 구분할 것이다.

  • index.html
  • login.html
  • register.html
  • user_settings.html
  • add_friends.html

php를 사용하지 않고 오직 내부 서버의 mysql과 template만으로 이 모든 것을 구현하기 때문에 만들 때 새로울 것 같다.

우선, 코드의 틀을 모두 만든 다음 bootstrap을 접목해서 사이트를 조금 더 꾸며 볼 생각이다.

 


작년에 Subhack이라는 개인 프로젝트를 진행하면서 nginx-mysql-php를 사용하여 웹개발을 진행하였고, 모든 코드 작업을 쌩으로 해야했기 때문에 시간이 오래 걸렸다. 그래서 이번에는 jinja template나 bootstrap template를 조금 빌려와서 나만의 것으로 만드는 작업을 하기로 결심했다.

 

내가 만들 웹사이트의 주 목적은 정보 전달과 글쓰기이다.

초라해 보일 수 있지만 한번도 제대로 해보지 않은 게시판 만들기를 해보고 싶어 이러한 주제를 가지고 웹개발에 도전해 보기로 하였다.

 

정보 전달은 그리 어렵지 않다. 그냥 html에 넣고 싶은 내용들을 형식에 맞게 작성하면 된다.

글쓰기가 문제인데, jinja2에서는 템플릿 내부에서 반복문을 지원하기 때문에 파이썬 형식과 비슷하게 쿼리를 서버에서 여러개 보내면 그대로 순서대로 출력해줄 수 있어, 이 기능을 활용하여 만들어 보기로 하였다.

아래와 같은 형식으로 jinja2를 활용하면 된다.