문제 개요
비밀번호 초기화 과정상의 취약점이 존재한다. 이 취약점을 이용하여 공격대상 계정을 탈취하는 문제이다.

풀이

아무 이상 없는 로그인 창이다. SQL injection 등의 취약점이 발생하는 정황도 없다. 당장 보이는 기능은 없고 비밀번호 초기화 기능(으로 추정되는 것)만 존재하니 일단 어떤 화면인지 확인을 해보았다.

아마 비밀번호 초기화를 위해 가입 시 등록했던 이메일로 비밀번호를 초기화해주는 기능일 것이다.
우리는 공격 대상의 이메일은 알고 있지만 당장에는 견적이 잘 안 잡히니 제공된 코드를 확인해볼 것이다.

아씨 루비 모르는데..
이 코드는 비밀번호 초기화 과정에 관한 코드이다. 데이터베이스 내에 입력한 이메일을 사용하는 유저가 존재하면 해당 이메일로 복구 메일을 보내는 것으로 추측할 수 있다.
그런데 뭔가 이상한데?
if params[:email].include?(user.email)
user_found = true
break
위 조건문을 해석해보면 email이라는 파라미터의 값에 사용자의 이메일 값이 포함되어 있을 경우 user_found 값을 true로 변경한다. 그리고 사용자의 입력값(이메일)에 복구 메일을 보낸다.
이메일 값이 포함되어 있을 경우. include 함수를 썼다.
그 말은, 공격 대상의 이메일과 완벽하게 일치하지 않아도 사용자(공격자)의 입력값에 유저의 이메일이 포함만 되어있다면 등록된 사용자로 인지하고 이메일을 보낸다는 것이다.
이러한 점을 이용하였다.

위 그림은 burp suite로 요청을 intercept해서 공격 대상 이메일 앞에 내 이메일과 NULL 바이트(\x00)를 삽입하였다. 이렇게 하면 공격 대상의 이메일도 포함되어 있어 검증 과정을 통과할 수 있고, 이메일은 내(공격자의) 이메일로 오는 것이다.
참고 - 다른 풀이
사실 이건 다른 사람들의 풀이고, 실제로 내가 사용한 풀이는 공격자 아이디 앞에 다른 문자열을 추가하여 새로 아이디를 팠다. (myemailb8500763@gmail.com)
이 역시 공격 대상의 이메일이 포함되어 있어 검증 과정을 우회할 수 있다. 이 경우에는 이 이메일 자체가 내 이메일이니 복구 메일을 받을 수 있다.

그런데 CTF 기간이 끝나서 그런가 메일이 안온다
뭐 쨌든 이렇게 풀었다