[Dreamhack] baby-union
▶문제

▶문제 속 용어 정리
1. SQL : 데이터베이스에서 데이터를 추출하고 조작하는 데에 사용하는 데이터 처리 언어
2. SQL INJECTION: 악의적인 사용자가 보안상의 취약점을 이용하여, 임의의 SQL 문을 주입하고 실행되게 하여 데이터베이스가 비정상적인 동작을 하도록 조작하는 행위
3. SQL INJECTION 취약점: 데이터베이스와 연동된 웹 애플리케이션에서 공격자가 입력 폼 또는 URL 입력란에 SQL 구문을 삽입하여 DB를 조작할 수 있는 취약점
▶풀이

서버에 들어가니 위와 같은 화면이 나왔다. uid와 upw를 입력해야할 것 같다. 우선 문제에서 언급한 init.sql 파일을 열어보았다. 파일명으로 보아하니 주입하는 sql문과 관련된 내용이 있을 것 같다.

위와 같은 코드가 나왔다. 그 중 sql문을 주입해야하니 INSERT INTO 부분이 눈에 띄었다.

일단...uid와 upw에 해당하는 값을 넣어보았다.



위와 같이 3개의 화면이 나왔다. 여기서 더 뭘해야할지 모르겠어서 문제를 다시 읽어보았다. 테이블명과 칼럼명과 관련된 내용이 언급되어 있었다.
UNION
여러 쿼리문들을 합쳐서 하나의 쿼리문으로 만들어주는 방법이다. 중복된 값을 제거하고 보여준다.
테이블과 칼럼
테이블: 데이터베이스 관리 시스템에서 가장 기본이 되는 객체
칼럼: 각각의 데이터 값에 대한 열. 하나의 열에 데이터가 들어가는 속성을 의미하기도 한다.
SQL UNION 공격
1. SQL INJECTION 공격이 가능한지 먼저 확인하여야 한다.
uid: admin'# ( pw에는 그냥 아무 단어 s를 입력하였다.)

admin 계정으로 접속한 것을 보니 공격이 가능하다.
2. 코드를 통해 칼럼의 개수가 4개인 것을 확인할 수 있다.

3. ' union select table_name, null, null, null from information_schema.tables#
위의 명령어를 통해 원하는 table_name을 출력할 수 있다. 위와 같이 입력하면 테이블 목록이 쭉 나오는 것 같다,

이렇게 테이블 목록이 쭉 나오는데

onlyflag라는 테이블이 눈에 띈다. flag 값을 여기서 찾을 수 있을 것 같다.
4. 이제 onlyflag 테이블의 칼럼을 알아야한다.
' union select column_name, null, null, null from information_schema.columns where table_name='onlyflag' #
위의 명령어를 입력해보면

onlyflag라는 테이블에 있는 칼럼을 알 수 있다.
5. ' union select sname, svalue, sflag, sclose from onlyflag #
위의 명령어를 입력하여 onlyflag 테이블의 sname, svalue, sflag, sclose라는 4개의 column을 조회한다.

입력하니 flag 값이 끝까지 나오지 않았다! 우리가 볼 수 있는 칼럼은 3개이므로 null을 넣어 바꾼 후 명령어를 입력해주면 된다고 한다.
' union select svalue, sflag, null, sclose from onlyflag #

#부터 description 부분까지 쭉 연결해서 입력해주면 된다.

문제 풀이에 성공하였다!
나에게는 너무 어려웠지만...sql injection 공격을 처음으로 알게 된 문제였다!