본문 바로가기
공부/KISA

SQL 삽입 - KISA 소프트웨어 개발 보안 가이드

by Skogkatt의 개인 블로그 2020. 7. 17.
반응형

https://www.kisa.or.kr/public/laws/laws3.jsp

 

기술안내서 가이드 < 관련법령·기술안내서 < 자료실 : 한국인터넷진흥원

기술안내서 가이드 한국인터넷진흥원 기술안내서 가이드 입니다. 게시판 목록 보기 기술안내서 가이드 표 대분류 소분류 기술안내서 가이드 대상 수준 인터넷 진흥 및 이용 활성화 인터넷 진흥

www.kisa.or.kr


구현 단계 시큐어코딩 가이드 - 입력 데이터 검증 및 표현 - SQL 삽입

가. 개요

  • 데이터베이스(DB)와 연동된 웹 응용프로그램에서 입력된 데이터에 대한 유효성 검증을 하지 않을 경우, 공격자가 입력 폼 및 URL 입력란에 SQL 문을 삽입하여 DB로부터 정보를 열람하거나 조작할 수 있는 보안약점을 말한다.
  • 취약한 웹 응용프로그램에서는 사용자로부터 입력된 값을 필터링 과정 없이 넘겨받아 동적 쿼리(Dynamic Query)[각주:1]를 생성하기 때문에 개발자가 의도하지 않은 쿼리가 생성되어 정보유출에 악용될 수 있다.

나. 보안대책

  • PreparedStatement[각주:2] 객체 등을 이용하여 DB에 컴파일된 쿼리문(상수)을 전달하는 방법을 사용한다.
  • PreparedStatement를 사용하는 경우에는 DB 쿼리에 사용되는 외부 입력값에 대하여 특수 문자 및 쿼리 예약어를 필터링하고, 스트러츠(Struts), 스프링(Spring) 등과 같은 프레임워크를 사용하는 경우에는 외부 입력값 검증 모듈 및 보안모듈을 상황에 맞추어 적절하게 사용한다

다. 코드예제

JDBC API
더보기

다음은 안전하지 않은 코드의 예로, 외부로부터 입력받은 gubun의 값을 아무런 검증과정을 거치지 않고 SQL 쿼리를 생성하는 데 사용하고 있다. 이 경우 gubun의 값으로 a' or 'a' = 'a를 입력하면 조건절이 b_gubun = 'a' or 'a' = 'a'로 바뀌어 쿼리의 구조가 변경되어 board 테이블의 모든 내용이 조회된다.

이를 안전한 코드로 변환하면 다음과 같다. 파라미터(Parameter)를 받는 PreparedStatement 객체를 상수 스트링으로 생성하고, 파라미터 부분을 setString, setParameter 등의 메소드로 설정하여, 외부의 입력이 쿼리 문의 구조를 바꾸는 것을 방지해야 한다.

 

MyBatis
더보기

MyBatis Data Map은 외부에서 입력되는 값이 SQL 질의문을 연결하는 문자열로 사용되는 경우에 의도하지 않은 정보가 노출될 수 있는 공격 형태이다.

외부 입력값을 MyBatis 쿼리 맵에 바인딩할 경우 dollar 기호가 아닌 # 기호를 사용해야 한다. dollar 기호를 사용하는 경우 입력값을 문자열에 결합하는 형

태로 쿼리에 반영하므로 쿼리문이 조작될 수 있다.

 

Hibernate
더보기

Hibernate의 경우 기본으로 PreparedStatement를 사용하지만, 아래 코드와 같이 파라미터 바인딩 (binding) 없이 사용할 경우 외부로부터 입력받은 값에 의해 쿼리의 구조가 변경될 수 있다.

아래 코드와 같이 외부 입력값이 위치하는 부분을? 또는 :명명된 파라미터 변수로 설정하고, 실행 시에 해당 파라미터가 전달되는 바인딩(binding)을 함으로써 외부의 입력이 쿼리의 구조를 변경시키는 것을 방지할 수 있다.

 

C#
더보기

다음 C# 코드는 외부 입력값을 SQL 쿼리에 직접 사용하고 있어, 쿼리의 구조가 변경될 위험이 있다.

파라미터 바인딩을 사용하여 쿼리의 구조가 변경될 위험을 제거해야 한다.


참고자료

  1. ) 동적 쿼리(Dynamic Query) : DB에서 실시간으로 받는 쿼리. Parameterized Statement가 동적 쿼리가 됨 [본문으로]
  2. PreparedStatement : 컴파일된 쿼리 객체로 MySQL, Oracle, DB2, SQL Server 등에서 지원하며, Java의 JDBC, Perl의 DBI, PHP의 PDO, ASP의 ADO를 이용하여 사용 가능 [본문으로]
반응형

댓글