제목 | [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의 공격 진행 과정은 다음과 같다.
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. |
이전 글 | 끊임없는 스팸문자, 차단부터 신고, 예방까지! 스팸문자 근절 팁 정리 |
다음 글 | 딥페이크 기술을 악용한 보안 위협 증가 |
Q. 이 페이지에서 제공하는 정보에 대하여 어느 정도 만족하셨습니까?
평균 4.3점 / 39명 참여