가. 취약점 개요
데이터베이스(DB)와 연동된 응용프로그램에서 입력된 데이터에 대한 유효성 검증을 하지 않을 경우, 공격자가 입력데이터에 SQL 질의문을 삽입하여 DB로부터 정보를 열람하거나 조작할 수 있는 보안 취약점을 말한다.
나. 설계시 고려사항
① 애플리케이션에서 DB연결을 수행할 때 최소권한의 계정을 사용해야 한다.
취약한 애플리케이션으로 인해 침해사고가 발생하더라도 나머지 부분에 대해 공격자가 액세스 권한을 가지지 않도록 애플리케이션에서 사용하는 DB연결 계정은 해당 애플리케이션이 사용하는 데이터에 대한 읽기, 쓰기, 삭제, 업데이트 권한만 설정한다.
② 외부 입력값이 삽입되는 SQL질의문을 동적으로 생성해서 실행하지 않도록 해야 한다. SQL 질의문의 구조가 외부 입력값에 의해 변경되지 않는 API를 사용하도록 시큐어코딩 규칙을 지정 한다. ORM프레임워크를 사용하여 안전한 정적쿼리구조로 SQL문을 수행할 수 있도록 개발환경을 설정하고, ORM프레임워크에서 제공하는 함수를 활용하여 외부 입력값에 의해 SQL 질의문의 구조가 변경되지 않도록 한다.
③ 외부 입력값을 이용해 동적으로 SQL질의문을 생성해야 하는 경우, 입력값에 대한 검증을 수행한 뒤 사용해야 한다.
클라이언트와 서버 양측에서 입력값에 대해 안전한 값만 사용될 수 있도록 검증작업을 수행한다.
(ㄱ) 필터를 이용한 입력값 검증 외부입력값에서 SQL삽입이 가능한 문자열들을 필터링하여 안전한 값으로 치환하도록 하는 Filter 컴포넌트를 생성하고, DB에서 관리하는 데이터를 처리하는 모든 애플리케이션에 일괄 적용한다.
(ㄴ) 인터셉트를 이용한 입력값 검증 MVC프레임워크를 사용하는 경우 Interceptor 컴포넌트를 사용하여 입력값에 대한 검증 작업을 수행한 뒤 요청을 차단하거나 허용하는 정책을 애플리케이션에 일괄 적용 한다.
(ㄷ) 라이브러리 또는 Validator 컴포넌트를 이용한 입력값 검증 입력값을 검증하는 Validator 컴포넌트를 공통코드로 생성하고, 모든 개발자가 SQL질의문에 삽입되는 입력값에 대해 검증작업을 해당 컴포넌트에서 수행하도록 시큐어코딩 규칙을 정의한다. SQL삽입 취약점을 최소화하기 위해 SQL문을 안전하게 처리할 수 있도록 [표 3-6]와 같은 프레임 워크나 라이브러리의 사용을 고려할 수 있다.
[테스트 문제]
문제: 애플리케이션에서 DB연결을 수행할 때 최대권한의 계정을 사용해야 한다.
정답: X
해설: 애플리케이션에서 DB연결을 수행할 때 최소권한의 계정을 사용해야 한다.
문제: 보안대책을 서술하시오.
정답:
① 최소한의 계정 권한
② 쿼리를 동적으로 실행 X
③ Preparestatement 적용, 입력값 검증 수행
문제: 빈칸을 채우시오.
① 애플리케이션에서 DB연결을 수행할 때 (ㄱ)을 사용해야 한다.
취약한 애플리케이션으로 인해 침해사고가 발생하더라도 나머지 부분에 대해 공격자가 액세스 권한을 가지지 않도록 애플리케이션에서 사용하는 DB연결 계정은 해당 애플리케이션이 사용하는 데이터에 대한 읽기, 쓰기, 삭제, 업데이트 권한만 설정한다.
② 외부 입력값이 삽입되는 SQL질의문을 (ㄴ)를 생성해서 실행하지 않도록 해야 한다. SQL 질의문의 구조가 외부 입력값에 의해 변경되지 않는 API를 사용하도록 시큐어코딩 규칙을 지정 한다. (ㄷ)를 사용하여 안전한 정적쿼리구조로 SQL문을 수행할 수 있도록 개발환경을 설정하고, (ㄷ) 에서 제공하는 함수를 활용하여 외부 입력값에 의해 SQL 질의문의 구조가 변경되지 않도록 한다.
③ 외부 입력값을 이용해 동적으로 SQL질의문을 생성해야 하는 경우, (ㄹ)을 수행한 뒤 사용해야 한다.
클라이언트와 서버 양측에서 입력값에 대해 안전한 값만 사용될 수 있도록 검증작업을 수행한다.
3-1. 필터를 이용한 입력값 검증 외부입력값에서 SQL삽입이 가능한 문자열들을 필터링하여 안전한 값으로 치환하도록 하는 (ㅁ)를 생성하고, DB에서 관리하는 데이터를 처리하는 모든 애플리케이션에 일괄 적용한다.
3-2. 인터셉트를 이용한 입력값 검증 (ㅂ)를 사용하는 경우 (ㅅ)를 사용하여 입력값에 대한 검증 작업을 수행한 뒤 요청을 차단하거나 허용하는 정책을 애플리케이션에 일괄 적용 한다.
3-3. 라이브러리 또는 (ㅇ)를 이용한 입력값 검증 입력값을 검증하는 (ㅇ)를 공통코드로 생성하고, 모든 개발자가 SQL질의문에 삽입되는 입력값에 대해 검증작업을 해당 컴포넌트에서 수행하도록 시큐어코딩 규칙을 정의한다. SQL삽입 취약점을 최소화하기 위해 SQL문을 안전하게 처리할 수 있도록 [표 3-6]와 같은 프레임 워크나 라이브러리의 사용을 고려할 수 있다.
정답
ㄱ: 최소권한의 계정
ㄴ: 동적 쿼리
ㄷ: ORM 프레임워크
ㄹ: 입력값에 대한 검증
ㅁ: Filter 컴포넌트
ㅂ: MVC 프레임워크
ㅅ: Interceptor 컴포넌트
ㅇ: Validator 컴포넌트