에스큐엘 인젝션
에스큐엘 인젝션(SQL Injection; Structured Query Language Injection)은 코드 인젝션의 한 기법으로, 클라이언트의 입력값을 조작하여 서버의 데이터베이스를 공격할 수 있는 공격 기술을을 말한다. 주로 사용자가 입력한 데이터를 제대로 필터링, 이스케이핑하지 못한 경우 발생한다.
목차
개요[편집]
에스큐엘 인젝션은 공격이 쉬운 데 비해 파괴력이 어마어마하기 때문에 시큐어코딩을 하는 개발자라면 가장 먼저 배우게 되는 내용이다. 이러한 인젝션(injection) 계열의 취약점들은 테스트를 통해 발견하기는 힘들지만 스캐닝툴이나 코드 검증절차를 거치면 보통 쉽게 발견되기 때문에 탐지하기는 쉬운 편이다. 보안회사 임퍼바(Imperva)가 2012년에 발표한 보고서에 따르면 월평균 4회가량의 SQL 인젝션 공격이 일어난다고 한다. 오와스프(OWASP)에서도 수년 동안 인젝션 기법이 보안 위협 1순위로 분류되는 만큼 보안에 각별한 주의가 필요하다.[1]
활용[편집]
에스큐엘 인젝션은, 웹 애플리케이션이 데이터베이스와 연동하는 모델에서 발생 가능하다. 이용자의 입력값이 에스큐엘 구문의 일부로 사용될 경우, 해커에 의해 조작된 에스큐엘 구문이 데이터베이스에 그대로 전달되어 비정상적인 DB 명령을 실행시키는 공격 기법이다.
공격 목적[편집]
에스큐엘 인젝션은 DB에 비정상적인 쿼리가 실행되도록 하여 크게 3가지의 목적을 달성하고자 한다.
- 인증 우회 :에스큐엘 인젝션 공격의 대표적인 경우로, 로그인 폼(Form)을 대상으로 공격을 수행한다. 정상적인 계정 정보 없이도 로그인을 우회하여 인증을 획득할 수 있다.
- DB 데이터 조작 및 유출 : 조작된 쿼리가 실행되도록 하여, 기업의 개인정보나 기밀정보에 접근하여 데이터를 획득한다. 또한 데이터 값을 변경하거나 심지어 테이블을 전부 지워버릴 수도 있다.
- 시스템 명령어 실행 : 일부 데이터베이스의 경우 확장 프로시저를 호출하여 원격으로 시스템 명령어를 수행할 수 있도록 한다. 시스템 명령어를 실행할 수 있다면 해당 서버의 모든 자원에 접근하고 데이터를 유출, 삭제 할 수 있다.
종류[편집]
- 에러 베이스(Error Based) 에스큐엘 인젝션
- 에러 베이스 에스큐엘 인젝션은 쿼리에 고의적으로 오류를 발생시켜 변환된 오류를 이용하여 공격하고, 에러의 내용을 토대로 필요한 정보를 찾아낸다.
- 유니온 베이스(Union Based) 에스큐엘 인젝션
- 에스큐엘에서 유니온(Union) 구문은 두개의 쿼리문을 합쳐서 반환할 경우 주로 사용된다. 이 때, 두 테이블의 구조는 같아야 하며 그림과 같이 사용된다.유니온 베이스 에스큐엘 인젝션은 유니온 구문의 이러한 특징을 이용하여 주로 데이터 노출을 위해 사용된다. 이는 우편번호 찾기나, 게시판과 같이 데이터를 쉽게 확인할 수 있는 곳에서 주로 이용된다.
- 블라인드(Blind) 에스큐엘 인젝션
- 블라인드 에스큐엘 인젝션은 공격자가 YES or NO 로 응답할 수 있는 쿼리를 전송하여 이에 대한 반응을 관찰하여 공격하는 방식이다. 이 경우 다양한 경우가 존재하기 때문에 자동화 된 툴을 사용하기도 한다.
- 1) 불린 베이스(Boolean-based) 블라인드 에스큐엘 인젝션
- 웹사이트가 참/거짓을 반환하는 요소로 사용할 수 있다. 여기에 AND 조건으로 해커가 알고 싶은 쿼리 조건을 삽입해서 그 결과로부터 정보유출이 가능한 것이 블라인드 에스큐엘 인젝션 공격 기법이며 이중에서도 AND 조건에 논리식을 대입하여 참/거짓 여부를 알아내는 방식이다.
- 2) 타임 베이스(Time Based) 블라인드 에스큐엘 인젝션
- 타임 베이스 블라인드 에스큐엘 인젝션은 시간을 지연시키는 쿼리를 주입하여 응답 시간의 차이로 참/거짓을 판별 한다. 즉, 쿼리 지연을 유도해 응답 시간에 걸리는 시간으로 참/거짓을 판별하게 함으로써 DB의 유용한 정보를 캐낼 수 있다.
대안[편집]
웹 방화벽(WAF)도입[편집]
웹 방화벽은 HTTP/HTTPS 응용 계층의 패킷 내용을 기준으로 패킷의 보안성을 평가하고 룰(Rule)에 따라 제어한다. 에스큐엘 인젝션에 룰(Rule)을 설정하여 공격에 대비한다.
- 물리적 웹 방화벽
- 물리적 웹 방화벽은 기업의 규모가 어느정도 크거나 보안이 중시되는 환경이나 예산이 충분한 경우에 사용한다. 또는 어플라이언스 형태의 제품을 사용하거나 서비스로서의 보안(Security as a Service, SECaaS)형태의 클라우드 기반 보안의 도입도 가능하다.
- 논리적 웹 방화벽(공개 웹 방화벽)
- 전용 웹 방화벽 장비를 도입할 여력이 안된다면, 공개 웹 방화벽을 도입해볼만 하다. 대부분 공개 웹 방화벽은 물리적인 장비가 아닌 논리적인 구성으로 웹 방화벽 역할을 수행한다.
시큐어 코딩[편집]
시큐어 코딩(Secure Coding)이란 안전한 소프트웨어 개발을 위해 소스 코드 등에 존재할 수 있는 잠재적인 보안 취약점을 제거하고, 보안을 고려하여 기능을 설계 및 구현하는 등 소프트웨어 개발 과정에서 지켜야 할 일련의 보안 활동을 말한다.
- 입력값 유효성 검사
- 모든 웹 보안 영역에서 외부에서 들어오는 모든 입력값은 모두 의심의 대상이다. 에스큐엘 인젝션의 가장 기본적인 대응은 바로 입력값의 유효성을 검사하는 것이다. 입력값 검증에서는 두가지 방식이 존재한다.
- 1) 블랙 리스트 방식
- 에스큐엘 쿼리의 구조를 변경시키는 문자나 키워드를 제한하는 방식으로 지정한 문자를 블랙리스트로 정의하여 해당 문자를 공백 등 으로 치환하는 방식으로 방어한다.
- 2) 화이트 리스트 방식
- 화이트 리스트 방식은 블랙리스트 방식과 반대로 허용된 문자를 제외하고는 모두 금지하는 방식이다. 이 때문에 블랙리스트 방식보다 보안성 측면에서 훨씬 강력하다.
- 동적 쿼리 사용제한
- 웹 애플리케이션이 DB와 연동할 때 정적쿼리만 사용한다면 에스큐엘 인젝션을 신경 쓸 필요가 없다. 그러나 근래 웹 애플리케이션은 모두 사용자와 상호작용하며 동적인 기능을 기반으로 하기 때문에 현실적으로 동적 쿼리를 사용하지 않을 수 없다. 이 때 동적 쿼리를 정적쿼리 처럼 사용하는 기법인 매개변수화된 쿼리(구조화된 쿼리)를 사용한다. 쿼리 구문에서 외부 입력값이 에스큐엘 구문의 구조를 변경하지 못하도록 정적구조로 처리하는 방식이다.
- 오류 메시지 출력 제한
- DB의 오류 정보를 그대로 사용자에게 노출해서는 안된다. DB 오류 정보는 개발자들이 쉽게 디버깅할 수 있도록 내부 정보를 상세히 알려주는 경우가 많다. 해커는 이 정보를 바탕으로 DB 구조를 파악하고 데이터 유출을 시도할 것이다. 따라서 DB 오류가 사용자에게 노출되지 않도록 커스텀 오류 페이지를 제공해야한다. 또한 너무 자세한 안내 메시지도 주의해야한다. 자세한 안내 메시지는 해커들로 하여금 공격의 범위를 좁혀주는 결과로 이어질 수 있기 때문이다.
DB 보안[편집]
DB 보안은 외부자나 내부자가 DB 내에 저장된 조직의 주요기밀 정보에 불법적으로 접근하는 것을 막는 것이다.
- DB 계정 분리
- 관리자가 사용하는 DB 계정과 웹 애플리케이션이 접근하는 DB 계정은 정보가 남는 것을 방지하는 차원에서 반드시 분리되어야 한다.
- DB 계정 권한 제한
- 웹 애플리케이션이 DB에 액세스하는 전용 계정을 생성하고 이 계정에는 최소 권한 원칙에 입각하여 꼭 필요한 권한만 부여한다.
- 기본/확장 저장 프로시저 제거
- 데이터베이스가 설치될때 기본적으로 포함된 프로시저들을 꼭 필요한 경우가 아니라면 제거하는 것이 좋다.[2]
사례[편집]
뽐뿌 개인정보 해킹 사건[편집]
2015년 9월 뽐뿌 사이트 내 자유게시판을 시작으로 아이디와 비밀번호가 털려 개인정보가 해킹 당하는 사건이 발생했다. 해킹에는 에스큐엘 인젝트 기법이 사용되었으며 뽐뿌는 개발 중단된지 오래된 제로보드 4버전을 기반으로 운영하고 있어 보안문제에 취약했다. 더욱이 홈페이지를 관리하는 보안 인력이 3명에 불과하였기 때문에 200만명을 보유한 대형 커뮤니티의 허술한 홈페이지 실태에 유저들은 분노했다.[3]
여기어때 개인정보 해킹 사건[편집]
2017년 3월 위드이노베이션 웹사이트의 해킹으로 여기어때 애플리케이션 가입자 4000여명의 개인 정보, 숙박 정보가 유출되었다. 해킹 수법은 에시큐엘 인젝트 기법으로 DB에 저장된 관리자 세션값을 탈취한 것으로 드러났다. 해커는 탈취한 관리자 세션값으로 외부에 노출된 서비스 관리 웹페이지를 관리자 권한으로 우회 접속하여 개인 정보를 유출한 것으로 밝혀졌다. 유출된 개인정보 수는 숙박 예약정보 323만9210건, 제휴점 정보 1163건, 이메일 주소·이름·기기정보 등 회원정보 17만8625건이다. 예약정보에는 숙박일수, 제휴점명부터 예약일시, 예약자, 회원번호, 휴대폰 번호, 결제방법과 금액까지 민감한 정보가 포함돼 있다.[4]
각주[편집]
- ↑ 나무위키 - https://namu.wiki/w/SQL%20injection
- ↑ 박종명, 〈(웹보안) SQL INJECTION〉, 《티스토리》, 2019-01-28
- ↑ 장윤희 기자, 〈(뽐뿌 해킹)흔한 해킹 수법 'SQL 인젝션'에 뚫려〉, 《중앙일보》, 2015-09-13
- ↑ 이유지 기자, 〈‘여기어때’ 개인정보 99만건 유출…‘SQL인젝션’ 공격이 원인〉, 《블로터》, 2017-04-26
참고 자료[편집]
- 나무위키 - https://namu.wiki/w/SQL%20injection
- 박종명, 〈(웹보안) SQL INJECTION〉, 《티스토리》, 2019-01-28
- 장윤희 기자, 〈(뽐뿌 해킹)흔한 해킹 수법 'SQL 인젝션'에 뚫려〉, 《중앙일보》, 2015-09-13
- 이유지 기자, 〈‘여기어때’ 개인정보 99만건 유출…‘SQL인젝션’ 공격이 원인〉, 《블로터》, 2017-04-26
같이 보기[편집]