[DataBase] SQL 인젝션이란 ?

GonnabeAlright·2021년 11월 27일
1
post-thumbnail

SQL 인젝션이란 ?

SQL 인젝션은 웹 사이트의 보안상 허점을 이용해 특정 SQL 쿼리문을 전송하여 공격자가 원하는 데이터베이스의 중요한 정보를 가져오는 해킹 기법을 말한다. 대부분 클라이언트가 입력한 데이터를 제대로 필터링하지 못하는 경우에 발생한다. 공격의 쉬운 난이도에 비해 피해가 상당하기 때문에 보안 위협 1순위로 불릴만큼 중요한 기법이다.

진행 시나리오

각 클라이언트(회원)들은 자격증 번호를 조회할 수 있는 시스템인데 기본적인 SQL 진행은 anjinma라는 클라이언트가 '자격증 번호 조회'를 클릭하여 anjinma라는 이름이 웹 서버에 들어가고 DB에 입력한 값이 있는지 확인 후 존재한다면 자격증 DB를 출력해준다. 여기서 이름이 blackhat이라는 클라이언트가 자신의 blackhat을 조회해야 하는데 SQL 구문을 변경하여 anjinma라는 클라이언트의 자격증 번호를 조회한다.

예를 들어서 '자격증 번호 조회'를 클릭하면 url이 http://license12345.com/mysearch?=anjinma가 된다고 가정하자. 그럼 공격자의 조회는 http://license12345.com/mysearch?=blackhat 이렇게 된다. 여기서 공격자는 뒤에 blackhat을 anjinma로 변경해야 하는데 그냥 변경으로는 현재 로그인된 자신과는 다르기 때문에 웹서버에서 인정하지 않는다. 그러므로 특정 쿼리문을 넣어준다. anjinma' or '1'=1 이렇게 넣게 되면 구문 1과 1은 같다는 참이므로 or 진행으로 해당 구문은 참이되어 결과를 출력해준다.

SQL 인젝션의 공격 범위는 다양하다.

  • bypass
  • data access
  • content change
  • db delete

SQL 인젝션의 종류와 공격 방법

Error based SQL Injection - 논리적 에러를 이용한 SQL 인젝션
앞서 예를 들어 설명한 기법이며 해당 기법으로 SQL 인젝션에 대한 기본을 설명하는게 일반적이다.

[로그인 예]

SELECT * FROM client WHERE name='anjinma' and password='12345';

SELECT * FROM client WHERE name='anjinma' and password=' or '1'=1

' or '1' = 1를 넣어서 1과 1이 같으면 참이므로 1 = 1참이다. or 은 앞에 값과 뒤에 값 중 하나라도 참이면 참이므로 이 구문은 참이 되어 로그인에 성공하게 된다.

UNION based SQL Injection = UNION 명령어를 이용한 SQL Injection

SQL UNION이란 ?

여러 개의 SQL문을 합쳐 하나의 SQL문으로 만들어주는 방법이다. UNION과 UNION ALL로 나뉘는데 중복 값을 제외하고 안하고의 차이다. UNION은 중복값을 제외하고 UNION ALL은 제외 하지 않고 전체를 합친다.

SELECT name from classa 
UNION
SELECT name from classb;

하게 되면 클래스 A와 클래스 B 이름들이 합쳐져서 출력된다. (중복된 이름을 제외하고) UNION으로 합쳐지는 두 테이블은 컬럼 갯수가 일치해야만 오류가 나지 않는다.

[외부 입력]

ID: 'test' UNION SELECT 1, 1 --
PW: anything

[실행 쿼리]

SELECT * FROM users WHERE ID = 'test' UNION SELECT 1, 1 -- AND PW = 'anything'

실행 쿼리대로 하면 users 테이블에 등록된 ID와 PW 목록을 전부 조회할 수 있게 된다.

Blind SQL Injection - Boolean based Blind SQL Injection

평번한 SQL 삽입과 같이 원하는 데이터를 가져올 쿼리를 삽입하는 기술이다. 이것은 웹에서 SQL 삽입에 취약하나 데이터베이스 메시지가 공격자에게 보이지 않을 때 사용한다. 하지만 평범한 SQL 삽입과 다른점은 평범한 SQL 삽입은 쿼리를 삽입하여 원하는 데이터를 한번에 얻어낼 수 있는 데에 비해 Blind SQL 삽입은 참과 거짓, 쿼리가 참일때와 거짓일 때의 서버의 반응만으로 데이터를 얻어내는 기술이다. 즉, 쿼리를 삽입하였을 때 쿼리의 참과 거짓에 대한 반응을 구분할 수 있을때에 사용되는 기술이다. Blind SQL 삽입은 위 두 함수를 이용하여 쿼리의 결과를 얻어 한글자씩 끊어온 값을 아스키코드로 변환시키고 임의의 숫자와 비교하여 참과 거짓을 비교하는 과정을 거쳐가며 계속 질의를 보내어 일치하는 아스키코드를 찾아낸다. 그러한 과정을 반복하여 결과들을 조합하여 원하는 정보를 얻어냄으로써 공격을 이루어지게 한다. 많은 비교과정이 필요하기 때문에 악의적인 목적을 가진 크래커들은 Blind SQL 삽입 공격을 시도할 때에 자동화된 툴을 사용하여 공격한다. 취약점이 발견된다면 순식간에 많은 정보들이 변조되거나 크래커의 손에 넘어가게 된다.

Blind SQL Injection - Time based SQL

어떤 경우에는 응답의 결과가 항상 동일하여 해당 결과만으로 참과 거짓을 판별할 수 없는 경우가 있을 수 있다. 이런 경우 시간을 지연시키는 쿼리를 주입(injection)하여 응답 시간의 차이로 참과 거짓 여부를 판별할 수 있다.

정리하면 Blind SQL 인젝션 기법은 쿼리가 참, 거짓일 때 서버의 반응만으로 데이터를 얻어낼 수 있는 공격 기법이다. 이 기법은 여러 조건에 대한 과정을 거쳐야 필요한 정보를 얻을 수 있기 때문에 코드를 짜거나 자동화 도구로 보통 공격하는게 일반적이다.

SQL 인젝션 대응방안

MySQL의 경우 mysqli_real_escape_string(); 함수를 사용하는 방법이 있다.
SQL에서 특별한 의미를 갖는 문자들을 이스케이프해서 SQL 삽입을 방지하는 방법이다.

0개의 댓글