EYEN

[드림핵 웹해킹] STAGE 6 : SQL INJECTION 본문

Wargame/Web

[드림핵 웹해킹] STAGE 6 : SQL INJECTION

EYEN 2022. 10. 31. 10:54

1. 데이터베이스

정보를 기록하기 위함.

데이터베이스를 관리하는 애플리케이션을 DataBase Management System (DBMS) 이라고 한다.

2. DataBase Management System

  1. DBMS

데이터베이스에 정보를 기록, 수정, 삭제하는 역할

다수의 사람이 동시에 데이터베이스에 접근할 수 있고, 복잡한 특정 조건의 데이터만을 조회할 수 있다(검색기능)

 

3. Relational DBMS

  1. RDBMS(Relational DataBase Management System)
  • 표의 묶음 형식으로 데이터를 관리
  • SQL(**Structured Query Language)**을 사용
  1. SQL(Structured Query Language)
  • RDBMS의 데이터를 정의,질의,수정하기 위해 고안된 언어
  • 구조화된 형태를 가지고 웹 어플리케이션이 DBMS와 상호작용할 때 사용
  •  
언어 데이터베이스의 접근 권한 등의 설정 GRANT: 이용자의 권한을 부여 REVOKE: 이용자의 권한을 박탈
DDL(Data Definition Language) 데이터를 정의 데이터를 저장하기 위한 스키마,데이터베이스의 생성/수정/삭제
DML(Data Manipulation Language) 데이터를 조작 실제 데이터베이스 내에 존재하는 데이터를 조회/저장/수정/삭제
DCL(Data Control Language) 데이터베이스의 접근 권한 등의 설정 GRANT: 이용자의 권한을 부여 REVOKE: 이용자의 권한을 박탈
  1. SQL 예시

데이터베이스→테이블→데이터 구조

웹 어플리케이션이 SQL을 이용해 RDBMS에서 데이터를 관리하는 기본적인 구조

데이터를 다루기 위해 데이터베이스와 테이블을 생성하고 DDL을 사용

DDL의 CREATE 명령을 사용해 새로운 데이터베이스 또는 테이블을 생성

데이터베이스 생성

Dreamhack이라는 데이터베이스를 생성하는 쿼리문입니다.

CREATE DATABASE Dreamhack;

테이블 생성

앞서 생성한 데이터베이스에 Board 테이블을 생성하는 쿼리문입니다.

USE Dreamhack;
# Board 이름의 테이블 생성
CREATE TABLE Board(
	idx INT AUTO_INCREMENT,
	boardTitle VARCHAR(100) NOT NULL,
	boardContent VARCHAR(2000) NOT NULL,
	PRIMARY KEY(idx)
);

생성된 테이블에 데이터를 추가하기 위해 DML을 사용합니다. 다음은 새로운 데이터를 생성하는 INSERT, 데이터를 조회하는 SELECT, 그리고 데이터를 수정하는 UPDATE의 예시입니다.

테이블 데이터 생성

Board 테이블에 데이터를 삽입하는 쿼리문입니다.

INSERT INTO
   Board(boardTitle, boardContent, createdDate)
 Values(
  'Hello',
  'World !',
  Now()
);

테이블 데이터 조회

Board 테이블의 데이터를 조회하는 쿼리문입니다.

SELECT
   boardTitle, boardContent
FROM
  Board
Where
  idx=1;

테이블 데이터 변경

Board 테이블의 컬럼 값을 변경하는 쿼리문입니다.

UPDATE Board SET boardContent='DreamHack!' 
  Where idx=1;

4. SQL Injection

SQL: DBMS에 데이터를 질의하는 언어.

로그인 기능 쿼리: 로그인할 때 ID/PW, 게시판에 글을 쓸 때 제목과 내용이 SQL구문에 포함되어 요청하는 경우


/*
아래 쿼리 질의는 다음과 같은 의미를 가지고 있습니다.
- SELECT: 조회 명령어
- *: 테이블의 모든 컬럼 조회
- FROM accounts: accounts 테이블 에서 데이터를 조회할 것이라고 지정
- WHERE user_id='dreamhack' and user_pw='password': user_id 컬럼이 dreamhack이고, user_pw 컬럼이 password인 데이터로 범위 지정
즉, 이를 해석하면 DBMS에 저장된 accounts 테이블에서 이용자의 아이디가 dreamhack이고, 비밀번호가 password인 데이터를 조회
*/

SELECT * FROM accounts WHERE user_id='dreamhack' and user_pw='password'

이용자가 SQL구문에 임의의 문자열을 삽입하는 행위를 SQL Injection이라고 하고, 이용자가 쿼리문을 조작할 수 있으면 인증을 우회하거나 데이터베이스의 정보를 유출할 수 있다.

SQL Injection으로 조작한 쿼리 : 이 쿼리로 질의하면 DBMS는 비밀번호를 검증하지 않고 계정의 정보를 반환한다. 그래서 이용자는 admin 계정으로 로그인할 수 있다.


/*아래 쿼리 질의는 다음과 같은 의미를 가지고 있습니다.
- SELECT: 조회 명령어
- *: 테이블의 모든 컬럼 조회
- FROM accounts: accounts 테이블 에서 데이터를 조회할 것이라고 지정
- WHERE user_id='admin': user_id 컬럼이 admin인 데이터로 범위 지정
즉, 이를 해석하면 DBMS에 저장된 accounts 테이블에서 이용자의 아이디가 admin인 데이터를 조회*/

SELECT * FROM accounts WHERE user_id='admin'

admin의 upw를 알아내는 공격 쿼리문

union select pass from user_table where uid=’admin’—