[Dreamhack] SQL Injection_1

Peroro·2023년 1월 3일
0

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

  • SQL Injection은 애플리케이션 내부에서 사용하는 데이터베이스의 데이터를 조작하는 기법 특정 쿼리를 실행했을 때 쿼리의 실행 결과가 애플리케이션에서 보여지지 않는다면 공격자 입장에서는 데이터 베이스의 정보를 추측하기 어려움. 공격자는 애플리케이션에 보여지는 결과에 따라 참과 거짓을 구분하여 공격을 수행할 수 있음.

Logic 이용 공격

  • UNION을 사용하면, 두개의 SELECT 구문의 결과를 반환하므로 참을 반환할 수 있음.

비교구문을 이용한 사용 공격

  • SQL에서는 IF문을 사용해 비교 구문을 만들 수 있음.
    substr 함수는 첫번째 인자로 전달된 문자열을 두번째 인자로 전달된 위치에서 시작해 세번째 인자로 전달된 문자 수 만큼 반환.

  • Blind SQL Injection Advaced

아래와 같은 방법을 사용하는 이유: 수많은 쿼리를 보내게 되면 해당 ip가 차단될 수도 있고, 비효율적. 효율적으로 SQL Injection을 실행하기 위해 아래와 같은 방법을 시도.

Binary Search(이진탐색): 이미 정렬된 리스트에서 임의의 값을 효율적으로 찾기 위한 알고리즘.

  1. 범위 지정: 0부터 100사이의 범위 내에 한 숫자만이 정답일 때 범위의 중간 값(50)을 지정합니다.
  2. 범위 조절: 정답이 50보다 큰 값인지 확인합니다. 큰 값이라면 범위 51~100으로 조절하고, 아니라면 0~49로 조절하여 검색 범위를 좁혀나감. 이 과정을 반복하다보면 범위를 크게 좁힐 수 있고, 최종적으로 정답을 찾아낼 수 있음.

Binary search를 이용한 공격

  • Blind SQL Injection에서 사용한 substr 함수의 반환값을 비교하여 패스워드를 알아낼 수 있음.

  • bit 연산: ASCII는 0부터 127 범위의 문자를 표현할 수 있으며 이는 곧 7개의 비트를 통해 하나의 문자를 나타낼 수 있다는 것을 의미. 하나의 비트는 0과 1로 이뤄져 있음. 이 특징을 이용해 7개의 비트에 대해 1인지 비교하면 총 7번의 쿼리로 임의 데이터의 한 바이트를 알아낼 수 있음.

이때 MYSQL에서는 숫자를 비트 형태로 변환하는 bin이라는 함수를 제공.

  • 공부하면서 재밌었던 점: Blind SQL injection에서 이진 탐색과 bit 연산을 통해서 계산량을 줄였다는 점이 재밌었다.
  • 알게된 점: 아직 SQL Injection이 익숙하지 않다. SQL문을 개인적으로 어려워했던 게 여기서 약점이 되었던것 같다. 좀 더 보완이 필요한 것 같다.
profile
오늘 공부한 것을 올리는 공간

0개의 댓글