Union SQL Injection이란?
SQL문의 UNION 함수를 이용하여 데이터베이스에서 정보를 빼내는 SQL Injection 공격 중 하나이다.
정상적으로 입력창에 입력한 뒤 출력된 결과 + union으로 추가로 요구한 데이터베이스 정보가 함께 출력되어 주요 데이터가 유출되기에 굉장히 위험하면서도 기초적인 취약점 진단 내용 중 하나이다.
예시
어떠한 웹페이지에 주소 '동'을 입력하여 검색한 결과 해당 동에 맞는 우편번호를 출력하는 기능이 있다고 가정할 때, 해당 검색을 통해 데이터베이스에서 정보를 가져오는 코드는 아래와 같으며, DB는 Oracle로 되어 있다고 가정한다.
아래의 실습은 실제 상용화되어 있는 웹페이지가 아닌, 모의해킹을 위해 만들어진 가상의 웹사이트를 가지고 실행한 실습으로 출력된 데이터 또한 실제 사용자 데이터가 아닙니다.

위를 보면 코드에 SQL문이 그대로 쓰여져서 바로 가져오고 있고, param_dong에 입력한 것이 그대로 SQL문에 입력되는 것을 확인할 수 있다. 이러한 부분을 이용하여 Union SQL Injection을 실행해보고자 한다.
Step1. ORDERY BY
먼저 ORDER BY 함수를 통해서 출력되는 결과가 몇번째 행까지 되는지 확인한다.
'ORDER BY 1,2,3 --


위 사진을 보면 알 수 있듯이 3까지 썼을 때는 정상적으로 출력되었으나, 4부터는 에러가 나타나는 것을 확인할 수 있다. 이는 앞에서 SELECT로 출력되는 기존 결과가 3행까지만 출력되기 때문에 발생하는 것으로 따라서 이후 UNION으로 출력할 데이터들도 3행까지만 출력하도록 해야하는 것을 확인할 수 있다.
Step2. 테이블명 알아내기
해당 웹페이지의 데이터베이스에서 사용자 정보가 저장되어 있는 테이블명을 알아낼 것이다. 해당 웹페이지는 Oracle로 DB가 이루어져 있으므로 기본 테이블인 all_tables에서 모든 테이블의 이름(table_name)을 불러온다. 이때 UNION 함수를 사용한다.
# 예시 사진에서 작성한 SQL문
‘ UNION SELECT 1, table_name, ‘3’ FROM all_tables WHERE ‘3’ LIKE ‘
# 원하는 구문만 삽입하고 뒤에 필요없는 부분은 주석처리한 SQL문
‘ UNION SELECT 1, table_name, ‘3’ FROM all_tables --

테이블 수가 너무 많은 관계로 편의를 위해 테이블명에 'MEMBER'가 있는 테이블명만 따로 추출한다.
‘ UNION SELECT 1, table_name, ‘3’ FROM all_tables WHERE table_name LIKE ‘%MEMBER%’ --

해당 SQL문을 실행한 결과 2개의 테이블명만 출력된 것을 확인할 수 있다. 이 중에서 LHSMEMBER3의 데이터를 빼내어 사용자 정보를 탈취해보도록 하겠다.
Step3. 테이블 컬럼명 불러오기
데이터를 불러오기 위해서는 테이블명뿐만 아니라 컬럼명도 알아야 되기에 UNION 함수를 이용하여 LHSMEMBER3의 컬럼명을 출력한다.
‘ UNION SELECT 1, column_name, ‘3’ FROM all_tab_columns WHERE table_name LIKE ‘LHSMEMBER3’ --

해당 SQL문의 결과를 살펴보았을 때, 로그인할 때 필요한 ID, PW 컬럼이 있는 것을 확인할 수 있다.
Step4. 원하는 데이터(ID, PW) 출력하기
마찬가지로 UNION 함수를 이용하여 LHSMEMBER3의 ID와 PW 데이터를 출력한다.
‘ UNION SELECT 1, ID, PW FROM LHSMEMBER3 --


대응방안
SQL Injection은 기본적으로 웹페이지에서 사용자가 입력한 값을 필터링없이 그대로 가져와서 직접 SQL문을 통해 웹에서 데이터베이스에 접근해 데이터를 가져오기 때문에 발생하는 것이다.
따라서 SELECT, UNION, ORDER 등의 대표적인 SQL 명령어가 입력되었을 때 이를 필터링하거나 아예 입력조차 못하게 설정을 해야하며, 웹에서 DB에 곧바로 접속 및 SQL문을 이용하여 데이터를 가져오는 것 또한 하지않고 백엔드 서버에서 일부 필요한 데이터만 가져오면 프론트엔드에서 해당 데이터만 가지고 출력하는 등의 방식으로 수정해야할 것이다.
'정보 보안 > 취약점 분석' 카테고리의 다른 글
| CSRF (0) | 2024.08.25 |
|---|---|
| XSS (0) | 2024.08.25 |
| Blind SQL Injection (0) | 2024.08.25 |
| Error-based SQL Injection (0) | 2024.08.19 |
| XSS (0) | 2024.06.27 |