[LINE CTF 2022] review

yoobi·2022년 5월 31일
0

Team : APT0
Rank : 116/665th

Review

첫 LINE CTF였다. 열심히 문제보면서 제일 솔버 많은 웹문제에 계속 도전했지만 최종적으로 풀지 못했다. 역시 메이저 CTF의 벽은 높은 것 같다. 꾸준히 공부하고 도전해서 꼭 내년 대회에는 많은 문제를 풀 수 있는 사람이 되고싶다.

Web

gotm / 102pts / 96 solved

https://domdom.tistory.com/entry/LINECTF2022-WEB-gotm-%EB%AC%B8%EC%A0%9C%ED%92%80%EC%9D%B4writeup

tag) golang, SSTI

서비스)

  • /, /auth, /flag, /regist 가 존재
  • regist 시 jwt 생성하여 auth에 활용
  • /flag로 FLAG 얻으려면 생성된 jwt-data의 is_admin 값이 true이어야 함
  • regist로 만든 것은 모두 is_admin이 false

풀이)
(1) / 서비스는 acc.id 값을 파싱해준다

tpl, err := template.New("").Parse("Logged in as " + acc.id)
tpl.Execute(w, &acc)

(2) regist에 우리가 입력하는 id 값을 template을 이용해 뿌려주는데, 이때 입력값에 제한은 없다
(3) input을 넣을 수 있고 그 값이 그대로 파싱에 활용되는 상황 -> SSTI를 생각해내야 한다
(4) acc.id에 {.} 가 들어가면 Account라는 구조체의 구조 전체를 출력한다

type Account struct {
	id         string
	pw         string
	is_admin   bool
	secret_key string
}

(5) 생각해보면 Account 구조체에 secret_key가 있을 이유가 없는데, 문제에서 이 풀이를 유도함을 알 수 있다
(6) secret_key 확인이 가능하므로, is_admin 값이 true인 jwt token을 만들어 전송하면 FLAG를 획득할 수 있다

FLAG : LINECTF{country_roads_takes_me_home}

profile
this is yoobi

0개의 댓글