본문 바로가기

DataBase

[DataBase] Sql Injection

SQL Injection

악의적인 사용자가 보안상의 취약점을 이용하여, 임의의 SQL문을 주입하고 실행되게하여 데이터베이스가 비정상적인 동작을 하도록 조작하는 행위입니다.

 

공격종류

 

Error based SQL Injection

 

논리적 에러를 이용한 SQL Injection
SELECT * FROM User WHERE id = 'INPUT1' AND password = 'INPUT2'
INPUT1 => ' OR 1=1 --
SELECT * FROM User WHERE id = '' OR 1=1
위의 형태와 같이 주석과 OR연산을 통하여 모든 아이디 비밀번호를 조회하여 악의적인 행동을 이어갑니다.

 

 

Union based SQL Injection

 

Union이라는 키워드를 이용한 SQL Injection
SELECT * FROM Board WHERE title LIKE '%INPUT%' OR contents '%INPUT%'
INPUT => ' UNION SELECT null, id, password FROM Users--
SELECT * FROM Board WHERE title LIKE '%' UNION SELECT null, id, password FROM Users

 

 

Blind SQL Injection (Boolean based SQL)

 

데이터 베이스로부터 특정한 값이나 데이터를 전달받지 않고, 단순히 참과 거짓의 정보만 알 수 있을 떄 사용합니다.
SELECT * FROM User WHERE id = 'INPUT1' AND password = 'INPUT2'
INPUT1 => abc123' AND ASCII(SUBSTR(SELECT name FROM information_schema.tables WHERE table_type='base table' limit 0, 1), 1, 1) > 100 --
SELECT * FROM User WHERE id = 'abc123' AND ASCII(SUBSTR(SELECT name FROM information_schema.tables WHERE table_type='base table' limit 0, 1), 1, 1) > 100
해당 구문은 limit 키워드를 통해 하나의 테이블만 조회하고, SUBSTR 함수로 첫글자만 뽑아내고, ASCII를 통해 ASCII값으로 변환합니다.

 

 

Blind SQL Injection (Time based SQL)

 

SELECT * FROM User WHERE id = 'INPUT1' AND password = 'INPUT2'
INPUT1 => abc123' OR (LENGTH(DATABASE())=1 AND SLEEP(2))
SELECT * FROM User WHERE id = 'abc123' OR (LENGTH(DATABASE())=1 AND SLEEP(2))
해당 구문은 현재 사용하고있는 데이터베이스의 길이를 알아내는 방법입니다. 1을 다른 숫자로 바꾸어 데이터 베이스의 길이를 알아낼 수 있습니다. 

 

 

대처방안

 

입력 값에 대한 검증

 

SQL Injection에서 사용되는 기법과 키워드는 엄청나게 많습니다. 
서버단에서 화이트리스트 기반으로 검증해야합니다. 
블랙리스트 기반으로 검증하게되면 하나라도 빠지게될 시 공격에 당하기 때문입니다. 

 

Prepared Statement

 

입력값이 데이터베이스의 파라미터로 들어가기 전에 DBMS가 미리 컴파일 하여 실행하지 않고 대기합니다. 
그 후 사용자의 입력값을 문자열로 인식하여 공격쿼리가 들어간다고 하더라도, 사용자의 입력은 이미 의미없는 단순 문자열이기 때문에 전체 쿼리문도 공격자의 의도대로 작동하지 않습니다.

 

Error Message 노출금지

 

공격자가 SQL Injection을 수행하기 위해서는 데이터베이스의 정보(테이블명, 컬럼명 등)가 필요합니다. 
데이터베이스 에러 발생 시 따로 처리를 해주지 않았다면, 에러가 발생한 쿼리문과 함께 에러에 관한 내용을 반환해 줍니다. 
여기서 테이블명 및 컬럼명 그리고 쿼리문이 노출이 될 수 있기 때문에, 데이터 베이스에 대한 오류발생 시 사용자에게 보여줄 수 있는 페이지를 제작 혹은 메시지박스를 띄우도록 하여야 합니다.

 

 

웹 방화벽 사용

 

웹 공격 방어에 특화되어있는 웹 방화벽을 사용하는 것도 하나의 방법입니다. 
웹 방화벽은 소프트웨어 형, 하드웨어 형, 프록시 형 이렇게 세가지 종류로 나눌 수 있습니다.
소프트웨어 형은 서버 내에 직접 설치하는 방법이고, 하드웨어 형은 네트워크 상에서 서버 앞 단에 직접 하드웨어 장비로 구성하는 것이며 프록시 형은 DNS 서버 주소를 웹 방화벽으로 바꾸고 서버로 가는 트래픽이 웹 방화벽을 먼저 거치도록 하는 방법입니다.

 

'DataBase' 카테고리의 다른 글

[DataBase] DBMS 기본 용어  (0) 2023.08.02
[DataBase] MySQL vs Oracle  (0) 2023.07.28
[DataBase] 사용자  (0) 2023.07.19
[DataBase] MySQL 시스템 변수  (0) 2023.07.18
[DataBase] Select 쿼리 실행순서  (0) 2023.07.06