개발공부

SQL Injection이란?

holimc 2023. 5. 31. 00:00

SQL Injection이란, 임의의 SQL문을 주입해 실행되게 함으로서 데이터베이스를 조작하거나 정보를 알아내는 행위를 뜻한다.

클라이언트의 입력값을 조작하여 서버의 데이터베이스를 공격하며, 사용자가 입력한 데이터를 필터링 없이 사용한 경우에 자주 발생한다. 

 

SELECT user FROM user_table WHERE id='holimc' AND password='비밀번호';

 

예를 들면 위와 같이 로그인을 위해 DB를 조회하는 SQL문이 있다고 치면

SELECT user FROM user_table WHERE id = 'holimc' AND password = ' ' OR '1' ='1';
SELECT user FROM user_table WHERE id = ' ' OR 1=1 --' AND password = '비밀번호'

 

 

 

 

논리 연산자를 통해 WHERE 절의 조건문을 강제로 참으로 만든다거나, 뒤의 조건을 주석처리로 없애는 방식으로 강제로 로그인을 할 수 있다. 

 

이 외에도 UNION을 이용해 다른테이블과 합쳐 아이디, 비밀번호 및 기타 개인정보를 빼오거나, Blind SQL Injection처럼 서버의 응답하는 시간 등을 이용해 데이터베이스의 테이블 명 등의 정보를 빼오는 방식도 존재한다.

 

이와 같은 SQL Injection을 방지하기 위한 방법으로는 여러가지가 존재한다.

 

1. 입력값 검증

replace, 혹은 정규식의 기능을 이용하여 특수문자나 SELECT, UPDATE 등의 SQL 구문들을 검증하고 걸러낸다.

자바스크립트에서 먼저 한번 걸러내고, java 코드에서 한번 더 걸러내고, 마지막으로 SQL 쿼리를 저장 프로시저를 통해 처리하는 식으로 여러번의 검증을 필요로 한다.

 

2. 오류메세지를 노출하지 않음

에러 페이지 등 오류 발생시 처리 방법을 정해두지 않는다면, 에러가 발생한 쿼리문과 함께 에러 내용을 반환할 수 있다. 즉 이를 통해서 테이블명, 컬럼명, 데이터를 처리하는 쿼리문 등이 노출될 수 있다. 그러므로 에러메시지가 노출되는것을 차단하여야 한다.

 

3. 서버 보안 유지

DB 계정의 권한을 세분화하여 DDL, DML 등을 목적에 맞게 사용하도록 권한을 나눈다거나 사용 가능 명령어 혹은 프로시저 또한 불필요하다면 삭제, 아니면 권한 제어를 통해 보안을 유지한다.

 

이외에도 웹 방화벽점검, 로그점검 등의 방식이 있다고 한다.