SQL Injection

개념
SQL-Injection의 정의 - 데이터베이스로 전달되는 SQL Query를 변경시키기 위해 Web Application에서 입력 받은 파라메터를 변조 후 삽입하여 비정상적인 데이터베이스 접근을 시도하거나 쿼리를 재구성하여 원하는 정보를 열람하는 해킹 기법

I. SQL-Injection의 개요

가. SQL-Injection의 정의

  1.  데이터베이스로 전달되는 SQL Query를 변경시키기 위해 Web Application에서 입력 받은 파라메터를 변조 후 삽입하여 비정상적인 데이터베이스 접근을 시도하거나 쿼리를 재구성하여 원하는 정보를 열람하는 해킹 기법

 

나. SQL-Injection의 특징

  1. 데이터베이스에 악성코드를 대량으로 삽입
  2. 자동 삽입 스크립트를 사용하여 한번에 악성코드를 대량 삽입
  3. POST나 HTTP Header(쿠키, 리피러 등)를 이용한 경우는 공격 로그를 찾기 어려움
  4. 악성코드 삽입과정에서 데이터의 손실 또는 유실 발생

 

II. SQL-Injection의 공격기법

기법

설명

인증우회

- 인증을 처리하는 모듈이 입력 값에 대해 적절히 검사하지 않았을 때 공격자는 비정상적인 SQL Query를 삽입할 수 있고 이를 이용해 사용중인 데이터베이스에 영향을 줄 수 있음

- 주로 로그인 창에 적용되는 기법으로 이용자 아이디와 패스워드를 몰라도 로그인 할 수 있게 해줌.

권한상승

- 공격자가 DB의 시스템 권한을 획득한다면, SQL에서 기본적으로 제공하는 확장 프로시저를 이용하여 악성 코드를 삽입하거나 DB를 변경하는 등의 여러 가지 시스템 명령어를 실행시켜 악용.

- xp_cmdshell : 임의의 명령 실행을 허가하는 내장된 저장 프로시저

- 기타 저장 프로시저

: xp_servicecontrol 프로시저는 사용자가 작동, 정지, 일시 정지 그리고 연속 서비스하는 것을 허가

: xp_dirtree 프로시저는 디렉토리 트리 획득을 허가 : xp_makecab 프로시저는 사용자가 서버에 압축파일 만드는 것을 허가

에러 메시지를 통하여 정보 얻기

- 조작된 URL을 요청하게 되면 홈페이지는 에러 메시지 들을 발생 - 에러 메시지 들은 공격자들에게 유용한 정보를 제공하여 쉽게 DB를 열람 및 시스템 명령어를 수행할 수 있음

데이터베이스에 저장된 데이터의 열람 / 조작

- Error-Based Injection, Blind SQL Injection 등의 기법을 통해 주요 데이터의 조 회, 테이블 생성 등 데이터베이스에 대한 다양한 공격이 가능하다. - Error-Based Injection : 화면에 노출된 DB에러 메세지를 이용한 공격방식 - Blind SQL Injection : 쿼리조건에 따른 결과화면의 차이를 이용한 공격방식

 

III. SQL-Injection의 탐지기법

가. SQL Injection 침입확인 방법

구분

설명

DB확인

- 임시테이블이나 이용자 계정으로 확인

- HDSI 툴에 의한 침입 : T_Jiaozhu, jiaozhu, comd_list, xiaopan, Reg_Arrt 등의 테이블을 생성

- D-SQL에 의한 침입: D99_Tmp라는 테이블 생성

 

Web Log확인

- 테이블 관련한 Create나 Select 구문이 없는지를 확인 - 확장 저장 프로시저에 대한 로그가 존재 - 검색 할 문자열 : XP_CMDSHELL, Net, user, Update, Insert, drop table 등

 

나. SQL Injection 취약점 검색 방법

구분

설명

수동확인방법

- SQL Injection공격에 취약한지 검사하는 방법으로 자신의 사이트가 SQL Injection 취약점에 노출되어 있는지 간단히 점검해 볼 수 있음.

- GET 방식 SQL 주입 공격 탐색 - POST 방식 SQL 주입공격 탐색 - 테스트 문자열

1 ‘ or 1=1-- 2 “ or 1=1-- 3 or 1=1-- 4 ‘ or ‘a’=’a 5 “ or “a”=”a 6 ‘) or (‘a’=’a 7 sql‘ or 1=1-- 8 sql“ or 1=1-- 9 +or 1=1--

10 ‘;--

자동확인방법

- 빠른 시간내에 SQL Injection 문제점들을 찾기 위해서는 자동화된 도구를 이용 - Paros Proxy를 이용한 자동 검색

: 서핑을 완료한 페이지에 대하여만 SQL Injectoin 취약점이 존재하는지 점검 가능 - nikto web CGI스캐너

: 기존에 잘 알려진 SQL Injection취약점에 대해서만 검색 가능나 실제 서버의 응답결과를 확인하지 않으므로 오탐의 소지가 높음 - SQL Injector

: 점검하고자 하는 사이트의 시작페이지를 지정한 후 “SQL 주입 취약점 Scan” 버튼을 누르면 사이트의 모든 페이지 및 매개변수에 대하여 SQL Injection 취약점이 존재하는지 점검

 

IV. SQL-Injection의 조치방법

가. 바인딩 매개 변수 방식 적용

- 바인딩 매개 변수를 이용해 사전에 변수의 타입을 명시적으로 지정해 주면 원천적으로 차단이 가능함

방법

설명

Stored Procedure 사용

- DBMS 에서 지원하는 Stored Procedure를 이용하여, SQL Query문은 DBMS의 내부 프로시저에 구현하고, 웹 프로그램에서는 단순히 각종 변수 값들을 프로시저에 전달해 주는 역할수행

기본 클래스(객체) 사용

- JAVA는 PreparedStatement 클래스를 활용하면 되고, ASP는 ADO Command 객체를 활용

- 단점으로는 개발 공수가 많이 들어 이미 운영중인 시스템에 적용할 때에는 일정을 충분히 고려

 

나. 사용자 입력값 체크

- 사용자로부터 입력될 수 있는 모든 값에 대하여 Injection을 발생시킬 수 있는 위험한 문자가 포함되어 있 는지 여부를 체크하는 방법 - 공통 함수에 체크 로직을 구현하고 소스내의 모든 request를 찾아 공통 함수를 적용해 주는 방식을 주로 사용

- 단점으로는 일정 기간이 지나면 취약점이 재발생할 가능성이 있음 - 제한문자 : '(작은따옴표), --(주석) , ;(세미콜론) , %(퍼센트) - 추가사항 : 숫자로만 구성되어야 하는 데이터는 숫자 정합성 여부 체크 필수

 

다. Servlet Filter 기능 적용( Java에서만 가능)

- Servlet SPEC 2.3 을 지원하는 Java 컨테이너 기반의 웹사이트 경우, 각각의 JSP 소스를 손 댈 필요 없이 모든 Request(처리전), Response(처리후)에 대해 공통적으로 적용되는 기능을 구현 가능

- SQL-Injection외 Cross-Site Scripting, 인증 세션 체크 등의 공통 보안 로직으로 활용

- Servlet Filter는 웹 애플리케이션 전체에 영향을 끼치는 모듈로, 서비스 장애 발생 등을 최소화하기 위해 개 발환경에서 충분한 테스트가 이루어진 다음 운영환경에 적용 필요

댓글