Dreamhack SQL DML, SQL Features, Blind SQL Injection Advanced
https://dreamhack.io/lecture/courses/302
https://dreamhack.io/lecture/courses/303
https://dreamhack.io/lecture/courses/304
SQL DML(Data Manipulation Language): 데이터베이스에서 데이터를 조회, 추가, 삭제, 수정을 수행하는 구문.
SELECT문: 데이터를 조회하는 구문, 해당 문자열을 시작으로, 조회하기 위한 표현식과 컬럼에 대해 정의
FROM: 데이터를 조회할 테이블의 이름
WHERE: 조회할 데이터의 조건
ORDER BY: 조회한 결과를원하는 컬럼을 기준으로 정렬.
LIMIT: 조회한 결과에서 행의 갯수와 오프셋을 지정.
SELECT uid, title, boardcontent
FROM board
WHERE boardcontent like '%abc%'
ORDER BY uid DESC
LIMIT 5
INSERT: 데이터를 추가하는 구문
INTO: 데이터를 추가할 테이블의 이름과 컬럼을 정의.
VALUES: INTO 절에서 정의한 테이블의 칼럼에 명시한 데이터를 추가.
INSERT INTO board (title, boardcontent)
VALUES ('title 1', 'content1'), ('title 2', 'content2')
UPDATE: 데이터를 수정하는 구문
SET: 수정할 칼럼과 데이터를 정의
WHERE: 수행할 행의 조건을 정의
UPDATE board SET boardcontent = 'update content 2'
WHERE title = 'title1';
DELETE: 데이터를 삭제하는 구문
FROM: 삭제할 테이블을 정의
WHERE: 삭제할 행의 조건을 정의
SELECT * FROM UserTable UNION SELECT 'DREAMHACK', 'DREAMHACK PW';
UNION은 다수의 SELECT 구문의 결과를 결합하는 절 해당 절을 통해 다른 테이블에 접근하거나 원하는 쿼리 결과를 생성해 애플리케이션에서 처리하는 타 데이터를 조작 가능
-이전 SELECT 구문과 UNION을 사용한 구문의 실행 결과중 컬럼의 갯수가 동일해야 함.
SELECT * FROM UserTable UNION SELECT 'DREAMHACK', 'DREAMHACK PW', "Third column";
## error가 발생.
-특정 DBMS에서는 이전 SELECT 구문과 UNION을 사용한 구문의 컬럼 타입이 같아야 함.
SELECT 'ABC'
UNION SELECT 123;
## 문자열 ABC가 int형 123과 다르기 때문에 에러
서브 쿼리(subquery): 한 쿼리내에 또 다른 쿼리를 사용하는 것을 의미. 서브 쿼리를 사용하기 위해서는 쿼리 내에서 괄호 안에 구문을 삽입해야 하며, SELECT 구문만 사용할 수 있음. 공격자는 서브 쿼리를 통해 쿼리가 접근하는 테이블이 아닌 다른 테이블에 접근하거나 SELECT 구문을 사용하지 않는 쿼리문에서 SQL Injection 취약점이 발생할 때 SELECT 구문을 사용할 수 있음.
SELECT 1,2,3,(SELECT 456);
COLUMNS 절: SELECT 구문에서 컬럼 절에서 서브 쿼리를 사용할 때에는 단일 행과 단일 컬럼이 반환되도록 해야 함.
FROM 절: From 절에서 사용하는 서브 쿼리를 인라인 뷰라고 하며, 이를 다중 행과 다중 컬럼 결과를 변환할 수 있음.
WHERE 절 WHERE절에서 서브 쿼리를 사용한다면 다중행 결과를 반환하는 쿼리문을 실행할 수 있음.
Application Logic
Logic 이용 공격
비교구문을 이용한 사용 공격
아래와 같은 방법을 사용하는 이유: 수많은 쿼리를 보내게 되면 해당 ip가 차단될 수도 있고, 비효율적. 효율적으로 SQL Injection을 실행하기 위해 아래와 같은 방법을 시도.
Binary Search(이진탐색): 이미 정렬된 리스트에서 임의의 값을 효율적으로 찾기 위한 알고리즘.
Binary search를 이용한 공격
이때 MYSQL에서는 숫자를 비트 형태로 변환하는 bin이라는 함수를 제공.