SQL Injection

.·2022년 10월 30일
0

Computer Science

목록 보기
75/81

정의

악의적인 사용자가 보안상의 취약점을 이용하여 임의의 SQL문을 주입하고 실행되게 해서 데이터베이스가 비정상적인 동작을 하도록 조작하는 행위

특징

  • OWASP Top10 중 첫번째
  • 가장 많이 빈번하게 일어나는 공격
  • 공격이 쉽고 성공할 경우 큰 피해를 입힐 수 있는 기법
  • DB를 공격한다.
    • 웹 서버의 정보가 모두 털릴 수 있을 정도로 치명적이다.

공격 방식/기법

  1. 로그인 창, 검색창 등 입력이 가능한 곳에 SQL문을 넣어 입력값을 조작한다.
  2. 입력값에 따른 결과로 로그인 우회/DB 데이터 추출/시스템 명령 수행 등의 작업을 한다.

Error based SQL Injection

특징

  • 고의로 SQL문에 에러를 발생시키고
  • 에러 메세지를 통해 쿼리문 구성과 DB 테이블명, 컬럼명, 데이터 내용까지 추측한다.
  • 최근 웹서버는 이러한 공격을 막기 위해 에러가 발생하더라도 아무 메세지를 띄우지 않는 경우가 많다.

예시

  • 논리적인 에러를 이용한 SQL Injection
    1. SELECT문

      SELECT * FROM users WHERE id = '아이디' AND password = '패스워드';

      위와 같은 쿼리문이 존재한다.

      아이디에 ' OR 1=1 --을 주입

      SELECT * FROM users WHERE id = '' OR 1=1 --' AND password = '패스워드';
      // 아래와 동일 쿼리, 1=1은 항상 참이기 때문에
      SELECT * FROM users;

      1=1은 항상 참이기 때문에 where절을 참으로 만들어준다.

      users 테이블의 모든 정보를 조회할 수 있고 얻은 계정으로 로그인에 성공한다.

      보통 관리자 계정을 맨 처음 만들기 때문에 첫번째 레코드의 해당 계정으로 관리자의 권한을 이용해서 또 다른 피해를 발생시킬 수 있다.

    2. INSERT문

      INSERT INTO students (NAME) VALUES ('학생 이름');

      '학생 이름' 자리에 Robert');DROP TABLE students;--를 넣을 경우

      INSERT INTO students (NAME) VALUES ('Robert');
      DROP TABLE students;
      --');

      이렇게 학생 테이블을 삭제하는 명령문이 완성된다.

Blind SQL Injection

Boolean based

특징

  • 다른 SQL Injection을 이용해서 모든 튜플 조회가 가능해도 결과 값을 확인할 수 없을 경우
    • 쿼리의 값을 서버의 반응만으로 데이터를 얻어내는 기술
  • Blind: 보이지 않는/가려진
    • 특정 쿼리문으로 인한 결과가 참, 거짓인 것만 알고, 결과를 서로 비교할 수 있는 경우
    • ex> 로그인 성공 메세지, 실패 메세지
  • 요즘은 에러 메세지를 출력하지 않게 웹서버를 구축하기 때문에 웬만한 SQL 공격을 Blind 방식으로 진행한다.

예시

  • SQL Injection으로 얻은 결과값으로 특정 과정을 반복해서 원하는 정보를 얻어낸다.
    • 많은 비교 과정이 필요하기 때문에 매크로를 사용해서 공격한다.
  • Time based SQL Injection
    • 응답의 결과가 항상 동일해서 원하는 값을 판별할 수 없는 경우
    • 시간을 지연시키는 쿼리를 인젝션해서 응답 시간의 차이로 참과 거짓 여부를 판별한다.

Union SQL Injection

여러 개의 SQL문을 합쳐서 하나의 SQL문으로 만들어주는 방법

특징

  • union 쿼리 사용
    • 쿼리 두 개의 컬럼 수와 데이터 형이 같아야 한다.
  • 공격 쿼리와 다른 쿼리를 결합해서 정보를 알아낼 때 사용한다.

방식

  1. UNION
    1. 중복 값을 제외한다.
  2. UNION ALL
    1. 중복 값을 제외하지 않는다.

예시

  • select의 경우 테이블의 컬렴명을 컬럼 순서로 대신할 수 있는데 이 점을 이용해서 컬럼 수를 확인할 수 있다.
    SELECT * FROM users WHERE id = '아이디' AND password = '패스워드';
    • 입력값
      - 아이디: test' UNION SELECT 1,1 --
      - 패스워드: hello

      SELECT * FROM users WHERE id = 'test' UNION SELECT 1,1 -- AND password = ('hello');

      users 테이블의 모든 튜플들이 조회된다.

방어 기법

입력값 검증

  • 서버 단에서 화이트리스트 기반으로 검증

취약한 방법

  • 블랙리스트 기반
    • 수많은 차단 리스트를 등록해야 하고, 하나라도 빠진다면 공격에 성공하게 된다.
  • 공백 치환
    • 공백 대신 공격 키워드와 의미 없는 단어로 치환하기

Prepared Statement 구문 사용

  • 사용자의 입력값이 데이터베이스의 파라미터로 들어가기 전에 DBMS가 미리 컴파일한 후 실행하지 않고 대기한다.
  • 사용자의 입력을 단순 문자열로 인식한다.
    • 공격 쿼리가 들어가도 의미 없는 문자열이기 때문에 의도대로 작동하지 않는다.

Error Message 노출 금지

  • 에러 발생시 따로 처리르 해주지 않는다면 에러가 발생한 쿼리문과 관련 내용을 반환한다.
  • 이때 테이블명, 컬럼명도 같이 노출될 수 있다.
  • 오류 발생 시 보여줄 페이지나 메세지 박스롤 띄운다.

웹 방화벽 사용

  • 웹 공격 방어에 특화되어 있음.

출처

0개의 댓글