Portswigger-Basic server-side template injection
풀이
ERB template을 사용하는데, SSTI 취약점이 있다. 이를 이용해 임의 코드를 실행하여 morale.txt 파일을 삭제해야 한다.
기본적으로 사용자가 변경 가능하면서 화면의 내용에 영향을 끼칠 수 있는 입력값을 찾는다.

문제 페이지를 열면 다음과 같이 상품 리스트가 있다. 각 상품을 눌러보며 반응을 살펴본다.

첫 번째 상품을 클릭하면 URL 파라미터 message 에 에러 메시지가 설정되고, 그와 동일한 메시지가 화면 상단에 뿌려진다.

message를 임의의 글자로 변경 가능한지 테스트해본다. test를 입력했더니 test가 반사되어 보이는 것을 확인할 수 있다.

이 입력값이 서버에서 반영되는 것인지, 클라이언트에서 반영되는 것인지 판단해야 한다. 이를 판단하기 위해 HTTP response를 잡아본다. test라는 문구가 HTTP response로 올 때부터 반영이 되었다는 것을 볼 수 있다. 따라서 이 입력값은 서버사이드에서 반영된 것이라 판단할 수 있다.

SSTI가 가능한지 테스트하기 위해 SSTI 페이로드를 보내본다. 문제 힌트에서 ERB template을 사용한다고 했기에, ERB template injection 페이로드를 이용한다. (원래는 종류별로 테스트해보거나, 핑거프린팅을 통해 서버의 언어를 유추해야 할 것이다) 페이로드는 payload 를 참고하였다.
<%=7*7%> 페이로드를 넣어 7*7의 결과가 표시되었다. 이는 서버사이드에서 이 연산을 실행한 후 결과를 반사해 HTML에 넣어 보낸다는 것을 의미한다. 이로써 SSTI 취약점이 있다는 것을 확인했다.

문제의 목표인 morale.txt 파일을 삭제하기 위한 페이로드를 생성해 보낸다. ruby 언어로 파일 삭제 코드를 써 <%=File.delete("morale.txt")%> 페이로드를 보내면 성공한다.
이 취약점은 사용자가 입력한 값을 검증하지 않아서, SSTI 페이로드를 sanitize 하거나 인코딩하지 않고 처리했기에 발생했다.
tags: writeup, ssti, wstg-inpv-18, erb, web hacking