secure_world

공격 기법 - SQL Injection 본문

모의 해킹 기초

공격 기법 - SQL Injection

시월드 2021. 12. 28. 15:53

1. SQL?

2. SQL Injection?

3. SQL Injection의 종류

4. SQLMAP

5. 대응 방안


※ 개인적인 공부를 위해 작성하였습니다. 이 글을 참고하여 허가되지 않은 곳에 사용하지 마시고 법 적인 문제가 생길 시 책임지지 않습니다.

 

1. SQL?

 - SQL(Structured Query Language, 구조화 질의 언어)이란 RDBMS(Relation DBMS, 관계형 DBMS)의 데이터를 관리하기 위해 설계된 특수 목적 프로그래밍 언어를 말함

 - SQL구문을 이용하여 서버에 요청을 전송하게 되면 서버에서 SQL구문을 통해 요청 내용을 수행 및 클라이언트에 전송하며 통신할 수 있음

 - 명령어의 종류는 다음과 같음

1. DDL(Data Definition Language, 데이터 정의 언어)

  - 데이터 정의 언어는 테이블과 인덱스의 구조를 관리

  - CREATE, DROP, ALTER,RENAME, TRUNCATE 등의 구문이 있음

2. DML(Data Manipulation Language, 데이터 조작 언어)

  - 데이터 조작 언어는 데이터의 내용을 삽입 및 삭제 등 내용을 선택하여 변경 가능

  - INSERT INTO, UPDATE ~SET, DELETE FROM, SELECT ~FROM ~WHERE 등의 구문이 있음

3. DCL(Data Control Language, 데이터 제어 언어)

  - 데이터 제어 언어는 데이터의 권한에 대한 제어를 담당

  - GRANT, REVOKE, SET TRANSACTION, BEGIN, ROLLBACK 등의 구문이 있음

 

2. SQL Injection?

  - SQL 주입 공격으로도 불리며, 코드 인젝션 종류의 기법으로 클라이언트 입력 값을 조작하여 서버에 악의적인 요청을 통해 데이터베이스를 공격할 수 있는 공격 방식을 말함.

  - 주로 사용자가 입력할 수 있는 파라미터 값에 대한 데이터 검증(EX. 필터링, 이스케이프 구문 등)이 되어있지 않은 경우 발생할 수 있음

  - 쉬운 공격 난이도에 비해 영향력이 강하기 때문에 OWASP TOP 10에서도 매년 Injection공격이 포함되어 있고, 수 년간 1순위로 분류되었던 만큼 주의가 필요

 

3. SQL Injection의 종류

[그림] SQL Injection의 종류 (출처 : 구글 이미지)

3.1. In-band SQL Injection

1) Error-Based SQL Injection

  - SQL 쿼리에 고의적인 에러(EX. ', " 를 이용한 요청 등)를 발생시켜 서버로 전송하게 되면, 서버에서 에러 페이지를 통해 에러가 발생한 것을 알려줌

  - 발생된 에러 페이지에 DataBase의 내용이 포함되어 내부의 내용을 유추하거나 알아낼 수 있는 공격을 말함

 

2) Union-Based SQL Injection

  - 기본적으로 에러 정보가 웹페이지에 노출되어 나타나는 것을 전제로 함

  - Union 쿼리를 이용하여 공격하는 방법은 공격 쿼리문과 다른 쿼리문을 조합하여 DataBase의 내용을 유추하거나 알아낼 수 있는 공격을 말함

  - 공격에 대한 조건은 조합하는 쿼리 문의 컬럼 수와 데이터 형식이 같아야함

 

3.2. Inferential SQL Injection

* Blind SQL Injection

  - SQL쿼리를 서버로 요청했을 때, 서버로부터 오는 응답이 참인지 거짓인지에 의해 출력되는 페이지가 다를 경우 사용할 수 있음

  - SQL 구문을 사용하여 요청 시, 에러 페이지가 없고 요청의 내용이 참일 때 페이지와 거짓일 때 페이지가 다를 경우 Blind SQL Injection을 사용하게 됨

  - 사용되는 기본적인 SQL구문은 다음과 같음

    1. substr(자를 문자열, 자를 문자의 시작점, 자를 문자의 개수)

      ex) str = substr("Helloworld", 1, 3) => Hel 출력

    2. ascii(아스키 코드로 변환시킬 문자)

      ex) ascii(a) = 97

    3. sleep(시간)

      ex) sleep(5) = 서버의 응답이 5초간 지연되면 참, 아니면 거짓

 

1) Blind-boolean-Based SQL Injection

  - Boolean-Based SQL Injection은 참과 거짓만 출력하는 페이지에서 공격자가 조작한 쿼리를 통해 데이터 베이스의 내용이 노출되게 하는 공격을 말함

  - 공격자가 데이터 베이스의 내용을 유추하여 쿼리를 서버에 요청했을 때, 참과 거짓의 페이지가 다름을 통해 데이터 베이스의 내용을 유추할 수 있음

 

2) Time-Based SQL Injection

[그림] 데이터베이스 종류 별 Time-Based SQLi 예시 (출처 : 구글 이미지)

  - 쿼리의 결과가 참인지 거짓인지 최소한의 출력조차 하지 않는 경우 Time-Based SQL Injection기법을 이용할 수 있음

  - 위의 표와 같은 문구로 데이터베이스에 맞는 구문을 요청했을 때, 참인 경우 표기된 시간만큼 지연되어 응답이 오고 거짓인 경우 바로 응답이 오는 것을 통해 공격이 가능함

  - 참과 거짓에 대한 응답 시간을 통해 데이터 베이스의 내용을 유추 또는 알아낼 수 있는 공격 기법 

 

3.3. Out-of-band SQL Injection

  - SQL Injection이 가능하지만 Inband(Error, Union)로 결과를 확인할 수 없을 때, Inferential(Boolean, Time)으로는 결과를 확인할 수 없거나 너무 느리게 될 때, Out-of-band 기법을 사용할 수 있음

  - 쿼리의 결과를 다른 외부 채널을 통해 전달하는 기법으로, 쿼리의 결과를 HTTP패킷에 담아 보내기도 하고, DNS 질의를 통해 보내게 하기도 하며, 패킷을 통해 서버의 데이터 베이스 내용을 유추하거나 알아낼 수 있는 공격 기법을 말함

 

4. SQLMAP

 

sqlmap: automatic SQL injection and database takeover tool

Introduction sqlmap is an open source penetration testing tool that automates the process of detecting and exploiting SQL injection flaws and taking over of database servers. It comes with a powerful detection engine, many niche features for the ultimate p

sqlmap.org

  - SQLMAP은 SQL Injection 취약점을 탐지 및 악용하여 데이터 베이스의 서버 공격 프로세스를 자동화하는 오픈 소스 침투 테스트 도구를 말함

  - SQL Injection을 하나하나 작성하여 실행하지 않아도 자동화 된 툴을 이용하여 데이터 베이스에 연결될 수 있도록 도와주는 역할을 진행

 

5. 대응 방안

1. 입력 값에 대한 검증

  - 서버에서 화이트 리스트 기반으로 사용자의 입력 값을 검증하는 것을 필요로 함

  - 블랙 리스트를 기반으로 할 시 수 많은 차단 리스트를 등록해야하고 우회 방법이 지속적으로 발견될 수 있기 때문에 화이트 리스트를 권장

 

2. Prepared Statement 구문 사용

  - 사용자의 입력 값이 데이터 베이스의 파라미터로 들어가기 전, DBMS가 미리 Statement 구문을 컴파일하여 실행하지 않고 대기하도록 함

  - Statement 구문 외에는 문자열로만 인식하게 되기 때문에 사용자가 입력 값에 쿼리문을 입력하여도 단순 문자열로 구분

 

3. ErrorMessage 노출 금지

  - 데이터 베이스 에러 발생 시, 메세지를 통한 데이터 베이스 관련 내용이 노출되는 것을 방지

  - 오류 발생 시 사용자에게 따로 오류를 알려줄 수 있는 메세지 박스를 띄우도록 하는 것이 좋음

Comments