ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • SQL Injection 취약점(2)_Error Based Injection
    Web Vulnerability 2020. 1. 27. 20:45

     

    SQL Injection 취약점(2)_Error Based Injection

     

    1. 정의

    SQL 쿼리에 고의적으로 오류를 발생시켜, 출력되는 에러의 내용을 통해 필요한 정보를 찾아낸다.

    기본적으로 '(싱글 쿼테이션) 또는 ''(더블 쿼테이션)을 이용하며, Group BY와 HAVING 등을 이용하기도 한다.

     

    2. 실습 환경

    Error Based Injection 실습을 위한 환경은 다음과 같다.

    - 웹 서버 운영체제: Windows Server 2003
    - 웹 서버 : IIS 6.0
    - 데이터베이스 : MSSQL Server 2003
    - 스크립트 언어 : ASP

     

    [그림 1] 취약점 진단을 위한 연습 사이트

     

    3. 점검 방법

     

    1) 에러 메시지를 통한 DB 정보확인

    DB에서 반환되는 에러메시지를 이용하여 DB 정보(Table, Column 등)를 확인해본다.

    입력 위치는 회원 가입 시 우편번호를 검색하는 창에서 진행한다.

     

    [그림 2] 우편번호 검색 페이지

     

    ① 검색창에 '(작은 따옴표) 입력 후, 검색을 시도한다.

    MSSQL 에러 메시지가 출력됨에 따라, Error Base SQL Injection에 취약함을 확인하였다.

    - zipcode_id 라는 컬럼 값을 확인하였다.

     

    [그림 3] Error Base SQL Injection 취약 여부 확인

    ② DB명 확인

    ' and db_name() > 1-- 입력하면, 출력되는 에러 메시지에서 DB명이 web 임을 확인하였다.

    문자열인 DB 명을 숫자형(int)으로 비교하려고 함에 따라 출력되는 에러 메시지이다.

     

    [그림 4] DB 명 확인

     

    ③ having 구문을 이용한 테이블명, 컬럼명 확인

    ' having 1=1-- 입력하면, 테이블명.컬럼명(zipcode.zipcode_id)을 확인할 수 있다.

    having 구문은 group by 절과 사용되어야 하는데, 구문 오류에 따라 출력되는 메시지이다.

    (※ 반드시 앞에 group by가 같이 쓰여야 하며, group by를 통해 동일한 데이터를 집계한 후 조건 비교한다.)

     

    [그림 5] 테이블명(zipcode), 컬럼명(zipcode_id) 확인

     

    ④ group by 절을 이용한 컬럼명 확인

    위에서 확인한 zipcode_id 컬럼명을 이용하여 두 번째 컬럼 값을 아래와 같이 확인한다.

    ' group by zipcode_id-- 입력하면, 반환되는 에러 메시지 내 두 번째 컬럼명이 zipcode 임을 알 수 있다.

     

    [그림 6] 두 번째 컬럼명(zipcode) 확인

     

    ' group by zipcode_id, zipcode-- 입력하면 아래와 같이 세 번째 컬럼명이 sido 임을 알 수 있다.

     

    [그림 7] 세 번째 컬럼명(sido) 확인

     

    위와 같은 방법으로 확인하면, zipcode 테이블에 7개의 컬럼(zipcode_id ,zipcode ,sido ,gugun, dong, bunji, ho)으로 구성되어 있음을 확인하였다.

     

     

    2) 로그인 인증 우회(Bypassing Authentication)

    로그인 폼에 SQL Injection 취약점 존재 여부를 Error Base Injection을 통해 확인 후, 인증 우회를 진행해본다.

     

    ① 로그인 폼의 ID, PW 부분에 '(작은 따옴표)를 입력 후, 로그인을 시도한다.

     

    [그림 2] SQL Injection 취약 여부 확인1

     

    ② 웹 서버의 응답을 확인한다.

    아래와 같이 MSSQL 오류메시지가 반환 되었으며, 첫 번째 라인을 통해 MSSQL DB를 사용하고 있음을 알 수 있고, 두번 째 줄에서는 로그인 폼에 입력한 '(작은 따옴표)가 필터링 되지 않고 SQL 질의문에 삽입되어 구문 오류가 발생하는 것을 확인하였다.

    login_ok.asp 파일의 54번 째 라인에서 오류가 발생함을 알 수 있다.

    즉, 결론적으로 입력한 '(작은 따옴표)가 웹 서버(또는 웹 애플리케이션 서버)에서 특정 필터링 없이 DB까지 전송되고 있음을 알 수 있다.

     

    [그림 3] SQL Injection 취약 여부 확인2

     

    ③ 로그인 폼에 DB로 전송되는 SQL 쿼리의 구문 오류가 발생하지 않도록 입력한다.

    ID/PW 폼에 SQL 쿼리를 추측하여 입력해야 하며, 출력되는 에러 메시지를 힌트로 이용한다.

    ' or 1=1-- 입력 시, 인증 우회가 발생화여 최고 관리자로 로그인됨을 확인하였다.

     

    [그림 4] 로그인 인증 우회 시도

     

    [그림 5] 로그인 인증 우회 성공 화면

     

    4. 인증 우회 원리 확인

    로그인 폼에서 에러 발생 시, 출력되는 메시지를 통해 login_ok.asp 파일에서 에러가 발생함을 확인할 수 있다.

    login_ok.asp 파일의 54번 째 라인을 확인하면, 다음과 같다.

     

    [그림 6] 로그인 소스코드 확인1

     

    웹 애플리케이션 서버는 로그인 폼을 통해 사용자로부터 입력받은 ID/PW를 이용하여 SQL 쿼리를 구성하고, 구성된 질의문을 DB로 전송한다.

    해당 구조를 해석해보면, Members 테이블 내 user_id 컬럼의 값과 passwd 컬럼의 값 모두 참(AND 연산)이 되어야 정상적으로 해당 쿼리가 실행되는 것을 알 수 있다.

     

    [그림 7] 로그인 소스코드 확인2

     

    이제 로그인 폼에 admin / ' or 1=1-- 입력 시 쿼리 구조를 살펴보면, 다음과 같은 형태가 된다.

     

    [그림 8] 로그인 소스코드 확인3

    - `AND` 연산 후에 `OR` 연산이 진행되는데, `1=1`은 항상 참이므로 연산 결과는 항상 참이 된다.
    - 해당 쿼리가 실행되면, `Members` 테이블의 가장 위에 존재하는 계정으로 로그인된다.
    - 주석(--)으로 인해 주석 뒤에 존재하는 쿼리는 무시됨


    'Web Vulnerability' 카테고리의 다른 글

    MIME 타입 정리  (0) 2020.02.28
    HTTP 상태코드 정리  (0) 2020.02.28
    SQL Injection 취약점(1)_개요  (0) 2020.01.27
    클릭재킹(Clickjacking) 취약점  (0) 2020.01.27
    버퍼 오버플로우(Buffer Overflow)  (0) 2019.03.27

    댓글

Designed by Tistory.