해킹스터디

[Normaltic 웹해킹 입문] 6주차 CTF 문제풀이 - Login Bypass(3)

herini0829 2025. 11. 27. 22:06

🔓 [웹 해킹 스터디] Login Bypass 3: UNION으로 가짜 계정 생성하기

이번 Login Bypass 3 문제는 고민하느라 진짜, 진짜, 진짜 힘들었다... 🤯
단순한 참/거짓 논리(Boolean based)가 아니라, UNION을 이용해 데이터를 조작해야 풀리는 문제였기 때문이다. 그 삽질과 해결 과정을 정리해 본다.

목표: doldol / dol1234 계정을 가지고 normaltic3 계정으로 로그인 성공하기


1. 취약점 분석 및 로직 추론

먼저 ' and '1'='1 같은 기본 인젝션은 먹히는데, or '1'='1로 로그인이 우회되지는 않는다. 여기서 알 수 있는 사실은?

💡 식별과 인증의 분리
이 서버는 SELECT * FROM member WHERE id='..' AND pw='..' 처럼 한 번에 검사하는 게 아니다.
1. 식별: ID가 존재하는지 먼저 DB에서 찾고, 그 행(Row)의 정보를 가져온다.
2. 인증: 가져온 정보의 PW와 사용자가 입력한 PW를 애플리케이션 코드단에서 비교한다.

그렇다면 우리가 할 일은 "내 맘대로 조작된 ID/PW 세트를 DB에서 반환하게 만드는 것"이다. 이를 위해 UNION을 사용한다.

1-1. 컬럼 개수 파악 (ORDER BY)

UNION을 쓰려면 컬럼 개수를 맞춰야 한다.

  • doldol' order by 1 # -> 성공
  • doldol' order by 2 # -> 성공
  • doldol' order by 3 # -> 실패 (에러)

결론: 이 쿼리는 2개의 컬럼(아마도 id, pw)을 반환한다.


2. 공격 시나리오 설계

서버의 로직은 대략 이럴 것이다.

SELECT id, pw FROM member WHERE id='[입력값]'

우리가 UNION을 이용해 normaltic3와 비밀번호 1234를 반환하게 만들고, 실제 로그인 창 비밀번호 칸에 1234를 입력하면?
서버는 "어? DB에서 가져온 비번(1234)랑 입력한 비번(1234)가 같네?" 하고 로그인을 시켜줄 것이다.

시도 1: 존재하는 ID 사용 (실패)

doldol 계정을 이용해 시도해 보았다.

ID Payload: doldol' union select 'normaltic3', '1234' #
PW Input: 1234

[DB 반환 결과]

id pw
doldol dol1234
normaltic3 1234

결과: 로그인 실패.
이유는 doldol이 실제로 존재하는 계정이라 첫 번째 줄에 잡히기 때문이다. 서버 코드는 보통 첫 번째 행(Row)만 가져와서 검증한다.
DB의 dol1234와 내가 입력한 1234가 다르므로 실패!

시도 2: 존재하지 않는 ID 사용 (성공!)

그렇다면 앞의 쿼리 결과가 없게(NULL) 만들면 된다. 존재하지 않는 ID(abcd)를 넣자.

ID Payload: abcd' union select 'normaltic3', '1234' #
PW Input: 1234

[DB 반환 결과]

id pw
(abcd에 대한 결과 없음)
normaltic3 1234

앞의 쿼리는 결과가 없으므로, UNION으로 합친 뒷부분(우리가 조작한 가짜 데이터)이 첫 번째 행이 된다.
서버는 DB 비번(1234) == 입력 비번(1234)를 확인하고 로그인을 시켜준다!

짜잔~ index로 보내주고 index 가보니 플래그 획득!!

 


3. 최종 정리

Login Bypass 3번의 핵심은 두 가지였다.

  1. 식별/인증 분리 파악: 단순 우회(OR)가 안 될 땐, DB에서 데이터를 가져와서 비교하는 로직임을 의심하자.
  2. UNION의 특성 활용: 앞의 쿼리를 거짓(존재하지 않는 값)으로 만들어야 뒤에 붙인 UNION 결과값이 유효한 데이터로 사용된다.

이 원리를 이해하니 abcd' union select 'normaltic3', '1q2w3e4r5t' # 처럼 비밀번호를 길게 설정해도 내 맘대로 로그인이 가능했다. 완벽하게 이해 완료! 😎