개발/코딩테스트

[CTF] segfault practice - SQL Injection 1

prpn97 2024. 5. 23. 22:55

이번 문제는 테이블을 검색하는 칸이 주어져 있고, 다른 데이터를 찾아내는 문제다. 

 

sql인젝션에서 가장 중요한 포인트는 구현되어 있는 sql문이 정확하게 어떤 구조로 되어있는지 파악하는 부분이라고 생각이 되었다. 

 

그래서 먼저 나와있는 값의 대부분 a가 들어있어서 a를 검색했는데 a가 속한 3개의 값이 나왔고, a ' or '1 를 입력했는데, 전체 값이 나왔다. 

 

여기까지의 힌트를 통해 2가지를 유추했다.

- sql문이 적어도 like 를 이용한 구문이라는 것

- 4개를 뽑아낸 것이 아니라 전체 값이 저 4개라는 것 (보이는 데이터는 숨겨진 데이터와 아무런 상관이 없다고 생각했다.)

 

그래서 다른 테이블의 값을 찾아내는 것을 목표로 했다. 

1. 테이블 목록 조회

a%' UNION SELECT table_name, 1, 1, 1 FROM information_schema.tables #

 

위 구문을 통해 이전 문제들로 학습한 union으로 테이블 자체를 뽑아냈고, 나머지 칸들은 1로 채워주었다. 확실히 mysql과 친숙하고 개발경험이 있는게 너무 큰 도움이 되는 것 같다. 

 

입력해보면 테이블에는 익숙한 innodb 관련 기본 세팅된 테이블도 그렇고 현재 있는 테이블이 주루룩 나온다. 

그리고 마지막을 보면 flag_table부터는 해당 서버에 생성한 테이블들로 확인된다. 

 

먼저는 기존에 우리가 알고 있는 4개의 데이터가 user_info일 것이고 일단 문제와는 관련없는 테이블일 것이라 생각해서 flag_table을 조회해보려 한다. 이 때 값을 알기 위해 먼저 컬럼명을 조회하고 나머지는 1로 채워주었다. 

 

2. 조회한 테이블의 컬럼명 조회

A%' UNION SELECT column_name, 1, 1, 1 FROM information_schema.columns WHERE table_name='flag_table' #

컬럼명에는 flag만 나오는 것을 알 수 있다. 

 

그러면 이제 flag_table 테이블의 flag 컬럼명에 해당하는 값을 찾아보자. 

 

3. 조회한 테이블의 컬럼명에 해당하는 값 조회

A%' UNION SELECT flag, 1, 1, 1 FROM flag_table #

조회하니까 플래그가 바로 나왔다. 

 

728x90