본문 바로가기
Cert/소프트웨어(SW) 보안약점 진단원

설계단계 보안설계 기준 - DBMS 조회 및 결과 검증

by 브루노W 2024. 8. 20.
유형 입력데이터 검증 및 표현
설계항목 DBMS 조회 및 결과 검증
설명 DBMS 조회시 질의문(SQL) 내 입력값과 그 조회결과에 대한 유효성 검증방법(필터링 등) 설계 및 유효하지 않은 값에 대한 처리방법을 설계해야 한다.
보안대책 ① 애플리케이션에서 DB연결을 수행할 때 최소권한의 계정을 사용해야 한다.
② 외부입력값이 삽입되는 SQL 질의문을 동적으로 생성해서 실행하지 않도록 해야 한다.
③ 외부입력값을 이용해 동적으로 SQL 질의문을 생성해야 하는 경우, 입력값에 대한 검증을 수행 한 뒤 사용해야 한다.
연관된 구현단계 기준 SQL 삽입

 

취약점 개요

 

데이터베이스(DB)와 연동된 응용프로그램에서 입력된 데이터에 대한 유효성 검증을 하지 않을 경우, 공격자가 입력데이터에 SQL 질의문을 삽입하여 DB로부터 정보를 열람하거나 조작할 수 있다.

 

 

 

설계 시 고려사항

 

① 애플리케이션에서 DB연결을 수행할 때 최소권한의 계정을 사용해야 한다.

애플리케이션에서 사용하는 DB연결 계정은 해당 애플리케이션이 사용하는 데이터에 대한 읽기, 쓰기, 삭제, 변경 권한만 설정한다.


② 외부입력값이 삽입되는 SQL 질의문을 동적으로 생성해서 실행하지 않도록 해야 한다.

SQL 질의문의 구조가 외부 입력값에 의해 변경되지 않는 API를 사용한다.

ORM(Object-Relational-Mapping) 프레임워크를 사용하여 안전한 정적쿼리 구조로 SQL문을 수행할 수 있도록 개발환경을 설정한다.


③ 외부입력값을 이용해 동적으로 SQL 질의문을 생성해야 하는 경우, 입력값에 대한 검증을 수행한 뒤 사용해야 한다.

클라이언트와 서버 양측에서 입력값에 대해 안전한 값만 사용될 수 있도록 검증작업을 수행한다.

 

(ㄱ) 필터를 이용한 입력값 검증

외부 입력값에서 SQL 삽입이 가능한 문자열을 필터링하여 안전한 값으로 치환하도록 하는 Filter 컴포넌트를 생성하여 일괄 적용한다.

 

(ㄴ) 인터셉트를 이용한 입력값 검증

MVC 프레임워크를 사용하는 경우 Interceptor 컴포넌트를 사용하여 입력값에 대한 검증 작업을 수행한 뒤 차단/허용 정책을 일괄 적용한다.

 

(ㄷ) 라이브러리 또는 Validator 컴포넌트를 이용한 입력값 검증

입력값을 검증하는 Validator 컴포넌트를 공통코드로 생성하고, SQL 질의문에 삽입되는 입력값에 대해 검증작업을 해당 컴포넌트에서 수행한다.

 

※ SQL 삽입 취약점 대응 프레임워크 및 라이브러리

Java : Hibernate, MyBatis, JPA(Java Persistence API)

ASP.NET : AntiSQLi 라이브러리

PHP : MeekroDB 라이브러리, HTML Purifier 라이브러리

 

 

진단 세부사항

 

요구사항 ① 애플리케이션에서 DB연결을 수행할 때 최소권한의 계정을 사용해야 한다.

- 애플리케이션별 DB접속 계정이 할당되고 각 계정의 권한이 최소권한으로 설정되어 있는지 확인

- 설정된 사용자 권한 외의 요청에 대해 차단되는지에 대한 테스트 계획이 수립되어 있는지 확인

 

요구사항 ② 외부입력값이 삽입되는 SQL 질의문을 동적으로 생성해서 실행하지 않도록 해야 한다.

- DB 데이터 처리기능 구현시, 외부 입력값이 쿼리의 구조에 영향을 미치지 않도록 보안설계가 적용되어 있는지 확인

 . 안전한 쿼리 실행환경을 제공할 수 있는 ORM 프레임쿼크와 같은 프레임워크 사용여부 확인

 . iBatis, myBatis 사용 시 #{변수} 사용 정의 혹은 PreparedStatement와 같은 정적쿼리 수행하는 API 사용하는지 확인

- 입력값이 DB 쿼리의 구조를 변경시키는지 점검하기 위한 테스트 계획이 수립되어 있는지 확인

 

요구사항 ③ 외부입력값을 이용해 동적으로 SQL 질의문을 생성해야 하는 경우, 입력값에 대한 검증을 수행 한 뒤 사용해야 한다.

- 외부 입력값을 이용한 동적 쿼리를 수행하는 기능 구현 시, 입력값 필터링하는 기능이 구현되어 있는지 확인

- 입력값이 DB 쿼리의 구조를 변경시키는지 점검하기 위한 테스트 계획이 수립되어 있는지 확인

 . 쿼리문 구조를 변경할 수 있는 입력값이 쿼리 구조 변경에 영향을 주는지 점검

    특수문자 : ‘ , “ , = , & , | , ! , ( , ) , { , } , $ , % , @ 등
    예약어 : UNION, SELECT, THEN, IF, INSTANCE, END, COLUMN 등
    함수 명 : DATABASE(), CONCAT(), COUNT(), LOWER() 등