ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [DB] SQL 인젝션 (SQL Injection )
    CS 2021. 7. 10. 20:09
    ✔️SQL 인젝션(SQL Injection)이란?
    보안상의 취약점을 의도적으로 이용하여 악의적 SQL문을 실행되게 함으로써 데이터베이스를 비정상적으로 조작하는 코드 인젝션 공격 방법중 하나.

    *코드 인젝션의 종류에는 SQL 인젝션, HTML 스크립트 삽입, evaluation 취약점, 객체 삽입, 원격 파일 삽입, 셸 삽입 등이 있다.

     

     

    1. Error Based SQL Injection

    • 논리적 에러를 이용한 인젝션 방법
    • 가장 많이 쓰이고, 대중적
    • 공격 방법
      보통 로그인을 할때 아래와 같은 쿼리문으로 인증한다.
      SELECT * FROM Users WHERE id = 'aaa' AND password = 'qwer1234@'
      이때 id에 admin, 패스워드에 password' OR 1=1 --를 입력하면
      SELECT * FROM Users WHERE id = 'admin' AND password = 'password' OR 1=1 -- ....
      OR뒤의 값이 항상 참이고, 그 후의 쿼리문은 주석처리가 되므로 비밀번호를 입력하지 않고도 로그인 할 수 있게 된다.

    2. Union based SQL Injection

    • 원래의 요청에 추가 쿼리를 삽입하여 정보를 얻어냄
    • 2개 이상의 쿼리를 요청하여 하나의 테이블로 결과를 얻는다.
    • 단, 2개의 테이블이 동일한 필드 개수데이터 타입을 가져야 하므로 사전공격을 통해 미리 알아놔야 함. 방법
    • 공격 방법
      게시글을 검색할때 아래와 같은 쿼리문을 입력한다.
      SELECT * FROM Board WHERE title LIKE '%INPUT%' OR contents '%INPUT%'
      input 에 'UNION SELECT null,id,password FROM Users-- 를 넣어주게 되면 (이때 Board테이블의 칼럼 갯수에 맞추어 null이라는 빈 컬럼을 추가한 것) Board 테이블의 id, password를 알아낼 수 있다.

    3. Blind based SQL Injection

    • DB로부터 특정 데이터 전달받지 않고, 참 거짓만 알 수 있을 때 사용
    • 오류 메세지가 출력되지 않는 사이트에서 위의 기법을 사용할 수 없을 때, 취햑점 여부를 판단
    • 서버가 응답하는 로그인 성공과 실패 메시지를 이용하여 DB 테이블 정보 등을 추출할 수 있다
    • 공격 방법
      테이블 명을 알고 싶을때, input에
      ' and 1=1 --'and 1=2 --의 넣어보고 참일 때와 거짓일 때의 출력값을 알아낸다. 그리고
      'and ASCII(SUBSTR(SELECT name FROM Table)name from Table limit 0,1),1,1)) <67
      과 같은 방식으로 참이 될 때까지 숫자를 변경해가며 테이블 명을 한 글자씩 알아낼 수 있다. 이와 같은 방식으로 컬럼 수,테이블 이름 등을 알 수 있다.
      SLEEP, WATI, BENCHMARK등을 이용해 참과 거짓을 알아내는 방법도 있다.

    4. Stored Procedure based SQL Injection

    • Stored Procedure는 일련의 쿼리를 하나의 함수처럼 실행하기 위한 쿼리의 집합
    • SQL Injection 의 취약점으로 인해 웹에서 Stored Procedure에 대한 접근 권한 가져서 실행 가능
    • 시스템 권한을 획득해야 하므로 공격 난이도가 높으나 성공한다면 서버에 직접적인 피해를 입힐 수 있다.

     

     

    🚨 SQL 인젝션 대응 방안

    1. 입력값 검증
      • 화이트리스트 방식으로 지정된 형식의 문자만 검증
      • 특수문자 등의 에러 발생 유무 확인
      • db_name()으로 DB명 추출 여부 확인
    1. SQL 오류 발생시 에러 메세지 표시하지 않음
      • 별도로 처리해주지 않을 경우 에러가 발생한 쿼리문과 함께 에러에 관한 내용을 반환함. 
        이 때 테이블 명, 컬럼명, 쿼리문이 노출 될 수 있기 때문에 메세지가 표시되지 않도록 처리해 주어야 함.
    2. 저장 프로시저 사용
      • 사용하고자 하는 쿼리에 미리 형식을 지정하여 지정된 형식의 데이터가 아니면 쿼리문이 실행되지 않도록 함.
    3. 서버 보안
      • 최소 권한 유저로 DB운영
      • 목적에 따라 쿼리 권한 수정
      • 신뢰할 수 있는 네트워크, 서버에 대해서만 접근 허용
      • 웹 방화벽 사용

     

     

     

    참고

    https://ko.wikipedia.org/wiki/%EC%BD%94%EB%93%9C_%EC%9D%B8%EC%A0%9D%EC%85%98
    https://ko.wikipedia.org/wiki/SQL_%EC%82%BD%EC%9E%85
    https://dailylearn.tistory.com/14
    https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=shackerz&logNo=220449932926
    http://blog.plura.io/?p=6056

    댓글

Maybe a whole cake ? 🎂 HAHA!