위의 문제를 다음과 같은 방법으로 풀어보았다.
• SSTI 취약점이란?
SSTI는 Server Side Template Injection의 약자로, 템플릿에 공격자의 공격코드를 실어보내 서버 측에서 template injection 이 일어나게 하는 공격을 할 수 있는 취약점이다.
1. 페이지의 기능을 확인한다.
페이지에 방문하면 처음으로 뜨는 화면이다.
My Pages 목록에서 404Error 를 클릭하면 에러화면이 출력된다.
My Pages 목록에서 robots.txt를 클릭하면 robots.txt 문구가 출력된다.
url을 확인해보면 host 뒤에 붙은 robots.txt가 출력된 값과 일치하는 것을 볼 수 있다.
url에 test123입력해보니 출력값이 test123으로 나온다.
이것으로 url이 공격벡터인 것을 확인할 수 있다.
url에 {{1+2}}를 입력해보니 {{1+2}}가 그대로 출력되는 것이 아니라 3이 출력되는 것을 확인할 수 있다.
이것으로 이 문제의 SSTI 취약점은 jinja2 템플릿을 이용해 공격할 수 있는 것을 알 수 있다.
jinja2 템플릿은 {{ 코드 }} 의 형식으로 Injection을 할 수 있고, 내부에 파이썬 코드를 입력하여 실행할 수 있다.
2. 코드를 확인한다.
app.secret_key = FLAG
코드를 확인해 보면 웹 어플리케이션에서 flag가 secret_key로 저장되어 있는 것을 확인할 수 있다.
secret_key로 저장되어 있는 flag 값을 출력하기 위해서 config 객체를 활용할 것이다.
flask에서 쓰이는 config객체는 dictionary의 서브 클래스로, 디버깅 모드를 변경하거나 secret key를 설정하는 등 환경에 관련된 값을 설정해놓은 객체이다.
3. 익스플로잇 코드를 작성하여 flag를 획득한다.
config 객체에서 SECRET_KEY를 출력하는 파이썬 코드 config.['SECRET_KEY'] 를 jinja2 템플릿 안에 작성한다.
url을 입력하면 flag 내용이 출력되는 것을 확인할 수 있다.
'드림핵' 카테고리의 다른 글
[드림핵 워게임] login-1 (0) | 2022.11.18 |
---|---|
[드림핵 워게임] session (1) | 2022.11.11 |
[드림핵 워게임] php-1 (0) | 2022.11.11 |
[드림핵 워게임] proxy-1 (0) | 2022.11.11 |
[드림핵 워게임] blind-command (0) | 2022.11.11 |