포스트

SSTI 실습(1) - ERB Template Injection을 이용한 파일 삭제 (PortSwigger Academy)

ERB 템플릿에서 SSTI를 이용해 OS command를 실행하고 파일을 삭제하는 과정

SSTI 실습(1) - ERB Template Injection을 이용한 파일 삭제 (PortSwigger Academy)

Lab: Basic server-side template injection

Lab Link: Basic server-side template injection


개요

이 lab은 ERB 템플릿을 잘못 사용하는 과정에서 발생한 SSTI 취약점이다.

사용자 입력이 데이터로 들어가는게 아니라
템플릿 코드 자체로 들어가면서 문제가 발생한다.

최종 목표는 Carlos의 홈 디렉토리에 있는 morale.txt 파일을 삭제하는 것이다.

이 실습에서는 Hacktricks 문서를 참고한다.
링크: https://hacktricks.wiki/en/pentesting-web/ssti-server-side-template-injection/index.html


문제 접근

사이트에서 상품 상세 페이지를 보면
재고가 없을 경우 메시지를 출력한다.

설명

Burp로 요청을 확인해보면,
GET /?message= 파라미터 값이 그대로 화면에 반영되는 걸 볼 수 있다.

설명
설명

처음에는 그냥 문자열 출력처럼 보이는데,
SSTI 가능성을 확인하기 위해 간단한 payload들을 테스트 해봤다.
아래는 Hacktricks를 참고해서 템플릿을 테스트 해볼 수 있는 코드다.

  1. {{7*7}}
  2. ${7*7}
  3. <%= 7*7 %>
  4. ${{7*7}}
  5. #{7*7}

SSTI 여부 확인

위에서 작성한 코드를 Intruder로 넣어준다. 귀찮다면 Repeater에서 매뉴얼로 해도 충분하다.

Grep - Extract에는 응답 문구인
Unfortunately this product is out of stock을 기준으로 잡아줬다.

설명
설명

결과를 보면, <% 7*7 %> payload에서 49가 반환된다.
따라서 서버에서 템플릿 코드가 실행되고 있음을 알 수 있다.

설명

Hacktricks 문서를 참고해보면
이 결과를 만드는 템플릿 엔진이 ERB (Ruby)임을 찾을 수 있다.

설명

코드 실행으로 확장

이제 계산이 되는 걸 확인했으니까 명령 실행이 가능한지도 확인 해보자.

ERB는 Ruby 기반이라
system() 함수를 사용할 수 있다.

그래서 먼저 간단한 system(whoami) 커맨드를 실행했다.

설명

요청 결과, 유저 carlos를 반환하는것을 확인할 수 있다.

설명

payload가 바로 먹혀서 코드실행이 가능했지만,
상황에 따라서는 URL encoding해서 보내야 할 수도 있다.

이제 우리의 목표인 morale.txt파일을 지우기 위해 파일 위치부터 확인해보자.

ls커맨드로 일단 현재 디렉터리 확인부터 한다.

설명

우리의 타겟인 morale.txt가 같은 디렉터리 안에 위치한걸 확인.

rm morale.txt커맨드로 파일을 삭제해주면 Lab이 마무리된다.


정리

사용자 입력이 템플릿에 그대로 들어가고,
그걸 ERB가 그대로 실행해버리는 상황이다.

처음에는 계산식으로 확인하고,
그 다음 바로 OS 명령 실행으로 이어진다.

이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.