https://dreamhack.io/wargame/challenges/984
처음 풀 문제는 baby-union 이라는 문제이다.

해당 문제에 접속을 하면, sql query문이 보이고, uid, upw를 입력하는 칸이 보인다.

SQLI 가능 확인

우선 sql injection이 가능한지 확인하기 위해서 admin'#를 uid에 넣고, upw에는 아무 문자열이나 넣는다.

그렇다면 admin계정으로 접속 되는걸 확인할수 있다.

해당 코드를 넣었을때 sql 쿼리문은 이렇게 변한다.
SELECT * FROM users WHERE uid='admin'#' and upw='';
admin을 넣고, '으로 uid를 닫아주고, #으로 뒤에 upw를 무시해준다.

table_name 획득

그렇다면 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_schemaDB의 메타 정보(테이블, 컬럼, 인덱스 등의 스키마 정보)를 모아둔 DB이다.
information_schema.tables는 스키마의 테이블 정보를 가져오는 명령어이다.

column_name 획득

다음 테이블들을 확인해 봤을때, 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 안의 컬럼들을 출력한 것이다.

flag 획득

이제 컬럼의 데이터를 가져오자.
' union select sname, svalue, sflag, sclose from onlyflag #
이렇게 한다면 sclose가 누락되어 있는것을 볼수 있다. 그러니 한개씩 땡겨서
' union select svalue, sflag, null, sclose from onlyflag #
이렇게 하면 flag값이 출력되는걸 볼수 있다.

profile
개발과 보안을 공부하고 있습니다.

0개의 댓글

Powered by GraphCDN, the GraphQL CDN