writeups by ch4nsec

[TAMU CTF] Forgotten Password 풀이

비밀번호 초기화 과정의 include 함수 취약점을 이용한 계정 탈취 문제 풀이

#ctf#web#TAMU CTF

문제 개요

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

tamu_forgotten_password1

풀이

tamu_forgotten_password2

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

tamu_forgotten_password3

아마 비밀번호 초기화를 위해 가입 시 등록했던 이메일로 비밀번호를 초기화해주는 기능일 것이다.

우리는 공격 대상의 이메일은 알고 있지만 당장에는 견적이 잘 안 잡히니 제공된 코드를 확인해볼 것이다.

tamu_forgotten_password4

아씨 루비 모르는데..

이 코드는 비밀번호 초기화 과정에 관한 코드이다. 데이터베이스 내에 입력한 이메일을 사용하는 유저가 존재하면 해당 이메일로 복구 메일을 보내는 것으로 추측할 수 있다.

그런데 뭔가 이상한데?

if params[:email].include?(user.email)
	user_found = true
	break

위 조건문을 해석해보면 email이라는 파라미터의 값에 사용자의 이메일 값이 포함되어 있을 경우 user_found 값을 true로 변경한다. 그리고 사용자의 입력값(이메일)에 복구 메일을 보낸다.

이메일 값이 포함되어 있을 경우. include 함수를 썼다.

그 말은, 공격 대상의 이메일과 완벽하게 일치하지 않아도 사용자(공격자)의 입력값에 유저의 이메일이 포함만 되어있다면 등록된 사용자로 인지하고 이메일을 보낸다는 것이다.

이러한 점을 이용하였다.

tamu_forgotten_password5

위 그림은 burp suite로 요청을 intercept해서 공격 대상 이메일 앞에 내 이메일과 NULL 바이트(\x00)를 삽입하였다. 이렇게 하면 공격 대상의 이메일도 포함되어 있어 검증 과정을 통과할 수 있고, 이메일은 내(공격자의) 이메일로 오는 것이다.

참고 - 다른 풀이

사실 이건 다른 사람들의 풀이고, 실제로 내가 사용한 풀이는 공격자 아이디 앞에 다른 문자열을 추가하여 새로 아이디를 팠다. (myemailb8500763@gmail.com)

이 역시 공격 대상의 이메일이 포함되어 있어 검증 과정을 우회할 수 있다. 이 경우에는 이 이메일 자체가 내 이메일이니 복구 메일을 받을 수 있다.

tamu_forgotten_password6

그런데 CTF 기간이 끝나서 그런가 메일이 안온다

뭐 쨌든 이렇게 풀었다