Team : APT0
Rank : 116/665th
첫 LINE CTF였다. 열심히 문제보면서 제일 솔버 많은 웹문제에 계속 도전했지만 최종적으로 풀지 못했다. 역시 메이저 CTF의 벽은 높은 것 같다. 꾸준히 공부하고 도전해서 꼭 내년 대회에는 많은 문제를 풀 수 있는 사람이 되고싶다.
https://domdom.tistory.com/entry/LINECTF2022-WEB-gotm-%EB%AC%B8%EC%A0%9C%ED%92%80%EC%9D%B4writeup
tag) golang, SSTI
서비스)
풀이)
(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}