ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • SQL - injection
    CS 지식/데이터베이스(Database) 2023. 4. 19. 11:44

    SQL injection

    해커에 의해 조작된 SQL 구문이 데이터베이스에 그대로 전달되어 비정상적인 DB 명령을 실행시키는 공격 기법

     

    아래 2 조건을 충족해야 SQL injection 공격 가능

    • 웹 애플리케이션이 DB와 연동되어 있다.
    • 외부 입력값이 DB 쿼리문으로 사용된다. 

     

    SQL injection 공격 목적 및 영향

    1. 인증 우회 - 로그인을 우회하여 인증 획득

     

    2. DB 데이터 조작 및 유출

     

    3. 시스템 명령어 실행

     

     

    SQL injection 공격 유형

    1. (일반적인) SQL injection

      1) 쿼리 조건 무력화 (Where 구문 우회)

         [1] 주석을 의도적으로 삽입 
    UserId : admin'--
    Password: 아무거나
    
    => Select * From Users Where UserID = 'admin'-- And Password = '아무거나'

               => Where 조건을 무력화시킬 수 있음.

     

    UserId : admin' ; DELETE From Users--
    Password: 아무거나
    
    => Select * From Users Where UserID = 'admin' ; DELETE From Users -- And Password='아무거나'

              => 테이블을 삭제하거나 수정하는 등 직접 데이터베이스의 내용을 조작할 수도 있음. 

     

     

            [2] 항상 참이 되도록 Boolean 식 구성

    UserId : test
    Password: 1234' or '1'='1
    
    => Select * From Users Where UserID = 'test' And Password = '1234' or '1'='1'

              => test라는 계정이 없어도, password가 틀리더라도 인증을 통과하게 됨. 

     

     

         2) 고의적 에러 유발 후 정보 획득

             쿼리 수행 중 오류가 발생하면 DB 오류를 그대로 브라우저에 출력하고는 하는데 이 오류 정보를 통해 DB의 

             스키마 정보나 데이터가 유출될 수 있다.

     

             ex) UNION => column의 개수가 일치해야 함.
                   column의 개수가 일치해서 오류가 메시지가 뜨지 않을 때까지 column의 개수를 증가시켜 가면서 테스트해서
                   column의 개수를 알아냄.
                   이후 table list 조회, table 내의 데이터 획득도 진행함. 

     

     

         3)  시스템 명령어 실행

              UserID 값에 ;(콜론)으로 xp_cmdshell 실행 구문을 연결하고 이후 구문은 주석처리를 한다. 
              이 계정에 유효한 권한이 주어져 있다면 어떤 시스템 명령도 내릴 수 있다. 

     

     

     

      2. Blind SQL injection

          만약 공격하는 대상 웹페이지가 어떠한 오류도 출력하지 않고 쿼리 결과 리스트도 제공하지 않는다면 

          해킹에 성공하기 어렵다. 이럴 때 활용할 수 있는 방법이 Blind SQL injection이다.

     

          => 쿼리 결과의 참/거짓 값을 통해 DB을 유출하는 기법
                ex) 참과 거짓을 통해 ASCII로 변환해서 대소비교를 하는 방식으로 password도 알아낼 수 있음.

     

     

          1) Boolean - based Blind 공격

    제목검색 : hello' AND 1=1-- (유효한 검색단어와 항상 참이되는 조건 부여)
    
    => 게시판 검색 됨 : True라는 뜻
    
    
    -----
    제목검색 : hello' AND 1=2-- (유효한 검색단어와 항상 거짓이 되는 조건 부여)
    
    => 게시물 검색 안됨 : False라는 뜻

     

               => 게시판 검색 기능을 참/거짓을 반환하는 요소로 활용 가능. 

                     AND 조건으로 해커가 알고 싶은 쿼리 조건을 삽입해서 그 결과로부터 정보 유출 가능 

     

     

          2) Time - based Blind 공격
              응답 결과가 항상 동일하여 응답 결과만으로는 참/거짓을 판별할 수 없는 경우.
              시간을 지연시키는 쿼리를 주입하여 응답 시간의 차이로 참/거짓 판별 가능. 

     

               => 5초 지연을 요청한 경우 응답이 5초간 지연되면 True라는 뜻. 
                    응답이 즉시 이루어진 경우에는 False라는 뜻.  

     

     

     

     

    SQL injection 취약성 판단

    가장 간단) 사용자 입력값에 '(싱글쿼터)를 주입했을 때, 사이트가 오류를 내뱉으면 SQL injection에 취약하다는 뜻. 

     

     

     

    SQL injection 대응 방안

    https://m.mkexdev.net/427

    (추가)

    1. Prepared Statement 활용(with Parameterized Queries)

    Parameterized Query는 먼저 SQL code를 모두 define 한 후에 each parameter를 query에 나중에 전달한다. 

    예를 들어 해커가 userId에 tom' or '1'='1을 입력하면 username이 literally tom' or '1'='1

    인 것이 있는지 확인하는 방식으로 동작한다. 

    쿼리 parsing을 한 후 입력값을 binding

    입력값은 단순 문자열로 인식되어 query에 전혀 영향을 끼치지 못함.

    동적 쿼리를 정적쿼리처럼 사용하는 기법.

    쿼리 구문에서 외부 입력값이 SQL 구문의 구조를 변경하지 못하도록 정적구조로 처리하는 방식.

     

    2. Stored procedure 사용

    stored procedure는 사용하고자 하는 query에 미리 형식을 지정하는 것을 말함. 

    지정된 형식의 data가 아니면 query가 실행되지 X.

     

     

     

     

     

     

    Further Topics

    • XSS
    • Prepared Statement 구동 방식
    • Prepared Statement와 Stored procedure 차이점 비교 분석

     

    실습

    • SQL injection lab

     

    Reference

Designed by Tistory.