문제에 접근하면 아래와 같이 소스 내 주석으로 base64 된 문자열을 볼 수 있다.
반복해서 요청하다보면 총 3가지를 출력해줌을 볼 수 있다.
1. L2xvbF9ub19vbmVfd2lsbF9zZWVfd2hhdHNfaGVyZQ== → /lol_no_one_will_see_whats_here
2. Lz9zZWNyZXQ9ZmxhZw== → /?secret=flag
3. d2hhdF9hcmVfeW91X3NlYXJjaGluZ19mb3IK → what_are_you_searching_for
첫 번째 디코딩한 값으로 접근해보면 아래와 같은 base64된 값을 주는데 해당 값을 디코딩해보면 유투브로 넘어가는 링크를 준다.
aHR0cHM6Ly93d3cueW91dHViZS5jb20vd2F0Y2hcP3ZcPVBHakxoT2hNTFhjCg==
→ https://www.youtube.com/watch?v=PGjLhOhMLXc
웹 문제 중 가장 어려운 문제인데 이렇게 쉽게 될리가 ㅎㅎ
두 번째로 디코딩한 값이 그나마 입력을 받는 인자가 있어 느낌있었다.
해당 값으로 접근해보면 응답에 내가 입력한 flag가 출력된 것을 볼 수 있다.
혹시나 하여 SSTI 를 해보았는데 역시나였다.
그래서 그전에 공부해둔대로 File Class를 이용하여 파일을 읽어보려 했는데 ''.__class__.__mro__[2]가 존재하지 않았고, 확인해본 결과 ''.__class__.__mro__[1]이 object Class이며 해당 object에는 File class가 존재하지 않았다.
다른 방법이 뭐가 있을까 찾아보다가 아래와 같은 링크를 찾았다.
바로 os._wrap_close Class를 이용하는 것이다.
해당 링크에 나와있는 대로 아래의 명령어를 통해 공격을 시도해보았다.
{{"".__class__.__bases__[0].__subclasses__()[127].__init__.__globals__['popen']('dir').read()}}
그 결과 dir 명령어를 통해 디렉토리 내 파일 리스트를 볼 수 있었고 flag.txt가 존재함을 볼 수 있다.
이후 cat 명령어를 통해 flag를 얻을 수 있었다.
'Hacking Contest' 카테고리의 다른 글
[2019 Encrypt CTF] vault (0) | 2019.04.03 |
---|---|
[2019 Encrypt CTF] Sweeeeeet (0) | 2019.04.03 |
[Sunshine CTF 2019] Wrestler Name Generator (0) | 2019.03.31 |
[Sunshine CTF 2019] WrestlerBook (0) | 2019.03.31 |
2019 TAMUctf Write-Up (0) | 2019.02.26 |