SQL Injection
태그 :
- 개념
- SQL-Injection의 정의 - 데이터베이스로 전달되는 SQL Query를 변경시키기 위해 Web Application에서 입력 받은 파라메터를 변조 후 삽입하여 비정상적인 데이터베이스 접근을 시도하거나 쿼리를 재구성하여 원하는 정보를 열람하는 해킹 기법
I. SQL-Injection의 개요
가. SQL-Injection의 정의
- 데이터베이스로 전달되는 SQL Query를 변경시키기 위해 Web Application에서 입력 받은 파라메터를 변조 후 삽입하여 비정상적인 데이터베이스 접근을 시도하거나 쿼리를 재구성하여 원하는 정보를 열람하는 해킹 기법
나. SQL-Injection의 특징
- 데이터베이스에 악성코드를 대량으로 삽입
- 자동 삽입 스크립트를 사용하여 한번에 악성코드를 대량 삽입
- POST나 HTTP Header(쿠키, 리피러 등)를 이용한 경우는 공격 로그를 찾기 어려움
- 악성코드 삽입과정에서 데이터의 손실 또는 유실 발생
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는 웹 애플리케이션 전체에 영향을 끼치는 모듈로, 서비스 장애 발생 등을 최소화하기 위해 개 발환경에서 충분한 테스트가 이루어진 다음 운영환경에 적용 필요