SQL Injection이란 웹 애플리케이션에서 입력받아 데이터베이스로 전달하는 SQL 쿼리를 바꾸거나, 다른 SQL 문장을 추가하여 불법 로그인, DB 데이터 추출, 시스템 명령 실행 등을 수행하는 공격 기법이다. Blind SQL 인젝션, 에러 기반 SQL 인젝션, Union SQL 인젝션 등 종류도 다양하다.
SQL Injection 특징
- DB에 악성코드를 대량으로 삽입
- 자동 삽입 스크립트를 사용하여 한번에 악성코드를 대량 삽입
- POST나 HTTP Header를 이용한 경우는 공격 로그를 찾기 어려움
- 악성코드 삽입 과정에서 데이터의 손실 또는 유실 발생
SQL Injection 공격 종류
- 인증 우회 (AB : Auth Bypass)
보통 아이디와 비밀번호를 입력하는 로그인 페이지를 목표로 하는 공격이다. SQL 쿼리문의 true/false의 논리적 연산 오류를 이용하여 로그인 인증 쿼리문이 무조건 true의 결과 값이 나오게 하여 인증을 무력화 시키는 원리이다.
- 데이터 노출 (DD : Data Disclosure)
목표 시스템의 주요 데이터 절취를 목적으로 하는 방식이다. Error based, Union, Blind, Time 방식이 있다. 시스템의 에러는 개발자에게 버그를 수정하는 면에서 많은 도움을 주지만 역으로 에러를 이용할 수 있다. 악의적인 구문을 삽입하여 에러를 유발시키는 것이다.
- 원격명령 실행 (RCE : Remote Command Excute)
대응방안
- 문자열 필터링 및 길이 제한
데이터베이스와 연동하는 스크립트의 모든 파라미터를 점검하여 사용자의 입력 값에 이용되는 특수문자(‘, “, \, ;, :, %, space, --, # 등) 및 SQL 관련 문자열(select, union, insert, delete, update 등)을 필터링한다. 또한, 문자열의 길이를 제한하고, 숫자는 숫자인지 점검하는 함수를 사용한다.
- 확장 프로시저 제거
MS-SQL의 경우 확장 프로시저(mater, xp_cmdshell, xp_startmail, xp_sendmail 등)는 운영체제 명령 실행 및 SQL 인젝션에 이용되기 때문에 제거하는 것이 안전하다.
- DB 사용자 권한 제한
웹 프로그램을 사용하는 DB 사용자의 권한을 제한한다.
- 선처리 질의문(Prepared Statement) 이용
선처리 질의문을 이용하면 SQL 쿼리문을 선처리하여 이후 입력되는 변수 값을 항상 문자열 변수로 다루기 때문에 사용자가 악의적인 SQL 구문을 삽입하더라도 SQL 문에 영향을 미치지 않아 SQL 인젝션이 발생하지 않는다.
- hash function 사용
사용자의 입력값을 DB 그대로 저장하고 사용하지 말아야 한다. 특히 비밀번호의 경우 그렇다. 무조건 SHA-256 이상의 보안성을 갖는 해시함수로 해싱한 뒤 저장해야 한다.
'Web Hacking > 이론적인 내용' 카테고리의 다른 글
CSRF(Cross Site Request Forgery)란? (0) | 2017.09.08 |
---|---|
XSS란? (2) | 2017.09.01 |
DCL(데이터 제어어)란? (0) | 2017.08.11 |
데이터 조작어(DML)이란? (0) | 2017.08.03 |
데이터 정의어(DDL)이란? (0) | 2017.07.27 |