SQL Injection 은 웹에서 DB에 접근하는 쿼리 자체에 공격을 가하는 것으로 해커들이 많이 이용하는 기법 중 하나이다.
주로 학부과정의 컴퓨터 보안 시간에 기본적으로 다루는 내용이지만, 실제로 볼 일이 많이 없다가 대응해야할 일이 생겨서 정리해보았다.
SQL Injection 을 이용해서 대표적으로 다음과 같은 방식의 공격이 사용된다.
(1) 인증 우회(Auth Bypass)
: SQL 쿼리문의 TRUE/FALSE 논리 연산 오류를 이용해서 인증 쿼리문이 무조건 TRUE가 나오게끔 하는 방식이다. Select count(*) from member where uid=’입력된 아이디’ and pw = ‘입력된 비밀번호’ 에서 ‘입력된 아이디’ 부분에 ‘ or 1=1# 과 같은 내용을 삽입하면 뒤의 내용이 주석처리 되면서 무력화 시킬 수 있다.
(2) Data disclosure (데이터 노출)
: 서버가 반환하는 Error 등을 참고해 정보를 파악해서 각 Column과 자료형을 알아내는 방식이다. www.example.com?idx=1’ having 1=1# 과 같은 방식으로 날리는 쿼리 파라미터를 분석한 뒤, 위와 같이 요청했을 때 반환되는 에러메시지를 분석해서 테이블을 유추한다. Error Based / Union Based 와 같은 공격이 이런 방식을 이용한다. 에러 메시지가 뜨지 않는 경우 Delay 함수등을 Inject 하여 응답시간으로 동작을 유추한다.
: 그 외에도 Procedure 호출 이나 명령어 삽입 등의 공격도 있다.
위의 내용은 SQL Injection 의 원론적인 부분이고 실무에서 쓰는 프레임워크들은 대부분 SQL Injection 에 대해 방어코드가 기본적으로 되어있다.
하지만 그래도 개발자로써 기본적으로 숙지해야할 보안의 기본적인 원칙들은 다음과 같다.
(1) Validation : 자유롭게 입력가능한 값에 대한 Validation 이 필수적이다.
(2) Parameter : 특히 API등에서도 Parameter 는 특수문자나 SQL 명령어가 입력될 수 없도록 필터링이 필요하다. 물론 더 문제인건 입력받는 Parameter를 바로 DB로 전달하는 것이다…
(3) Prepared : SQL 입력이 되는곳은 Prepared Statement 를 통한 처리나 ORM 등을 통해 매핑시켜서 사용하는 것이 안전하다.
(4) 권한 : 데이터 다루는 권한은 최소한으로 부여한다.
(5) 에러메시지는 노출하지 않는다.
(6) 동적 SQL의 사용은 지양한다.
'Server > Security' 카테고리의 다른 글
JWT(JSON Web Token) 란? 사용을 위한 예제 (2) | 2019.08.18 |
---|---|
HTTP vs HTTPS 차이점 알아보기 (0) | 2019.08.07 |
Hash Algorithm(해시 알고리즘)의 정의와 Encryption Algorithm(암호화 알고리즘) 과의 차이 (0) | 2018.12.12 |
Open ID 와 OAuth 인증에 대하여 (0) | 2018.08.10 |
SSL 이란? 웹사이트 보안을 위한 SSL 에 대한 정리 (0) | 2018.08.07 |