본문 바로가기

Programming/JAVA

[Java Secure coding] 자바 시큐어코딩 기법 (2) - SQL Injection

SQL Injection

- SQL 삽입 공격

- 보안상 취약점을 이용해 악의적으로 임의의 SQL문을 삽입해 DB가 비정상적인 동작을 하도록 하는 것

- SQL 인젝션 공격에 의해 DB가 노출된 사례가 존재함

- 사용자 입력 값에 필터링이 제대로 적용되어 있지 않은 취약점을 악용한 공격기법임

 

입력 데이터 검증 및 표현

- 공격자가 쿼리를 조작할 수 있는 문자열을 입력해 인가되지 않은 사용자가 DB 데이터를 무단으로 조회 또는 삭제할 수 있음

- preparedStatement가 아닌 statement로 쿼리에 아래와 같이 입력되어 있는 경우

 

"SELECT * FROM USER WHERE id = '" + userVO.getUserId( ) + "' and pw = '" + userVO.getUserPw( )" + "'"

--> 위와 같이 DB와 통신하는 경우 공격자가 아이디 뿐만 아닌 [ a' or 'a' = 'a ]를 넣어 쿼리를 조작할 수 있음

 

문제점

(1) 비인증 로그인 발생

(2) 운영체제 명령어 수행

(3) DB 정보 불법 열람/추가/삭제/수정 발생

공격 방법

(1) HTML Form에 SQL 삽입을 통한 공격

(2) Error Message 분석

(3) Union All SQL 구문 삽입 공격

(4) Stored Procedure로 삽입 공격

(5) Blind SQL 삽입 공격

 

공격 방법 추가 참고 링크. https://noirstar.tistory.com/264

 

SQL Injection 이란? (SQL 삽입 공격)

1. SQL Injection  1.1 개요 Ÿ   SQL Injection SQL Injection 이란 악의적인 사용자가 보안상의 취약점을 이용하여, 임의의 SQL 문을 주입하고 실행되게 하여 데이터베이스가 비정상적인 동작을 하도록 조작

noirstar.tistory.com

 

시큐어코딩(Secure Coding) 기법

(1) 애플리케이션 실행 관련된 사용자에게 최소한의 권한만 부여

--> 예외되는 것들을 막기 보다 허용되는 것들만 통과시키는 것이 경우의 수를 줄일 수 있음

 

(2) SQL 문이 외부입력 값과 관련될 때, 동적으로 생성되는 메커니즘에 문제가 없는지 점검 (위에 명시된 예시)

--> PreparedStatement 사용. 입력 값이 파라미터로 쿼리에 반영되기 전 DBMS는 미리 컴파일하여 대기하기에 입력된 값들이 무조건 문자열로 인식됨

 

--> Batis에서의 특징을 잘 기억할 것.

 

 

  • MyBatais 쿼리문 매개변수 전달
     
    • ${ }
      • 매개변수 값을 문자열 연결 방식으로 치환
      • 쿼리문 구조가 변경될 가능성이 있음

    • #{ }
      • JDBC의 PreparedStatement를 사용할 수 있음
      • 쿼리문 구조가 변경되지 않아 SQL 인젝션 예방 가능

(3) 외부 입력 값으로 쿼리문이 생성될 때, 입력 값을 검증한 후 생성

--> 아래 내용 참고

 

입력 데이터 검증 및 표현

 

(1) Filter로 검증

 

(2) Interceptor로 필터링

 

 

  • 위와 같이 Interceptor로 필터링이 가능함

  • servlet-context.xml에 인터셉터를 등록해 요청 URL에 따른 입력 데이터 검증 및 표현 필터링 가능

 

(3) 라이브러리나 Validator로 검증

 

  • Filter : 입력 값에 대해 SQL 필터를 적용해 안전한 값만 전달

  • Interceptor : 입력 값 검증을 통해 안전하지 않은 값은 요청 차단

  • Controller (Validation) : 라이브러리 또는 Validator 컴포넌트를 이용해 입력 값 검증

 

Controller에서도 검증이 가능하나, 각 객체의 역할 일관성을 가져가 용이한 유지보수를 위해 Filter, Interceptor에서 진행하는 것권장

Filter VS Interceptor
- Filter : 유저 요청 발생시 맨 앞단에서 Filter
- Interceptor : Controller 앞단에서 진입 제어