IT 성장기 (교육이수)/CTF 문제풀이

[모의해킹 CTF] Secret Login

eezy 2024. 5. 20. 00:16

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

Secret Login

 

<목차>

 

1. 사이트 분석

2. DB 구성 유추

3. Limit

 

CTF 문제 : id, password를 모르는 관리자 계정을 탈취하라!

 

사이트 분석

1. 주어진 doldol 아이디로 로그인 시도

 

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

  • 로그인 정보를 입력하면, POST 방식으로 데이터를 전송하며
  • HTTP 302 응답 코드로, index.php로 리다이렉트 한다. 

로그인 시도 시

  • 로그인에 성공하면, index.php로 리다이렉트 된다.
  • 해당 페이지에서는 특이점은 없다. 

index.php

▶ 기본 SQL Injection 확인

  • 우선, AND 와 OR 문을 이용한 기본 SQL 인젝션이 가능한지 확인 해보았다.
  • OR 구문이 가능하다면, 1=1 조건을 추가하여 다른 데이터도 가져올 수 있을 것이다. 

결과 : 로그인 성공

AND 구문
OR 구문

 DB 구성 유추

 SQL 쿼리문 

  • OR 문을 작성하였을 때, 하기와 같이 DB에 질의하는 것으로 보이며
  • UserId와 Password 값으로 사용자를 인증하고 있다. 
SELECT * FROM member WHERE UserId=‘doldol’ OR '1'='1' AND Password=‘dol1234’

 

  • 위 내용으로 보았을 때, DB는 아래와 같이 유추해볼 수 있다. 
  • Table 이름은 알 수 없으니 임의로 부여하고
  • Primary KEY를 UserId 값으로 설정한 것은 통상적으로 id를 식별자로 쓰기 때문이다.
CREATE TABLE member (
    UserId VARCHAR(255) NOT NULL,
    Password VARCHAR(255) NOT NULL,
    PRIMARY KEY (UserId)
);
  • SQL문으로 DB는 몇개의 column으로 구성되어 있는지 알아볼 수 있을까?

 Order By

  • 이 부분은, 문제를 푸는데 영향은 없지만, DB의 구성을 자세히 살펴보기 위해 실행해 보았다. 
SELECT * FROM member WHERE UserId=‘doldol’ ORDER BY 6# AND Password=‘dol1234’

 

  • Order by N# 구문을 사용하여, N+1 로 로그인 실패 시 까지 진행해보았다. 
  • N=6 까지 로그인 성공되며, 이후로는 로그인에 실패한다.
  • 이로써 DB는 총 6개의 column으로 이루어져 있다는 것을 알 수 있다. 
CREATE TABLE member (
    UserId VARCHAR(255) NOT NULL,
    Password VARCHAR(255) NOT NULL,
    Col_3 VARCHAR(255),
    Col_4 VARCHAR(255),
    Col_5 VARCHAR(255),
    Col_6 VARCHAR(255),
    PRIMARY KEY (UserId)
);

Limit

 Limit 함수를 통해 모든 데이터 불러오기

  • 위 내용을 통해 유추할 수 있는 것은, UserId 가 첫 Column에 위치한다는 것이다. 

 Limit 구문

  • SELECT Row From Table WHERE LIMIT 시작 행, 데이터 개수
  • 1행에서 2개의 데이터를 출력한다

 

 Limit 구문 활용

SELECT * FROM member WHERE UserId=‘doldol’ OR 1=1 LIMIT 1,1# AND Password=‘dol1234’

 

 결과 : 로그인 성공

  • 두 번째 행부터 데이터를 가져오라는 SQL 문을 활용하여, 로그인에 성공했다. 
  • 만약 접속해야 할 admin 데이터가 두 번째 행에 존재하지 않았다면, LIMIT 1, N# 으로 데이터가 존재하는 N 번째 행 까지 실행하여 데이터를 얻을 수 있다.