IT 성장기 (교육이수)/CTF 문제풀이
[모의해킹 CTF] Secret Login
eezy
2024. 5. 20. 00:16
모의해킹 스터디 중 CTF 문제에 대한 풀이 과정을 서술하며, 문제에 도달하는 과정을 이해하기 위한 목적으로 작성.
Secret Login
<목차>
CTF 문제 : id, password를 모르는 관리자 계정을 탈취하라!

사이트 분석
1. 주어진 doldol 아이디로 로그인 시도
▶ 로그인 패킷에서 확인되는 점
- 로그인 정보를 입력하면, POST 방식으로 데이터를 전송하며
- HTTP 302 응답 코드로, index.php로 리다이렉트 한다.

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

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


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 번째 행 까지 실행하여 데이터를 얻을 수 있다.