사이버안전센터 운영

[Special Report] 웹 취약점과 해킹 매커니즘 #4 Error Based SQL Injection
제목 [Special Report] 웹 취약점과 해킹 매커니즘 #4 Error Based SQL Injection
작성자 사이버보안팀 등록일 2022-08-12 조회수 1191
내용


 개요

SQL Injection은 사용자 입력값을 검증하지 않는 경우 설계된 쿼리문에 의도하지 않은 쿼리를 임의로 삽입할 수 있는 공격이다. 공격자는 쿼리를 악의적으로 주입하여 데이터베이스의 데이터를 무단으로 탈취할 수 있다. 

이번 Special Report에서는 Error Based SQL Injection의 개념을 설명하고 실습을 진행한다. SQL Injection 취약점이 존재하는 로그인 페이지에서 특정 에러를 유발하고 에러메시지로부터 데이터를 추출하는 내용을 다룬다.

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

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

 Error Based SQL Injection

특정 함수를 이용한 에러 발생 시 데이터베이스의 정보가 노출된다는 점을 악용하여 공격자가 원하는 데이터를 추출하는 공격 방법이다. 아래의 그림은 SQL구문 에러 발생 시 출력되는 화면으로, 반환되는 에러 메시지를 통해 해당 페이지가 사용하고 있는 데이터베이스에 대한 정보를 확인할 수 있다. 

특히 CTXSYS.DRITHSX.SN와 같이 Error Based SQL Injection에 취약한 함수 사용이 가능할 경우 공격자는 에러 메시지로부터 데이터베이스의 정보를 탈취할 수 있다.

[에러 메시지 창]


 공격 진행 과정

Error Based SQL Injection의 공격 진행 과정은 다음과 같다.

 

[Error Based SQL Injection 진행 과정]



Step 1. 취약점 존재 여부 확인

사용자 입력 값을 받아 로그인 하는 페이지에서 SQL Injection 취약점 존재 여부를 확인한다. SQL구문에서 문법적 요소로 작용하는 싱글쿼터(') 등과 같은 특수문자를 입력하여 로그인 했을 때 서버의 반응을 보고 취약점 존재 여부를 판단할 수 있다. 

Step 2. Error Based SQL Injection

SQL구문 에러를 발생 시 반환되는 정보를 통해 데이터베이스의 테이블/컬럼/데이터의 개수와 이름을 확인하는 과정을 반복하여 원하는 데이터를 추출할 수 있다.



2-1) 테이블 정보 확인

원하는 데이터를 추출하기 위해 전체 테이블의 개수를 확인해야 한다. 실습에서는 user_tables를 통해 사용자가 생성한 전체 테이블 수를 확인한다.



테이블의 개수를 확인한 후 원하는 테이블을 찾을 때까지 행 번호를 증가시켜가며 테이블 이름을 추출한다.


2-2) 컬럼 정보 확인

원하는 테이블의 컬럼 정보를 확인하기 위해 앞서 획득한 'MEMBER' 테이블의 전체 컬럼 수를 추출한다.


전체 컬럼 수 확인 후 원하는 컬럼을 찾을 때까지 행 번호를 증가시켜가며 컬럼 명을 확인한다.


Step 3. 원하는 데이터 탈취

이처럼 SQL에 관련된 에러 처리가 미흡할 경우 전체 테이블/컬럼/데이터의 개수를 확인하여 원하는 데이터를 1개씩 추출하여 데이터베이스의 모든 데이터 추출이 가능하다.


 보안 대책

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

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

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

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

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

※ Error Based SQL Injection의 경우 공격자에게 정보를 제공할 수 있는 에러 메시지가 아닌 사전에 정의된 에러 페이지를 반환하도록 대체해야 하며, 개발자의 디버깅용 에러 메시지 창은 실제 소스코드에서 제거하여 시스템 내부 정보가 노출되지 않도록 유의해야 한다.

보안 대책에 대한 우회기법 및 시큐어코딩 적용 등에 대한 자세한 내용은 SQL Injection 마지막 챕터에서 이어진다.

 맺음말

지금까지 Error Based SQL Injection에 대해 알아보았다. SQL구문 에러 유발 후 반환되는 에러 메시지를 통해 테이블/컬럼/데이터를 1개씩 추출하는 것을 반복하여 전체 데이터를 추출할 수 있는 공격이다. SQL Injection 취약점을 제거하는 것이 우선이며, 사전에 정의된 에러 페이지 창으로 대체하여 정보를 획득할 수 있는 에러 메시지가 반환되지 않도록 하는 것이 중요하다.



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



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

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

평균 4.3점 / 39명 참여