SQL Injection (SQLI)
데이터베이스(DB)와 연결되어있는 웹 어플리케이션의 동적으로 생기는 구문에다가 입력 값을 조작해
DBMS(DataBase Management System)가 원하지 않는 결과 값을 반환하게 하는 기법이다.
보통 웹 어플리케이션에서 입력값을 필터링 없이 전송될 때 발생된다.
즉,
SQL Injection 줄여서 SQLI는 웹 어플리케이션의 사용자 입력 값에 SQL 코드를 삽입 또는 추가하고,
해당 SQL 구문을 가장 마지막의 SQL 서버에 전달하여 해석 및 실행하는 과정에서 발생하는 공격이다.
-
웹 어플리케이션의 동작 흐름을 보면
1. 사용자가 사용자 인터페이스의 웹 브라우저를 통해 어떤 사이트에 접속한다.
2. 비즈니스 로직의 웹 서버는 파일 시스템에서 웹 어플리케이션 코드를 로드하고,
해당 코드를 스크립트 엔진에 전달하여 코드 해석과 코드 실행을 수행한다.
3. 웹 어플리케이션 코드는 데이터베이스 커넥터를 이용해 데이터베이스 계층과 연결하고,
데이터베이스에서 SQL 구문을 실행한다.
4. 데이터베이스에서는 데이터베이스 커넥터에 실행결과를 돌려주고 해당하는 결과는 비즈니스 로직의 스크립트 엔진으로 전달된다.
5. 비즈니스 로직의 웹 서버는 결과를 사용자 인터페이스인 웹 브라우저로 보내기 전에
웹 어플리케이션 또는 클라이언트 환경에 맞게 구현해준다.
6. 마지막으로 사용자의 웹 브라우저는 전달된 HTML 코드를 해석해 사용자에게 보여준다.
이러한 과정은 순식간에 일어나고 우리는 이 과정을 직접 볼 수 없다.
-
SQLI는
사용자 인터페이스(웹 브라우저, 변환 엔진), 비즈니스 로직(C#, ASP, PHP, JSP 등),
데이터베이스 계층(데이터 베이스, MySQL, Oracle, Ms-SQL Server 등)
3개의 구조 중에서 맨 마지막 구조인 데이터베이스 계층에서 발생하는 오류이다.
-
대부분 SQLI 취약점이 존재 하는지 여부를 위해 '(싱글쿼터)를 URL 맨 뒤에 삽입시킨다.
예를 들면 http://www.hello.com/php?id=4' 와 같이 말이다.
그렇다면 왜 '(싱글쿼터)는 에러를 일으킬까
그 이유는
싱글쿼터가 입력 값의 구분으로 해석되기 때문이다.
SQL 문법 상 실행 과정에서 SQL 쿼리에 오류가 발생한 것이다.
쉽게 입력 값 구분자가 너무 많기 때문에 데이터베이스에서 예외를 발생시킨 것이다.
SQL 데이터베이스는 싱글쿼터를 특수 문자로 본다 (문자열 구분 기호).
싱글쿼터는 SQL Injection 공격에서 개발자의 쿼리 구문을 무효화 시키고
공격자가 자신의 쿼리를 만들고 실행하는데 사용한다.
추가로 싱글 쿼터만 특수문자가 아니라, 공백, 더블파이프, 콤마, 마침표, 더블쿼터 등
다른 특수 문자가 있다.
-
정리하자면 싱글쿼터는 입력 값 구분자로 해석되고
데이터와 코드를 구분하는 문자열 구분기호로 사용된다.
하지만 숫자를 데이터 값으로 사용할 때는 쿼터로 감싸주지 않아도 된다.
감싸주면 그 숫자는 숫자가 아니라 문자열로 해석된다.
-
※ 총 정리 ※
SQL Injection이란?
입력 값 조작을 통해 백-엔드로 전달되는 SQL 구분을 이용해 공격하는 기법.
-
'(싱글쿼터)와 함께 입력한 코드의 실행 원리
SQL 데이터베이스는 쿼터 구문을 코드와 데이터의 경계로 구분한다.
쿼터 뒤에 오는 내용은 실행 코드이고, 쿼터에 감싸져 있는 내용은 데이터라고 해석한다.
-
☞ 웹 어플리케이션 동작 방식 ☜
1. 웹 어플리케이션은 인터넷이나 인트라넷 등의 네트워크를 통해
웹 브라우저로 접속하는 어플리케이션이다.
또한 웹 브라우저에서 해석 가능한 언어(HTML, JS, Java 등)로 프로그램된 컴퓨터 소프트웨어이고,
어플리케이션을실행하기 위해서는 일반적인 웹 브라우저를 필요로 한다.
-
2. 데이터베이스 기반의 동적 웹 어플리케이션은 전형적으로 백엔드 데이터베이스 서버로 이루어지고,
웹 페이지는 서버 사이트 스크립트 언어로 작성해 다양한 요구에 따라 데이터베이스에서
정보를 추출하여 보여준다.
-
3. 데이터베이스 기반의 동적 웹 어플리케이션은 공통적으로 3계층을 갖고 있다.
사용자 인터페이스, 베즈니스 로직, 데이터베이스 계층
그리고
웹 브라우저(사용자 인터페이스)는 중간계층(비즈니스 로직)으로 요청을 보내고
그 요청은 쿼리로 변환되어 데이터베이스에서 수행된다.(데이터베이스 계층)
-
-
☞ SQLI (SQL Injection)의 이해 ☜
1. SQLI는 어플리케이션의 사용자 입력 값에 SQL 코드를 삽입 또는 추가하고,
해당 SQL 구문을 가장 마지막의 SQL 서버에서 전달하여
해석 및 실행하는 과정에서 발생하는 공격이다.
-
2. SQLI의 가장 일반적인 형태는 파라미터 값에 SQL 명령을 삽입하고 실행하는 형태로 이루어진다.
-
3. 공격자가 SQL 구문 조작이 가능할 때 해당프로세스는 사용자 권한으로 실행될 것이다.
(ex : DB 서버, 웹 서버, 어플리케이션 서버와 똑같은 권한을 갖고 실행된다.)
이 동작은 종종 권한 상승을 부르기도 한다.
-
-
☞ 동작 원리 ☜
1. SQLI 취약점은 대부분 웹 개발자가 개발할 때 웹 폼, 쿠키, 입력 파라미터 등 사용자로부터 값을 입력받아 DB에 전달할 때 입력 값에 대해 필터링(검증)을 하지 않아 발생한다.
-
2. 만약 공격자가 SQL 쿼리로 보내지는 입력 값을 제어하고
코드로 변환되는 데이터를 조작할 수 있다면
공격자는 백-엔드 DB에서 코드를 실행시킬 수 있다.
-
3. DB의 기본적인 구조와 개발하고 있는 코드의 잠재적인 보안 이슈에 대한
완전한 이해와 자각없이, 개발자들은 가끔씩 이렇게 SQLI에 취약한 웹 어플리케이션을
상속받아 사용하곤 한다.