SQL

Bae YuSeon·2022년 9월 19일
1

E-COPS

목록 보기
2/9
post-thumbnail

SQL

Database: 컴퓨터가 정보를 기록하는 데 사용하는 것

DBMS (Database Management System)

  • 데이터베이스에 새로운 정보를 기록하거나, 기록된 내용을 수정 및 삭제하는 역할
  • 다수의 사용자가 동시에 데이터베이스 접근 가능
  • 웹서비스의 검색 기능과 같이 복잡한 요구사항을 만족하는 데이터 조회 기능

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) 형태로 값 저장
-쿼리 처리 시 데이터를 파싱 후 연산

SQL

  • RDBMS의 데이터를 관리(정의하고 질의, 수정 등)을 하기 위해 설계된 특수 목적의 프로그래밍 언어
  • 웹 어플리케이션이 DBMS와 상호작용할 때 사용
    -자료의 검색과 관리
    -데이터 베이스 스키마 생성과 수정
    -데이터 객체 접근 조정 관리
  • 사용 목적과 행위에 따라 다양한 구조 존재
    SQL 구조
    sql구조

SQL 문법 - DML을 중심으로

DML을 중심으로 보는 이유: CRUD는 SQL 문법에서 가장 많이 쓰이며, SQL Injection과도 직접적인 연관

Create: 새로운 테이블 생성

  • CREATE TABLE table_name (
    column1 datatype,
    column2 datatype,
    column3 datatype,

    ....);

    예) 입학년도와 학생이름이 열에 포함되어 있는 "전교생" 이라는 table 생성
    CREATE TABLE 전교생 (입학년도 int, 학생이름 char);

Insert: 새로운 데이터 생성

  • INSERT INTO table_name (column1, column2, column3, ...)
    VALUES (value1, value2, value3, ...);
  • table의 모든 열에 value를 추가할 때는
    INSERT INTO table_name VALUES (value1, value2, value3, ...);

    예) "전교생"이라는 테이블에 이름이 ‘홍길동’인 2022년도에 입학한 학생 추가
    INSERT INTO 전교생 VALUES ('2022', '홍길동');

SELECT: 데이터 조회

  • SELECT column1, column2, .. FROM table_name WHERE condition;

    예) "전교생"이라는 테이블에서 2022년도에 입학한 학생의 전체 정보 조회
    SELECT * FROM 전교생 WHERE 입학년도=2022;
    예) "전교생"이라는 테이블에서 2020년도에 입학한 학생의 평균 학점 조회
    SELECT avg(grades) FROM 전교생 WHERE 입학년도=2020;

  • SELECT, FROM, WHERE 외에 또 다른 조건 설정문
    -GROUP BY: 데이터 그룹화
    -HAVING: GROUP BY에 조건을 추가할 때 사용
    -ORDER BY: 정렬

Update: 데이터 수정

  • UPDATE table_name SET column1 = value1, column2 = value2, ...
    WHERE condition;

    예) "전교생"이라는 테이블에서 2022년도에 입학한 학생 중 이름이 ‘홍길동’인 학생의 평균 학점을 4.3으로 변경
    UPDATE 전교생 SET grades=4.3 WHERE 학생이름=’홍길동’
    AND 입학년도=2022;

Delete: 데이터 삭제

  • DELETE FROM table_name WHERE condition;

    예) "전교생"이라는 테이블에서 이름이 '홍길동'인 학생 삭제
    DELETE FROM 전교생 WHERE 학생이름=’홍길동’;

SQL Injection

인젝션(Injection): 주입 공격. 즉, 이용자의 입력값이 애플리케이션의 처리 과정에서 구조나 문법적인 데이터로 해석되어 발생하는 취약점

SQL 인젝션

  • 이용자의 입력값이 SQL 구문의 일부로 사용될 경우 해커에 의해 조작된 SQL 구문이 데이터베이스에 그대로 전달되어 비정상적인 DB 명령을 실행시키는 공격 기법
  • 어플리케이션의 사용자 입력 값에 SQL 코드를 삽입 또는 추가하고, 해당 SQL 구문을 가장 마지막의 SQL 서버에서 전달하여 해석 및 실행하는 과정에서 발생하는 공격

SQL 인젝션 공격 발생 조건

  1. 데이터베이스가 연동된 웹 애플리케이션
  2. 외부의 입력값이 SQL 구문의 일부로 사용

논리적 에러를 이용한 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에서 문자와 숫자 값은 싱글쿼터로 묶여서 입력되어야 한다.

Blind SQL Injection

  • 데이터베이스 조회 후 결과를 이용자가 화면에서 직접 확인하지 못할 때 참/거짓 반환 결과로 데이터를 획득하는 공격 기법
  • 한 바이트 씩 비교하여 공격하는 방식 ⇒ 다른 공격에 비해 많은 시간 소요

예) 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
외부 입력값

  • 제목 검색: hello’ AND 1=1– (유효한 검색단어와 항상 참이 되는 조건 부여)

결과

  • 게시판이 검색됨 -> 참(true)로 간주

Case 2
외부 입력값

  • 제목 검색: hello’ AND 1=2– (유효한 검색단어와 항상 거짓이 되는 조건 부여)

결과

  • 게시판이 검색되지 않음 -> 거짓(false)로 간주

=> 동일한 검색어(hello)를 검색하지만 뒤에 붙는 조건의 참/거짓에 따라 검색 결과가 달라짐
2. Time-based

0개의 댓글

관련 채용 정보