SQL Injection CTF 제작

Minseok Jo·2024년 8월 5일

1. 제작 동기

CTF 만들어보기 - SQL Injection 편입니다.

이전에 모의해킹 프로젝트를 진행할 당시 SQL Injection을 통한 로그인 우회 취약점을 찾으려 했는데, 대상 사이트가 비밀번호를 해시로 변환하여 저장했기 때문에 어떤 해시 알고리즘을 사용하는지 알아내야 했습니다.

대상 사이트의 자유 게시판에 Union Based SQL Injection 취약점이 존재하였기 때문에, 이를 이용하여 화면에 비밀번호가 출력되도록 함으로써 어떤 해시 알고리즘을 사용하는지 알아낸 후, 이 정보를 바탕으로 다시 로그인 과정에서 SQL Injection을 성공한 경험이 있습니다.

해당 경험을 바탕으로 동일한 시나리오의 SQL Injection 문제를 제작해보았습니다.


2. 작성 페이지

SQL Injectin 문제를 위해 작성한 페이지는 다음과 같습니다.

1. 메인 페이지 (index.php)

2. 로그인 페이지 (login.php)

3. 회원가입 페이지 (login.php)

4. 자유 게시판

5. 게시글 작성 페이지 (write_form.php)

6. 마이 페이지 (mypage.php)

3. CTF 문제 해결 시나리오

  1. 로그인 페이지에서 SQL Injection 존재
  2. 식별/인증을 분리하여 로그인 과정을 수행하도록 하였기 때문에 Union Based SQL Injection 수행 필요
  3. 회원가입시 비밀번호를 해시 처리하여 저장하기 때문에, 해시 알고리즘을 종류를 알아내야 함.
  4. 게시판에도 SQL Injection 취약점이 존재하므로, 이를 통해 해시화된 비밀번호가 출력되도록 함으로써 해시 알고리즘을 알아냄.
  5. 4) 과정에서 알아낸 정보를 이용하여 로그인 SQL Injection 수행
  6. admin으로 로그인 후, 마이페이지 방문시 FLAG 출력.

4. 문제 해결 과정

1. CTF 사이트 방문
사이트 방문시, 회원만 이용 가능하므로 로그인(회원가입) 화면으로 이동



2. 회원가입 수행
아이디: user, 비밀번호: 123 으로 회원가입 완료



3. 로그인 과정에서 SQLi 취약점 확인
↑ 정상 로그인 과정
↑ 항등원(and 1=1) 사용 가능 확인   ∴ SQL Injection 취약점 확인
↑ 주석을 사용한 SQLi 수행(실패) ∴인증/식별 분리 case로 추측
↑ order by를 통해, 사용되는 컬럼 개수 확인 (3개)
↑ 컬럼 개수에 맞춰 Union Based SQLi 수행(실패)  ∴ 해시 사용 추측



4. 자유 게시판에서 SQL Injection 취약점 확인
↑ search 파라미터에 공지%' and '1%"='1 입력 (참 조건)
↑ search 파라미터에 공지%' and '1%"='2 입력 (거짓 조건)
참/거짓 조건의 실행 결과가 다른 것을 확인.   ∴SQL Injection 취약점 확인



5. 게시판의 SQL Injection 취약점을 통해 DB 정보 출력
↑ 컬럼 개수 확인 (9개)
↑ 컬럼 출력 위치 확인
↑ 데이터베이스 이름 추출 (langle)
↑ 테이블 이름 추출 (board, notice, user)
↑ user 테이블의 컬럼 이름 추출 (email, id, level, name, num, pass)
↑ 이용자들의 id 와 비밀번호 추출
↑ HINT 유저의 비밀번호 Decode 결과, crc32 해시 알고리즘 사용 확인



로그인 SQL Injection 수행
↑ 게시판에서 알아낸, crc32() 해시 함수를 사용하여 SQL Injection 수행
↑ admin 계정으로 로그인 성공
↑ 마이페이지에 접속하여 Flag 확인

0개의 댓글