SQL 인젝션(SQL Injection)이란 웹 애플리케이션과 데이터베이스 간의 연동에서 발생하는 취약점으로, 공격자가 입력 폼에 악의적으로 조작된 쿼리를 삽입해 데이터베이스 정보를 불법적으로 열람하거나 조작할 수 있는 취약점을 말한다. SQL(Structured Query Language)이란, 데이터베이스 관리를 위한 특수 목적의 프로그래밍 언어를 말한다.
최근에 발견된 SQL 인젝션 취약점은 웹사이트 콘텐츠 관리를 위한 워드프레스의 얼티밋 멤버(Ultimate Member) 플러그인에서 발견된 위험도 9.8점에 이르는 치명적인 취약점이다. 이 취약점은 SQL 인젝션으로 입력값을 조작해 데이터를 공격하고 탈취할 수 있는 위험이 있다.
SQL 인젝션 공격 유형은 크게 네 가지로 구분할 수 있다. 먼저 ‘Error based SQL Injection(논리적 에러를 활용한 SQL 인젝션)’은 인증 우회를 위해 논리적 에러를 유도하는 방식의 공격 기법을 말한다. ‘Union SQL Injection(UNION 명령어를 활용한 SQL 인젝션)’은 공격자가 추가적인 쿼리를 삽입해 정보를 획득하는 기법으로 UNION 명령어를 이용해 여러 쿼리를 합치는 방식을 이용한다.
‘Blind SQL Injection : Boolean based SQL’은 서버의 반응을 통해 정보를 얻는 SQL 공격 기법으로, 오류 메시지의 자세한 내용이 없어도 공격이 가능하다. ‘Stored Procedure SQL Injection’이란, 저장 프로시저는 쿼리를 묶어 하나의 함수처럼 실행하는데, 공격자가 저장 프로시저에 악성코드를 삽입해 실행하는 SQL 공격 기법이다.
SQL Injection 공격의 대응방안은 ‘입력값 검증’, ‘웹 방화벽 활용’, ‘Prepared Statement’, ‘원시 에러 미출력’ 등이 있다. 먼저 ‘입력값 검증’은 데이터 타입 검사와 길이 제한, addslashes로 가능하다. 데이터 타입 검사는 예를 들어 숫자만 입력해야 하는 필드에 숫자가 아닌 값이 들어오면 오류로 처리하는 방식이다. 길이 제한은 필드에는 8글자만 입력되어야 한다면, 입력값을 8글자로 제한하는 것을 말한다. addslashes는 입력값에 ‘/’와 같은 특수문자가 존재하면 ‘로’로 처리해 특수문자로 동작하지 않도록 방지한다.
‘웹 방화벽 활용’은 서버에 웹 방화벽 제품을 설치해 공격을 탐지하고 차단한다. 이는 패턴을 기반으로 분석해 SQL 인젝션으로 보이는 요청을 감지하고 차단하는 것이다.
‘Prepared Statement’는 DBMS 드라이버를 통해 입력값이 SQL 문장이 아닌 단순한 입력값으로 처리되도록 보장하는 것이다.
마지막으로 ‘원시 에러 미출력’은 SQL 인젝션과 같은 공격에서 발생하는 원시 에러를 통해 데이터베이스 구조를 추정하는 것이다. 오류 메시지나 사용자에게 직접 노출하지 않도록 설정한다.
[제작=서울여자대학교 정보보호학과 제21대 학생회 플래그]
<저작권자: 보안뉴스(www.boannews.com) 무단전재-재배포금지>