사이버안전센터 운영

[Special Report] 웹 취약점과 해킹 매커니즘 #3 UNION SQL Injection
제목 [Special Report] 웹 취약점과 해킹 매커니즘 #3 UNION SQL Injection
작성자 사이버보안팀 등록일 2022-06-17 조회수 516
내용

 개요

SQL Injection은 사용자 입력값을 검증하지 않아 설계된 쿼리문에 의도하지 않은 쿼리를 임의로 삽입하여 악의적인 SQL 구문을 실행시키는 공격이다. 이번 Special Report는 UNION SQL Injection의 개념과 SQL Injection 공격에 취약한 소스코드로 구현한 게시판의 검색 기능에서 원하는 데이터를 추출하는 과정까지의 내용을 다룬다.

※ 실제 운영 중인 서버에 테스트 또는 공격을 하는 행위는 법적인 책임이 따르므로 개인용 테스트 서버 구축 또는 bWAPP, DVWA, WebGoat 등과 같은 웹 취약점 테스트 환경 구축을 통해 테스트하는 것을 권장한다.

※ 본 Special Report는 JSP와 Oracle Database 11gR2를 사용하여 취약한 서버를 구축하였다.

 환경 구성

UNION SQL Injection은 주소 찾기, 게시글 검색 등 사용자 입력값을 받아 그 결과를 페이지에 출력해 주는 기능에서 볼 수 있다. 이번 리포트에서는 웹 취약점 테스트용으로 구축한 서버의 게시판에서 진행된다. 아래의 그림과 같이 구성되었으며 사용자가 제목에 해당하는 특정 단어를 검색하면 서버는 데이터베이스에서 결과를 불러와 화면에 출력해 준다.


 

[UNION SQL Injection 취약점이 있는 게시판 페이지]



게시판의 검색 기능은 다음과 같은 취약한 소스코드로 구성되어 있다. 사용자 입력값인 searchWord에 대한 입력값 필터링이 존재하지 않아 공격자는 쿼리 조작이 가능하다. 





[SQL Injection에 취약한 소스코드]




 UNION SQL Injection

UNION SQL Injection은 기존의 SELECT문에 UNION SELECT문을 추가하여 원하는 정보를 데이터베이스에서 추출하는 공격이다.

UNION 연산자[1]는 아래의 그림과 같이 두 개 이상의 SELECT문에 대한 결과를 하나의 결과로 추출한다.

[1] UNION은 기본적으로 중복을 제거한 결과를 보여준다. 중복을 포함한 결과를 추출할 경우 UNION ALL을 사용하면 된다.

공격자는 이러한 점을 이용하여 기존의 SELECT문에 원하는 데이터를 추출하기 위한 UNION SELECT문을 추가하여 쿼리 결과를 확인할 수 있다.

UNION 연산자를 사용하기 위해서는 두 가지 조건을 만족해야 한다.


1) 기존의 SELECT문과 UNION SELECT문의 컬럼 수가 동일해야 한다.

※ 컬럼 수가 동일하지 않을 경우 아래의 그림처럼 에러 메시지를 반환한다.


2) 각각의 컬럼은 순서 별로 동일한 데이터형이어야 한다.[2]

※ 각 컬럼의 데이터형이 동일하지 않을 경우 아래의 그림처럼 에러 메시지를 반환한다.

[2] MySQL의 경우 자동 형 변환이 이루어지기 때문에 데이터형이 일치하지 않아도 된다.

현재 데이터베이스의 USERID와 USERPW 컬럼은 문자형이며, USERTEL 컬럼은 숫자형으로 구성되어 있다. 따라서 SELECT문과 UNION SELECT문의 두 번째 컬럼인 USERPW와 USERTEL의 데이터형이 일치하지 않아 에러가 발생한다. 

따라서 UNION SQL Injection을 진행하기 위해서는 기존의 SELECT문에 대한 컬럼 수와 데이터형을 알아내는 과정이 필요하다.


 보안 대책

SQL Injection의 보안 대책은 크게 2가지가 있다.

- Prepared Statement[7] : 근본적인 해결책으로 많이 사용하지만, 문법적/비즈니스 로직 상 사용이 불가한 로직이 있으며 서버가 운영 중일 경우 소스코드 수정이 어려울 수 있다.

[7] Prepared Statement는 컴파일이 미리 되어있기 때문에 입력값을 변수로 선언해두고 필요에 따라 값을 대입하여 처리한다.

- Filtering : White List Filter 방식을 적용해 허용할 문자열을 지정하는 것이 좋다. 상황상 Black List Filter 방식을 적용해야 한다면, 공격 기법에 사용되는 예약어 및 특수 문자를 모두 Filtering 해야 한다.

※ 문자열 필터링 시 대소문자 모두 필터링하는 것이 좋다.

※ UNION SQL Injection의 경우 UNION, UNION ALL, ORDER BY, NULL 등의 문자에 대한 필터링이 필요하다.


 맺음말

지금까지 집합 연산자 UNION을 이용한 UNION SQL Injection의 공격 과정에 대해 알아봤다. UNION 연산자 사용 조건에 만족하기 위해 ORDER BY절과 NULL 문자를 사용해 기존의 SELECT문의 컬럼명과 데이터형을 추출했고 그 정보를 바탕으로 전체 테이블 목록, 테이블의 컬럼명을 조회하여 원하는 데이터를 탈취할 수 있다.

 이 콘텐츠의 저작권은 ㈜SK쉴더스에 있으며 영리적, 개인적 사용을 금합니다. COPYRIGHT ⓒ 2021 SK SHIELDUS. All Rights Reserved.   



  • 담당부서 : 사이버보안팀
  • 전화번호 : 02-6908-8235
  • 담당자 : 심재인

Q. 이 페이지에서 제공하는 정보에 대하여 어느 정도 만족하셨습니까?

평균 4.1점 / 27명 참여