Database: 컴퓨터가 정보를 기록하는 데 사용하는 것
DBMS는 관계형과 비관계형을 기준으로 분류
1. RDBMS (Relational DataBase Management System)
(MySQL, MariaDB, PostgreSQL, SQLite)
-행과 열의 집합으로 구성된 테이블의 묶음 형식으로 데이터를 관리
-테이블 형식의 데이터를 조작할 수 있는 관계 연산자 제공
-RDBMS에서 관계연산자는 Structured Query Language(SQL)이라는 쿼리 언어를 사용하고, 쿼리를 통해 테이블 형식의 데이터 조작
2.비관계형 DBMS
(MongoDB, CouchDB, Redis)
-Not Only SQL의 줄임말인 NoSQL이라고 불림
-거대한 Map으로서 테이블 형식이 아닌 키-값 (Key-Value) 형태로 값 저장
-쿼리 처리 시 데이터를 파싱 후 연산
DML을 중심으로 보는 이유: CRUD는 SQL 문법에서 가장 많이 쓰이며, SQL Injection과도 직접적인 연관
예) 입학년도와 학생이름이 열에 포함되어 있는 "전교생" 이라는 table 생성
CREATE TABLE 전교생 (입학년도 int, 학생이름 char);
예) "전교생"이라는 테이블에 이름이 ‘홍길동’인 2022년도에 입학한 학생 추가
INSERT INTO 전교생 VALUES ('2022', '홍길동');
예) "전교생"이라는 테이블에서 2022년도에 입학한 학생의 전체 정보 조회
SELECT * FROM 전교생 WHERE 입학년도=2022;
예) "전교생"이라는 테이블에서 2020년도에 입학한 학생의 평균 학점 조회
SELECT avg(grades) FROM 전교생 WHERE 입학년도=2020;
예) "전교생"이라는 테이블에서 2022년도에 입학한 학생 중 이름이 ‘홍길동’인 학생의 평균 학점을 4.3으로 변경
UPDATE 전교생 SET grades=4.3 WHERE 학생이름=’홍길동’
AND 입학년도=2022;
예) "전교생"이라는 테이블에서 이름이 '홍길동'인 학생 삭제
DELETE FROM 전교생 WHERE 학생이름=’홍길동’;
인젝션(Injection): 주입 공격. 즉, 이용자의 입력값이 애플리케이션의 처리 과정에서 구조나 문법적인 데이터로 해석되어 발생하는 취약점
논리적 에러를 이용한 SQL Injection
예) SQL Injection Based on 1=1 is Always True
SELECT * FROM Users WHERE UserId = '' OR 1=1 -- ' AND password =
OR 1=1 구문을 이용해 WHERE 절을 모두 참으로 만들고, -- 를 넣어줌으로써 뒤의 구문을 모두 주석 처리 해서 원하는 정보를 얻을 수 있다.
싱글쿼터(‘)
SQL에서 문자와 숫자 값은 싱글쿼터로 묶여서 입력되어야 한다.
예) Question #1. dreamhack 계정의 비밀번호 첫 번째 글자는 'x' 인가요?
-Answer. 아닙니다
Question #2. dreamhack 계정의 비밀번호 첫 번째 글자는 'p' 인가요?
-Answer. 맞습니다 (첫 번째 글자 = p)
Question #3. dreamhack 계정의 비밀번호 두 번째 글자는 'y' 인가요?
-Answer. 아닙니다.
Question #4. dreamhack 계정의 비밀번호 두 번째 글자는 'a'인가요?
-Answer. 맞습니다. (두 번째 글자 = a)
이렇게 스무고개 게임이나 up-down 게임처럼 질문을 하고 이에 대한 답을 얻어서 데이터베이스의 내용을 알아낼 수 있다.
Blind SQL Injection
1. Boolean-based
예) 웹사이트 검색기능
Case 1
외부 입력값
결과
Case 2
외부 입력값
결과
=> 동일한 검색어(hello)를 검색하지만 뒤에 붙는 조건의 참/거짓에 따라 검색 결과가 달라짐
2. Time-based