문제 설명
존재하지 않는 페이지 방문시 404 에러를 출력하는 서비스입니다. SSTI 취약점을 이용해 플래그를 획득하세요. 플래그는 flag.txt, FLAG 변수에 있습니다.
SSTI취약점을 처음 들어보는 것 같아 정보를 찾기 위해 구글링을 해보았다.
SSTI : Server-Side Templete Injection
: 템플릿 엔진을 이용하여 웹 어플리케이션을 구동할 때, 사용자의 입력이 적절하게 필터링 되지 않아 템플릿 구문을 삽입 할 수 있을 때 발생한다.
또한 웹 템플릿 엔진에는 서버사이드 템플릿 엔진과 클라이언트사이드 템플릿 엔진 이렇게 두 개가 있는데 이 문제에서는 서버사이드 템플릿 엔진을 사용하고 있다.
- 서버사이드 템플릿 엔진
- : 서버에서 DB나 API에서 가져온 데이터와 사전에 설정해놓은 템플릿을 합쳐서 HTML을 만든 후 클라이언트에게 전송하는 방식
위 방식의 취약점은 클라이언트에서 악성코드가 담긴 데이터를 그대로 템플릿 엔진에 넘겨주게 되고 템플릿에 들어가서 렌더링 되는 과정에서 데이터에 담긴 악성코드를 그대로 실행하게 된다.
음 좋다 이제 SSTI가 뭔지는 알겠는데, 이것을 어떻게 이 문제에 적용할 것인가….
첫 단계는 문제 코드에서 사용중인 웹 템플릿 엔진 특정하기이다.
왼쪽 코드부터 차례대로 입력하며 코드가 사용중인 웹 템플릿을 특정하는 것이다.
그리고 많은 워게임 사이트나 CTF에서 이용하는 FLASK에서는 추가적인 설정이 없으면 Jinja2 엔진을 이용하게 된다.
그래서 확인한 결과 위 문제는 Jinja2 or Twig로 나와서 Jinja2엔진을 사용하고 있다고 특정하기로 했다.
Jinja2 템플릿 구문 중 ` {{...}} ` 구문은 중괄호 안에 들어가는 내용을 동적으로 보여주는 효과를 가지고 있다.
그말은 즉슨 중괄호 안에 특정한 코드를 입력하여 서버에서 정보를 탈취가 가능하게된다.
OK….이제 웹 템플릿 엔진도 뭔지 대충 알겠고 공격하는 방법도 대충 알았으니 코드를 살펴보도록 해보자.
#!/usr/bin/python3
from flask import Flask, request, render_template, render_template_string, make_response, redirect, url_for
import socket
app = Flask(__name__)
try:
FLAG = open('./flag.txt', 'r').read()
except:
FLAG = '[**FLAG**]'
app.secret_key = FLAG
@app.route('/')
def index():
return render_template('index.html')
@app.errorhandler(404)
def Error404(e):
template = '''
<div class="center">
<h1>Page Not Found.</h1>
<h3>%s</h3>
</div>
''' % (request.path)
return render_template_string(template), 404
app.run(host='0.0.0.0', port=8000)
호오 ‘app.secret_key’에 FLAG 가 있는 것 같다.
하지만 SSTI 문제 같은 경우에는 몇몇 큰 특징이 있는데 그 중 하나가 기본적으로 Flask의 경우 app.py에서 사용되는 대부분의 정보가 config 클래스에 들어간다.
그럼 모은 정보를 활용하여 한 번 코드를 실행을 시켜보자
첨 들어오면 이런 웹 페이지가 날 반겨준다.
그리고 ‘404Error’나 ‘robots.txt’ 둘 중 아무거나 들어가보자
난 ‘flag.txt’와 비슷하게 생긴 ‘robots.txt’로 결정했다
이런 화면이 떴다
근데 여기서 어떻게 템플릿 구문을 입력해야하는가
고민이 들 땐 코드를 보라 이거다
@app.errorhandler(404)
def Error404(e):
template = '''
<div class="center">
<h1>Page Not Found.</h1>
<h3>%s</h3>
</div>
''' % (request.path)
return render_template_string(template), 404
이 코드는 404페이지를 불러올 때 사용하는 코드인 것 같은데
div 클래스를 보면 h3태그로 ` %s ` 를 감싸고 있고, 뭐라뭐라 써져있는 것 같다.
그럼 404페이지로 가서 h3태그에 뭐가 있는지 살펴보자
성훈 센세가 알려준 개꿀따라시 방법으로 h3태그에는 ‘/404Error’ 라는게 써져있다는 것을 알게되었다.
먼가 수상해… 그래서 url에 대놓고 수상하게 있는 ‘/404Error’를 수정해보니
개꿀따라시 템플릿 구문을 삽입할 곳을 찾았다
상남자마냥 원래 있던 문자열은 지우지 않고 걍 ` {{config}} ` 를 입력해주니 config 클래스의 실체가 드러났다!
엥 근데 자세히 보니 진짜 config 클래스 안에 flag가 있다ㅋㅋㅋㅋㅋ
해결 완료~~!~!~@~@~
'DreamHack > Web hacking' 카테고리의 다른 글
[LEVEL-1] Command Injection Advanced (1) | 2023.12.25 |
---|---|
[LEVEL-1] CSRF Advanced (0) | 2023.12.24 |
[LEVEL-1] Apache htaccess (1) | 2023.12.06 |
[LEVEL-Beginner] pathtraversal (1) | 2023.12.02 |
[LEVEL-1] simple_sqli_chatgpt (1) | 2023.11.27 |