Web Hacking - SQL Injection (1)

Background : Relational DBMS

DBMS(Data Base Manage System) : 컴퓨터에서 정보를 기록하기 위한 데이터베이스를 관리하는 애플리케이션으로, 이용자가 데이터를 생성하고, 참조하고, 수정하는 웹 서버의 특수한 환경에 적합한 자료구조

DBMS

데이터베이스에 새로운 정보를 기록하고, 기록된 정보를 수정, 삭제하는 역할을 한다. 다수의 사람이 동시에 데이터베이스에 접근할 수 있으며, 검색 기능과 같이 복잡한 요구사항을 만족하는 데이터를 조회할 수 있도록 한다

Data Base Description Example
Relational Table 형식으로 데이터를 저장 MySQL, MariaDB, PostgreSQL, SQLite
Non-Relational Key-Value 형태로 값을 저장 MongoDB, CouchDB, Redis

Relational DBMS (RDBMS)

Codd’s 12 rules (1970)

0. 시스템은 데이터베이스 뿐만 아니라, 관리 시스템으로서도 관계형 모델 자격을 얻어야 한다
어떤 시스템이 관계형 데이터베이스 매니지먼트 시스템으로서의 자격을 얻고자 한다면, 그 시스템은 관계형 수단만을 데이터베이스를 관리하는 데 사용해야 한다

1. 정보 규칙
데이터베이스 내의 모든 정보는 한 가지 방법으로 표기되어야한다. 즉, 테이블 내 행 안의 열 안에 들어간 값으로 표현되어야 한다

2. 보장된 접근 규칙
모든 데이터는 모호함 없이 접근되어야한다(기본 키가 요구된다). 데이터베이스 내의 모든 개별적인 값은 그것을 포함하는 테이블의 이름, 열의 이름, 행의 기본 키를 지정하면, 논리적 주소로 불러낼 수 있어야 한다

3. null 값의 체계적인 처리
DBMS는 각 필드에 대해 null값(정보가 없거나 활용할 수 없는 정보)라는 것에 대한 표현을 지원하되, 다른 모든 통상적인 값들과 구별되게 할 수 있도록 해야 하며 null값에 대한 표현은 데이터 타입이 독립적이어야 한다.

4. 관계형 모델에 기반한 액티브 온라인 데이터베이스 카탈로그
시스템은 온라인, 인라인 관계형 카탈로그를 지원하여, 사용자들이 데이터베이스의 데이터에 접근할 때 사용하는 것과 동일한 쿼리 언어를 통해 데이터베이스의 구조(카탈로그)에 접근할 수 있어야 한다.

5. 종합적인 데이터 보조언어 규칙
시스템은 적어도 하나의 관계형 언어를 지원하되, 그 관계형 언어는 선형 문법을 가지고, 대화형으로도, 애플리케이션 프로그램 안에서도 이용될 수 있으며, 데이터 정의 동작과 뷰, 데이터 조작 동작, 보안과 무결성 제약조건, 트랜잭션 관리 동작을 지원하는 언어여야한다

6. 뷰 갱신 규칙
이론적으로 갱신 가능한 모든 뷰는 시스템에 의한 갱신이 가능해야 한다

7. 고급 삽입, 갱신, 제거
시스템은 집합에 대해 한 번에 삽입, 갱신, 제거 동작을 지원하여, 데이터 베이스 내의 여러 개의 행, 테이블에서 나온 데이터로 생성한 집합 내에서 다시 데이터를 획득할 수 있도록 해야한다.

8. 물리적 데이터 독립성
물리적 레벨에서 변경이 일어나도, 그 구조에 기반한 애플리케이션은 변경되어서는 안된다.

9. 논리적 데이터 독립성
논리적 레벨(테이블, 열, 행)에서 변경이 일어나도, 그 구조에 기반한 애플케이션은 변경되어서는 안된다.

10. 무결성 독립성
무결성 제약조건들은 데이터베이스 카탈로그에 저장되어야하며, 애플리케이션 프로그램들과는 별도로 규정되어, 애플리케이션에 영향을 주지 않고 이를 변경하는 것이 가능해야 한다

11. 분산 독립성
여러 장소에 대한 데이터베이스의 분산 문제는 데이터베이스의 사용자에게 영향을 주지 않아야하며, 분산된 데이터가 재배치될 때에도 기존 데이터베이스의 동작은 유지되어야 한다.

12. 무전복 규칙
시스템이 저급 인터페이스를 제공한다면, 이는 시스템을 파괴하는 데에 쓰여서는 안된다.


RDBMS는 Table의 묶음 형식으로 데이터를 관리하고, 이를 조작하는 관계 연산자를 제공한다. 실제 구현된 RDMS들은 Codd’s 12 rules를 모두 따르지는 않으며, 최소한 앞의 두 조건을 만족한다. 이 때 테이블을 조작하는 관계 연산자로, SQL(Structured Query Language)라는 쿼리 언어를 사용한다.

아래와 같이 학생의 정보를 담은 학생 명부에서 우리는 테이블에 여러 정보를 담고, 각 테이블의 정보를 사용할 때, 학번이라는 학생 고유의 키를 참조하여 사용한다

Student Number Name Birth Phone
20211234 student1 01.01.01 010-1111-1111
20211234 student2 01.01.02 010-2222-2222

SQL

구조화된 형태를 가지는 언어로, 웹 어플리케이션이 DBMS와 상호작용할 때 사용된다. 사용목적과 행위에 따라 다양한 구조가 존재한다.

Example Description
DDL
(Data Definition Language)
데이터를 정의하기 위한 언어로, 데이터를 저장하기 위한 스키마, 데이터베이스의 생성, 수정, 삭제하는 등의 행위를 수행
DML
(Data Manipulation Language)
데이터를 조작하기 위한 언어로, 데이터베이스 내의 데이터를 조회, 저장, 수정, 삭제하는 등의 행위를 수행
DCL
(Data Control Language)
데이터베이스의 접근 권한을 설정하는 언어로, 데이터베이스 내에 이용자의 권한을 부여하기 위한 GRANT, 권한을 박탈하는 REVOKE가 대표적이다

DDL

RDBMS의 기본적인 구조는 데이터베이스 -> 테이블 -> 데이터구조 이다. 데이터를 다루기 위해 데이터베이스와 테이블을 생성해야하며, DDL을 사용해야한다. DDL의 CREATE명령을 사용하여 새로운 데이터베이스 또는 테이블을 생성할 수 있다. 명령어가 수행되면 이전 상태로 복귀할 수 없다

DDL Description
CREATE 데이터베이스 객체 생성
ALTER 객체 속성 변경
RENAME 데이터베이스 객체 이름 변경
DROP 데이터베이스 내 객체 삭제
TRUNCATE 테이블 내 테이블 삭제
데이터 베이스 생성
CREATE DATABASE Dreamhack;
테이블 생성
USE Dreamhack;
# Board 이름의 테이블 생성
CREATE TABLE Board(
	idx INT AUTO_INCREMENT, # 자동으로 1 늘리며 설정
	boardTitle VARCHAR(100) NOT NULL, # not null : 비어 있는 상태를 허용하지 않는다 (입력 필수)
	boardContent VARCHAR(2000) NOT NULL,
	PRIMARY KEY(idx) # primary key : 테이블의 레코드를 고유하게 식별하기 위한 
);

DML

생성된 테이블에 데이터를 추가하기 위해 DML을 사용한다. TCL을 사용하면 실행 전 상태로 복귀 가능하다

DML Description
SELECT 테이블 내 데이터 조회
INSERT 테이블 데이터 생성
DELETE 테이블 데이터 삭제
UPDATE 테이블 데이터 변경
INSERT
INSERT INTO 
  Board(boardTitle, boardContent, createdDate) 
Values(
  'Hello', 
  'World !',
  Now()
);
SELECT
SELECT 
  boardTitle, boardContent
FROM
  Board
Where
  idx=1;
UPDATE
UPDATE Board SET boardContent='DreamHack!' 
  Where idx=1;

DCL

관리자가 사용하는 언어로 여러 사용자가 데이터를 공유할 수 있도록 병행 제어를 수행하며, 사용자별로 데이터베이스에 접근할 수 있는 권한을 부여하거나 회수하여 데이터 보안을 유지한다

DCL Description
GRANT 권한 부여
REVOKE 권한 박탈
ROLLBACK 트랜젝션 실행 취소

TCL (Transaction Control Language)

TCL Description
COMMIT 변경 사항이 물리적 디스크에 저장되며, 실행 후 이전 상태로 복구할 수 없다
ROLLBACK 이미 수행했던 모든 작업을 취소하고 원래 상태로 복구하며, 수행되는 모든 작업은 메모리상에서 이루어지기에 복구가 가능하다
SAVEPOINT 트랜잭션의 규모가 크거나 복잡할 경우 사용되며, 특정 지점을 정의하여 해당 지점부터 다시 시작할 수 있도록 한다. 여러 개의 savepoint를 지정할 수 있다