정적인 웹 사이트는 위에 짤처럼 정지해 있지만 멈춘게 아니다.
실제 많은 사이트들은 동적인 화면을 만드며 구현한다.
SSTI취약점이 바로 그것을 이용한 것이다.
SSTI가 뭔데?
템플릿 엔진을 사용할때 템플릿 엔진에 공격자의 공격 구문이 템플릿에 injection 되면서 생기는 취약점이다.
템플릿들은 각각 언어마다 아니면 개발자 취향마다 다 쓰이는 템플릿 엔진이 달라서 문법은 다를 확률이 높다.
템플릿별 문법을 찾아야한다.
하지만 거의 대부분
{{}} ; ${}
이정도 문법을 지원한다.
템플릿 코드 예시는
template = '''
<html>
<body>
<h3>유저 아이디: {{user.uid}}</h3>
<h3>유저 레벨: {{user.level}}</h3>
</body>
</html>''' % content
이정도 예시를 들 수 있다.
실제 공격하는 방식은
template = '''
<html>
<body>
<h3 id="title">{{title}}</h3>
<h3 id="content">%s</h3>
</body>
</html>''' % content
여기에 content에 삽입하는 방식이다.
Cheet
해당 logic을 이용하여 템플릿을 알아내는 과정이다.
프레임워크를 알아내면 해당 문법을 알아봐야한다.
템플릿별 문법
@( )
- ASP.NET Razor
#{ }
- Expression Language
- Freemarker
- Ruby (Slim)
- Jade
- Codepen
${ }
- Expression Language (+JavaEL)
- Freemarker
- Java
{{ }}
- Java
- Jinja
- Jinjava
- Pebble
- Twig
- Handlebars
[[ ]]
- Jinja2
{1+2}
- Smarty
<%= %> or <% %>
- Ruby (ERB)
- Mako
#
- Velocity (e.g: #set)
@
- Lessjs (css 문법으로 대부분 사용 가능합니다. e.g: @import / @plugin)
추가적으로 이런 구문들로 취약점 탐지가 가능하다.
{var} ${var} {{var}} <%var%> [% var %]
여기에 지리는 템플릿 별 payload들이 모여있다.
DreamHack simple-ssti write up
문제 링크 https://dreamhack.io/wargame/challenges/39/
simple-ssti
존재하지 않는 페이지 방문시 404 에러를 출력하는 서비스입니다. SSTI 취약점을 이용해 플래그를 획득하세요. 플래그는 flag.txt, FLAG 변수에 있습니다. Reference Server-side Basic
dreamhack.io
문제의 메인 페이지이다.
robots.txt를 열어본다.
없는 페이지로 이동하면 Page Not Found가 뜨면서 잘못된 페이지 주소가 뜬다.
취약점 탐지를 위해 {{ config }}를 작성했더니,
바로 플레그 값이 나왔다.
Review
흠.. sqli에서 테이블 알아내는 것 처럼 템플릿을 알아내기 위해서 sqlmap처럼 툴이 있나 찾아봤다.
github에 여러 툴이 있었고 다음에는 그 툴들을 사용하는 것을 정리하겠다.
'web hacking' 카테고리의 다른 글
HTML/CSS Injection (0) | 2023.07.28 |
---|---|
정보빼가는 SQLi 와 SQLMAP (0) | 2023.07.24 |
command injection (0) | 2023.07.18 |
전 국민이 직접 시도해본 해킹공격, Brute Force Attack (dreamhack session) (6) | 2023.07.17 |
그냥 XSS는 재미가 없잖아? (XSS filtering bypass) (2) | 2023.07.16 |