본문 바로가기

CS/Database

[DB] SQL Injection 이란?

 

SQL Injection 이란 해커에 의해 조작된 쿼리문이  데이터베이스에 전달되어 비정상적인 명령을 실행시키는 공격 방법입니다. 

 

여기서 조작된 쿼리문이란 유저가 입력하는 파라미터에 정상적인 값이 아니라 'or 1=1 , where 1=1 과 같이 무조건 실행 될 수 있도록 조건과 해커가 원하는 쿼리문을 같이 입력한 쿼리문을 의미합니다.

 

예시1)
SELECT * FROM user WHERE id='abc' AND password = '1234';
id에 SQL INJECTION

abc -> ' or 1=1 -- 


결과 : SELECT * FROM user WHERE id='' OR 1=1 -- AND password = '1234'
-> select * from user 가 됨

 

예시2)
INSERT INTO Students (이름) VALUES ('학생 이름');
학생 이름 -> 'Robert'); DROP TABLE Students;--
INSERT INTO Students (이름) VALUES ('Robert'); DROP TABLE Students; --');
결국 Students 테이블에 모든 데이터 다 날아감

 

대응방안

1. 입력 값에 대한 검증


-> 입력 값에 대해서 특수문자 필터링 및 검증 필요
화이트리스트 : 제일 안전하지만 사용자 입력 값이 제한되는 부분 존재.

id, password 같은 부분은 화이트리스트로 관리하는 것이 어렵다.

블랙리스트 : ' , -- , = ,DROP ,WHERE 와 같이 특수문자나 DB에 영향 갈 수 있는 부분에 대해서 블랙리스트로 관리할 수 있음. 다만 이 경우 하나라도 뚫리면 취약해지기 때문에 관리가 힘들다.  소극적인 방법이라고 볼 수 있음.


2. Prepared Statement 구문사용


Statement란 실제 DB에 쿼리가 전달되어 분석,수행,결과까지 이루어지는 것을 의미합니다. 


Statement라고 SQL문을 실행할 때 사용하는 인터페이스가 존재
Statement는 4가지 동작방식
1.parse
2.bind
3.execute
4.patch

 

Prepared Statement는 1번 parse 과정을 캐싱을 해서 2,3,4만 실행할 수 있게 하는 것.

 

SQL Injection 관점에서 Prepared Statement를 사용한다는 것은 아래와 같은 의미.


Satement 사용시 아래와 쿼리 같음

String sql = "SELECT * FROM user WHERE id ="+id+" AND password="+password;

Prepared Statement 사용시 아래와 쿼리 같음 

SELECT * FROM user WHERE id = ? AND password = ?;

Prepared Statment 사용시 ?에 해당하는 파라미터값 이스케이핑 처리하여 문자열로 바꾸어
대입. 이스케이핑 처리하는 과정을 통해 SQL Inejection을 막을 수가 있다.


3. 에러 메시지 노출 금지

-> 데이버 베이스 관련 에러 발생시 해당 메시지를 사용자에게 노출 금지X

노출 하는 경우에 해커가 데이터베이스의 구조에 대해서 파악이 가능해지기 때문. 


-> 에러 발생시 별도 에러 페이지 구성 필요

'CS > Database' 카테고리의 다른 글

[DB] JDBC란?  (0) 2024.01.08
[DB] Statement 란? Prepared Statement 란?  (0) 2024.01.05