[모의해킹 CTF] Login 인증우회

모의해킹 스터디 중 CTF 문제에 대한 풀이 과정을 서술하며, 문제에 도달하는 과정을 이해하기 위한 목적으로 작성. 

 

Login Bypass2

<목차>

1. 사이트 분석

2. SQL Injection

3. 로그인 우회 : 주석

 

사이트 분석

1. 주어진 로그인 키를 활용하여 사이트 동작 방식을 확인한다. 

 

▶ 로그인 패킷에서 확인되는 점

  • POST 방식으로 입력된 아이디와 비밀번호를 전달한다.
  • POST 로 보낸 데이터를 어떠한 SQL 쿼리를 거쳐 GET 방식으로 전달 및 인증되고 있다. 
  • SQL 인젝션이 가능한지, 확인해보자!

로그인 시 패킷

 

index.php 에서 로그인 정보 확인

SQL Injection 

1. 주어진 doldol 아이디로 기본 SQL 인젝션 시도

  • UserId : doldol' AND '1'='1
  • Password : dol1234

▶ 결과 : 로그인 성공

  • 로그인 질의 Query문을 아래와 같이 생각할 수 있다. 
  • 기본 SQL 인젝션이 가능하다면, OR로 Password 확인을 건너뛸 수 있는지 확인이 필요하다.
SELECT * FROM users WHERE UserId = 'doldol' AND '1'='1' AND Password = 'dol1234';

 

2. 로그인해야 하는 normaltic2 아이디로 OR문을 시도해보자

  • UserId : normaltic' OR '1'='1
  • Password : anything

 결과 : 로그인 실패

  • 로그인 질의 Query문을 아래와 같이 생각할 수 있다. 
  • 아래 구문은, OR '1'='1' 조건 때문에 전체 쿼리가 참으로 평가되어, 비밀번호를 확인하지 않고 normaltic2 계정으로 로그인될 수 있다.

 실패 사유 분석

  • OR 1=1은 항상 참이므로, 이 부분은 무조건 참이 되며, 비밀번호를 확인하지 않는다.
  • 하지만 이 구문으로 로그인을 실패했기에, 비밀번호를 확인하지 않더라도 쿼리의 나머지 부분이 영향받는다 유추할 수 있다.
  • 만약 주석이 올바르게 해석되지 않거나 추가적인 필터링이 있는 경우, 쿼리가 올바르게 작동하지 않을 수 있다.
SELECT * FROM users WHERE UserId = 'normaltic2' OR '1'='1' AND Password = 'anything';

 

3. 만약 올바른 비밀번호를 입력 시, OR문은 작동할까?

  • UserId : doldol' OR '1'='1
  • Password : dol1234

 결과 : 로그인 실패

  • 비밀번호가 일치하더라도, 쿼리 구문의 어떠한 부분에서 OR 문의 작동이 막힌 것을 알 수 있다.

로그인 우회 : 주석

1. 주석을 사용하여, UserId 만으로 인증을 시도해보자

  • UserId: normaltic2' -- 
  • URL encoding ID : normaltic2%27+--+
  • Password: anything

 결과 : 로그인 성공

  • 주석(--)을 사용하여 Password 조건을 무시하게 만들어, UserId 조건만으로 쿼리가 실행된다. 
  • UserId 값만 맞으면, 비밀번호를 검증하지 않고 로그인할 수 있다. 
SELECT * FROM users WHERE UserId = 'normaltic2' -- ' AND Password = 'anything';