본문 바로가기

데이터베이스

SQL Injection

위키백과에 따르면, SQL Injection은 응용 프로그램 보안 상의 허점을 의도적으로 이용해, 악의적인 SQL문을 실행되게 함으로써 데이터베이스를 비정상적으로 조작하는 코드 인젝션 공격 방법을 말한다.예를들어  클라이언트에서 어떠한 문자열을 입력하고 그 문자열을 기반으로 데이터베이스에서 조회 SQL을 실행하는 경우, 문자열에 SQL 구문을 입력하므로써 기존 개발자가 의도한 동작과 다른 형태로 동작하도록 하는 것이다. SQL 인젝션에는 세가지 종류가 있다.

 

Error based SQL Injection

논리적 에러를 이용한 SQL Injection 으로 가장 대중적인 공격 기법이다. 입력값에대한 검증이 없다면 언제든지 발생할 수 있다.

 

 

Union based SQL Injection

Union 명령어를 이용한 SQL 인젝션. Union은 두개의 쿼리문에 대한 결과를 통합해서 하나의 테이블로 보여주게하는 키워드 이다. Error based SQL 처럼 입력값에 대한 검증이 없다면 언제든지 발생할 수 있다.

 

 

Blind SQL Injection

 

Blind SQL Injection은 데이터베이스로부터 특정한 값이나 데이터를 전달받지 않고, 단순히 참과 거짓의 정보만 알 수 있을 때 사용한다. 예를들어 테이블 명을 조회하는 구문을 주입하여 참인 경우 테이블 명을 유추하는 등의 경우이다.

 

 

대응방안

입력 값에 대한 검증

말 그대로 입력값에 SQL Injection 공격에 대한 입력이 있는지 먼저 검증하는 것이다.

 

Prepared Statement 구문사용

Prepared Statement는 이름 그대로 준비된 Statement 이다. 이 준비는 컴파일을 이야기 하며 미리 컴파일된 SQL문에 인자만 받아 실행시킨다. 즉, 사용자의 입력 값이 데이터베이스의 파라미터로 들어가기 전에, DBMS가 미리 SQL을 컴파일 하여 실행하지 않고 대기하고 있는 상태이다. 그 후 사용자의 입력 값 인자는 그냥 일반적인 문자열로 인식한다. 그러면 공격 쿼리가 들어간다고 하더라도, 사용자의 입력은 이미 의미 없는 단순 문자열이기 때문에 전체 쿼리문이 공격자의 의도대로 동작하지 않는다. 또 컴파일된 SQL을 캐시에 저장해 놓고 있기 때문에 반복되는 동일한 SQL문에 대해 성능상의 이점을 가진다. 

 

Error Message 노출 금지

공격자가 SQL Injection을 수행하기 위해서는 테이블 명, 컬럼 명등의 정보가 필요하다. 데이터베이스 에러 발생 시 이를 따로 처리해주지 않는다면 이 에러메세지가 클라이언트에 그대로 노출되고, 이를 통해 쉽게 데이터베이스의 정보나 쿼리문 등을 알아낼 수 있다. 때문에 Error메세지가 직접적으로 노출되지 않도록 꼭 핸들링 해주어야 한다.

 

이 밖에도 사용하지 않는 프로시저와 내장함수 제거, 방화벽 등의 방법이 있다.

 

참고:

https://noirstar.tistory.com/264

 

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

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

noirstar.tistory.com

 

 

 

 

 

 

 

 

'데이터베이스' 카테고리의 다른 글

Transaction  (4) 2022.03.18
정규화와 반정규화  (0) 2022.03.18
SQL vs NO SQL  (0) 2022.03.18
SQL JOIN에 대해(작성 중)  (0) 2022.03.16
관계형 데이터베이스의 키(Key)  (0) 2022.03.12