본문 바로가기

Programming/DataBase

<SQL>SQL 인젝션 방어하는 방법중 하나

728x90
반응형


SQL Injection(SQL 삽입 공격)을 방어하는 방법에 대해 알아봅시다!



1. SQL Injection이란?


 Web Hacking 기법중 하나이며, 웹 애플리케이션의 Database에 질의(쿼리를 보냄)하는 과정 사이에 일반적인 값이 아닌 악의적인 의도를 갖는 구문을 삽입하여, 공격자가 원하는 SQL 쿼리문을 작동하게 하는 방법입니다.


주로 클라이언트가 입력한 데이터를 서버에서 필터링, 이스케이핑을 하지 못하였을 경우에 발생합니다.


이러한 문제 때문에 대부분의 데이터베이스 엔진은 의도치않은 입력을 방지하기 위하여 escape함수와 prepared statement를 제공합니다.


SQL Injection 공격의 종류에는 크게 세 가지가 있습니다.

1) 인증 우회 (AB : Auth Bypass)

2) 데이터 노출 (DD : Data Disclosure)

3) 원격명령 실행 (RCE : Remote Command Excute)




  1) 인증 우회


 로그인 페이지를 타겟으로 하는 공격으로, SQL 쿼리문의 true/false 논리적 연산 오류를 이용하여 로그인 인증 쿼리문이 무조건 true의 결과값이 나오게 하여 인증을 무력화 시키는 것입니다.

  ex) ID또는 password 에

       ' or 1=1--

       ' or 1=1# (mysql 인 경우)

       ' or 'pass'='pass'--

       ' or 'ab' = 'a'+'b'--

       ' or 2>1-- 등등...

       


  2) 데이터 노출


타겟 시스템의 주요 데이터 절취를 목적으로 하는 방식입니다.

 GET방식으로 동작하는 URL에 추가적인 쿼리를 추가하여 에러를 발생시킬 수

있습니다.

 이에 해당하는 오류가 발생한다면 그 것을 가지고 DB구조를 유추할 수 있으므로, 오류 페이지 또는 오류 메시지가 노출되어서는 안됩니다.




2. 방어 방법


  1) 서버단에서 입력받은 값이 원하는 데이터인지 체크합니다.(화이트리스트 체크)

 블랙리스트방식(특수문자인지, 불필요한 문자 체크)이 아닌 이트리스트(영어,숫자인지 체크)를 권장합니다.

 그 이유는 블랙리스트 방식으로는 체크할 것이 무궁무진하게 많이 때문에 입력받은 값이 자신이 생각한 데이터가 맞는지 체크하는 방식이 효율적입니다.


   2) SQL오류가 발생하였을 시 해당 에러메세지를 표시하지 않습니다.

에러페이지를 이용하여 에러메세지를 보이지 않게 합니다. 그리고 실제 테이블이 아닌 View를 이용해 테이블 전체의 데이터를 갖고오지 않게 합니다.


   3) Statement대신 preparestatement를 사용합니다.

mysql의 preparedstatement 구문을 사용하게 되면 특수문자를 자동으로 escaping 해줍니다.


   4) javascript에서만 검증하지 않습니다

Javascript는 공격자가 브라우저에서 임의로 끌 수 있기 때문에 반드시 서버에서 한번 더

체크합니다.


   5) hash function(암호화)를 사용합니다.

사용자의 입력값을 데이터베이스에 그대로 저장하는것이 아닌, 해시함수로 해싱한 후에 저장합니다.


   6) mybatis에서 $를 사용하지 않고 #을 사용합니다

$를 사용하게 되면 텍스트로 읽히지 않아 SQL Injection에 취약합니다. 하지만 #을 사용하게 된다면 텍스트로 읽혀 SQL Injection을 방어할 수 있습니다. 또한 CONCAT을 사용하여 쿼리문을 작성합니다.



반응형