https://www.kisa.or.kr/public/laws/laws3.jsp
기술안내서 가이드 < 관련법령·기술안내서 < 자료실 : 한국인터넷진흥원
기술안내서 가이드 한국인터넷진흥원 기술안내서 가이드 입니다. 게시판 목록 보기 기술안내서 가이드 표 대분류 소분류 기술안내서 가이드 대상 수준 인터넷 진흥 및 이용 활성화 인터넷 진흥
www.kisa.or.kr
구현 단계 시큐어코딩 가이드 - 입력 데이터 검증 및 표현 - SQL 삽입
가. 개요
- 데이터베이스(DB)와 연동된 웹 응용프로그램에서 입력된 데이터에 대한 유효성 검증을 하지 않을 경우, 공격자가 입력 폼 및 URL 입력란에 SQL 문을 삽입하여 DB로부터 정보를 열람하거나 조작할 수 있는 보안약점을 말한다.
- 취약한 웹 응용프로그램에서는 사용자로부터 입력된 값을 필터링 과정 없이 넘겨받아 동적 쿼리(Dynamic Query)를 생성하기 때문에 개발자가 의도하지 않은 쿼리가 생성되어 정보유출에 악용될 수 있다. 1
나. 보안대책
- PreparedStatement 객체 등을 이용하여 DB에 컴파일된 쿼리문(상수)을 전달하는 방법을 사용한다. 2
- PreparedStatement를 사용하는 경우에는 DB 쿼리에 사용되는 외부 입력값에 대하여 특수 문자 및 쿼리 예약어를 필터링하고, 스트러츠(Struts), 스프링(Spring) 등과 같은 프레임워크를 사용하는 경우에는 외부 입력값 검증 모듈 및 보안모듈을 상황에 맞추어 적절하게 사용한다
다. 코드예제
JDBC API
다음은 안전하지 않은 코드의 예로, 외부로부터 입력받은 gubun의 값을 아무런 검증과정을 거치지 않고 SQL 쿼리를 생성하는 데 사용하고 있다. 이 경우 gubun의 값으로 a' or 'a' = 'a를 입력하면 조건절이 b_gubun = 'a' or 'a' = 'a'로 바뀌어 쿼리의 구조가 변경되어 board 테이블의 모든 내용이 조회된다.
![](https://blog.kakaocdn.net/dn/zFjHe/btqFNaQDODO/PkSXuhHJQbmByT8oB9Euu0/img.png)
이를 안전한 코드로 변환하면 다음과 같다. 파라미터(Parameter)를 받는 PreparedStatement 객체를 상수 스트링으로 생성하고, 파라미터 부분을 setString, setParameter 등의 메소드로 설정하여, 외부의 입력이 쿼리 문의 구조를 바꾸는 것을 방지해야 한다.
![](https://blog.kakaocdn.net/dn/5Y94X/btqFMIfIhFn/DXSpqCldKtZL1mlPKPbvj1/img.png)
MyBatis
MyBatis Data Map은 외부에서 입력되는 값이 SQL 질의문을 연결하는 문자열로 사용되는 경우에 의도하지 않은 정보가 노출될 수 있는 공격 형태이다.
![](https://blog.kakaocdn.net/dn/HUBva/btqFNPdIOkg/pkAkNmDaqsPY0FW6TYuk80/img.png)
외부 입력값을 MyBatis 쿼리 맵에 바인딩할 경우 dollar 기호가 아닌 # 기호를 사용해야 한다. dollar 기호를 사용하는 경우 입력값을 문자열에 결합하는 형
![](https://blog.kakaocdn.net/dn/bnxQpK/btqFN3ivyZc/MO0vhzqkmDVto17nkssK2K/img.png)
태로 쿼리에 반영하므로 쿼리문이 조작될 수 있다.
Hibernate
Hibernate의 경우 기본으로 PreparedStatement를 사용하지만, 아래 코드와 같이 파라미터 바인딩 (binding) 없이 사용할 경우 외부로부터 입력받은 값에 의해 쿼리의 구조가 변경될 수 있다.
![](https://blog.kakaocdn.net/dn/bLjYiv/btqFNDR5CqJ/RxqsU5eb1TzJmMEhGOFJ8K/img.png)
아래 코드와 같이 외부 입력값이 위치하는 부분을? 또는 :명명된 파라미터 변수로 설정하고, 실행 시에 해당 파라미터가 전달되는 바인딩(binding)을 함으로써 외부의 입력이 쿼리의 구조를 변경시키는 것을 방지할 수 있다.
![](https://blog.kakaocdn.net/dn/nIEnD/btqFNrYGhOF/CCTpMhXjK75Wkgm9v8Spx0/img.png)
![](https://blog.kakaocdn.net/dn/bGvwIh/btqFOMHk7Tj/RG5PDHRKgq8BD2HiOvwlB0/img.png)
C#
다음 C# 코드는 외부 입력값을 SQL 쿼리에 직접 사용하고 있어, 쿼리의 구조가 변경될 위험이 있다.
![](https://blog.kakaocdn.net/dn/qG8ML/btqFOhni5Cu/qim6I3uLaIsuXXaw3KZd0k/img.png)
파라미터 바인딩을 사용하여 쿼리의 구조가 변경될 위험을 제거해야 한다.
![](https://blog.kakaocdn.net/dn/pY9pV/btqFONfbGLE/Xa1pgXomuUjOOKpkq8LDtK/img.png)
참고자료
- CWE-89 SQL Injection, MITRE,
http://cwe.mitre.org/data/definitions/89.html - Threat and Vulnerability, "SQL Injection", Microsoft,
http://technet.microsoft.com/en-us/library/ms161953%28v=SQL.105%29.aspx - Input validation and Data Sanitization, Threat and Vulnerability, Prevent SQL Injection, CERT,
http://www.securecoding.cert.org/confluence/display/java/IDS00-J.+Prevent+SQL+injection - SQL Injection Prevention Cheat Sheet, OWASP
https://www.owasp.org/index.php/SQL_Injection_Prevention_Cheat_Sheet
'공부 > KISA' 카테고리의 다른 글
크로스사이트 스크립트 - KISA 소프트웨어 개발 보안 가이드 (0) | 2020.07.18 |
---|---|
경로 조작 및 자원 삽입 - KISA 소프트웨어 개발 보안 가이드 (0) | 2020.07.18 |
세션통제 - KISA 소프트웨어 개발 보안 가이드 (0) | 2020.07.17 |
예외처리 - KISA 소프트웨어 개발 보안 가이드 (0) | 2020.07.17 |
중요정보 전송 - KISA 소프트웨어 개발 보안 가이드 (0) | 2020.07.17 |
댓글