IT Professional Engineering/SEC

Blind SQL Injection: 숨겨진 데이터베이스 취약점 공격 기법

GilliLab IT 2025. 6. 20. 10:33
728x90
반응형

Blind SQL Injection: 숨겨진 데이터베이스 취약점 공격 기법

개요

Blind SQL Injection은 공격자가 SQL 쿼리 결과를 직접 볼 수 없는 상황에서도 데이터베이스 정보를 추출할 수 있는 고급 공격 기법이다. 일반적인 SQL Injection과 달리 공격자는 참/거짓(True/False) 응답이나 시간 지연과 같은 간접적인 피드백만을 활용하여 데이터베이스의 정보를 유추한다. 이러한 특성으로 인해 탐지가 어렵고 방어하기 복잡한 보안 취약점으로 분류된다.

Blind SQL Injection의 유형

1. Boolean-based Blind SQL Injection

  • 원리: 쿼리 결과가 참인지 거짓인지에 따라 웹 애플리케이션의 응답이 달라지는 특성을 이용
  • 식별 방법: 페이지 콘텐츠, 응답 코드, 오류 메시지 등의 차이를 관찰
  • 예시 쿼리:
    SELECT * FROM users WHERE username='admin' AND (SELECT 1 FROM dual WHERE 1=1)--'
    위 쿼리가 정상 실행되면 조건이 참이라는 것을 확인 가능

2. Time-based Blind SQL Injection

  • 원리: 쿼리 실행 시간을 의도적으로 지연시켜 응답 시간의 차이를 통해 정보 수집
  • 방식: 조건이 참일 때만 시간 지연 함수(SLEEP, BENCHMARK 등)가 실행되도록 설계
  • 예시 쿼리:
    SELECT * FROM users WHERE username='admin' AND IF(1=1, SLEEP(5), 0)--'
    조건이 참이면 5초 지연이 발생

공격 시나리오 및 실행 과정

데이터베이스 종류 확인 공격

시스템에서 사용 중인 데이터베이스 종류를 먼저 파악하는 과정:

flowchart TD
    A[공격 시작] --> B{MySQL?}
    B -->|True| C[MySQL 확인]
    B -->|False| D{MSSQL?}
    D -->|True| E[MSSQL 확인]
    D -->|False| F{Oracle?}
    F -->|True| G[Oracle 확인]
    F -->|False| H[다른 DB 확인]

데이터베이스 테이블 정보 추출 공격 과정

sequenceDiagram
    공격자->>웹 애플리케이션: Blind SQL Injection 쿼리 전송
    웹 애플리케이션->>데이터베이스: 변조된 쿼리 실행
    데이터베이스-->>웹 애플리케이션: 쿼리 결과 반환
    웹 애플리케이션-->>공격자: 간접적 피드백(응답 차이)
    Note right of 공격자: 응답 분석 후 다음 쿼리 결정
    공격자->>웹 애플리케이션: 새로운 추측 쿼리 전송

Boolean-based 공격 예시

관리자 계정의 비밀번호를 한 글자씩 추출하는 과정:

  1. 첫 번째 글자가 'a'인지 확인

    ' OR (SELECT SUBSTRING(password,1,1) FROM users WHERE username='admin')='a'--
  2. 첫 번째 글자가 'b'인지 확인

    ' OR (SELECT SUBSTRING(password,1,1) FROM users WHERE username='admin')='b'--
  3. 반복 진행하여 전체 비밀번호 획득

Time-based 공격 예시

데이터베이스 이름의 첫 글자를 파악하는 과정:

' OR IF(ASCII(SUBSTRING(DATABASE(),1,1))=115, SLEEP(5), 0)--

만약 데이터베이스 이름의 첫 글자가 ASCII 코드 115('s')와 일치하면 응답이 5초 지연된다.

각 데이터베이스별 Blind SQL Injection 특화 함수

MySQL

  • 문자열 추출: SUBSTRING(), MID()
  • 시간 지연: SLEEP(), BENCHMARK()
  • 조건문: IF(), CASE WHEN
  • 정보 획득: DATABASE(), VERSION(), USER()

Oracle

  • 문자열 추출: SUBSTR()
  • 시간 지연: DBMS_PIPE.RECEIVE_MESSAGE('any_string', 10)
  • 조건문: CASE WHEN
  • 정보 획득: SYS.DATABASE_NAME, v$version

MSSQL

  • 문자열 추출: SUBSTRING()
  • 시간 지연: WAITFOR DELAY '0:0:5'
  • 조건문: IF, CASE
  • 정보 획득: DB_NAME(), @@VERSION, SYSTEM_USER

자동화 도구

Blind SQL Injection은 수작업으로 수행 시 많은 시간이 소요되므로 다양한 자동화 도구가 활용된다:

  1. SQLmap: 가장 널리 사용되는 오픈소스 SQL Injection 자동화 도구

    sqlmap -u "http://vulnerable-site.com/page?id=1" --level=5 --risk=3 --technique=B
  2. Havij: GUI 기반 SQL Injection 도구로 Blind SQL Injection 지원

  3. Burp Suite: Intruder 기능을 통해 Blind SQL Injection 공격 자동화 가능

방어 기법 및 예방 조치

1. 매개변수화된 쿼리(Prepared Statements) 사용

// 취약한 코드
String query = "SELECT * FROM users WHERE username='" + username + "'";

// 안전한 코드
PreparedStatement stmt = connection.prepareStatement("SELECT * FROM users WHERE username=?");
stmt.setString(1, username);

2. ORM(Object-Relational Mapping) 프레임워크 활용

# Django ORM 예시
user = User.objects.get(username=username)

3. 입력값 검증 및 필터링

  • 화이트리스트 방식의 입력 검증 적용
  • 특수 문자 필터링 (단, 이것만으로는 불충분)

4. 최소 권한 원칙 적용

  • 데이터베이스 사용자에게 필요한 최소한의 권한만 부여
  • 웹 애플리케이션이 시스템 테이블에 접근하지 못하도록 제한

5. WAF(Web Application Firewall) 구축

  • SQL Injection 패턴을 감지하고 차단
  • ModSecurity와 같은 오픈소스 WAF 활용 가능

실제 사례 분석

사례 1: 소니 픽처스 해킹 (2014)

  • 공격자들은 SQL Injection 취약점을 통해 소니 내부 시스템에 접근
  • Blind SQL Injection 기법을 사용하여 데이터베이스 구조를 파악한 후 대량의 내부 정보 유출
  • 개인정보, 영화 파일, 이메일, 재무 데이터 등 다양한 정보가 유출됨
  • 예상 피해액: 약 1억 5천만 달러

사례 2: 야후 데이터 유출 (2013-2014)

  • 공격자들은 Blind SQL Injection 취약점을 악용하여 야후 데이터베이스에 접근
  • 약 30억 개의 사용자 계정 정보가 유출됨
  • 해시된 비밀번호, 보안 질문, 개인 정보 등이 포함됨
  • 결과적으로 베리존의 야후 인수가격이 3억 5천만 달러 감소

취약점 탐지 방법

1. 자동화된 스캔 도구 활용

  • OWASP ZAP, Acunetix, Nessus 등의 취약점 스캐너 활용
  • 정기적인 보안 스캔 수행

2. 소스 코드 검토

  • SQL 쿼리 생성 부분 중점 검토
  • 사용자 입력이 직접 SQL 쿼리에 삽입되는지 확인

3. 침투 테스트

  • 전문 보안 인력에 의한 침투 테스트 수행
  • 실제 공격 시나리오를 통한 취약점 발견

4. 로그 분석

  • 비정상적인 데이터베이스 쿼리 패턴 모니터링
  • 응답 시간이 비정상적으로 긴 요청 감시

Blind SQL Injection 실습 예제

실습 환경 구성

  1. 취약한 웹 애플리케이션 설치 (DVWA, bWAPP 등)
  2. 웹 프록시 도구 설정 (Burp Suite, OWASP ZAP)
  3. 데이터베이스 관리 도구 준비

Boolean-based Blind SQL Injection 실습

  1. 취약한 로그인 페이지 접속
  2. 아래 쿼리를 통해 admin 사용자의 존재 여부 확인
    username=admin' AND 1=1--&password=anything
  3. 데이터베이스 버전 정보 추출
    username=admin' AND ASCII(SUBSTRING(@@version,1,1))>51--&password=anything

Time-based Blind SQL Injection 실습

  1. 아래 쿼리를 통해 데이터베이스 이름 길이 확인
    username=admin' AND IF(LENGTH(DATABASE())=8, SLEEP(5), 0)--&password=anything
  2. 데이터베이스 이름 문자 하나씩 확인
    username=admin' AND IF(ASCII(SUBSTRING(DATABASE(),1,1))=115, SLEEP(5), 0)--&password=anything

결론

Blind SQL Injection은 직접적인 에러 메시지나 데이터베이스 출력을 확인할 수 없는 상황에서도 데이터베이스 정보를 추출할 수 있는 고도화된 공격 기법이다. 공격자는 Boolean 기반 또는 시간 기반의 방식을 통해 시스템의 응답을 분석하고 데이터베이스 구조와 내용을 유추한다. 이러한 공격은 자동화 도구를 통해 더욱 효율적으로 수행될 수 있으며, 매개변수화된 쿼리, 적절한 입력값 검증, 최소 권한 원칙 적용 등의 방어 기법을 통해 예방해야 한다.

정보 보안 담당자는 Blind SQL Injection의 작동 원리와 탐지 방법을 충분히 이해하고, 지속적인 보안 테스트와 모니터링을 통해 시스템을 보호해야 한다. 특히 웹 애플리케이션 개발 시 초기 단계부터 보안을 고려한 설계와 코딩 관행을 적용하는 것이 중요하다.

Keywords

SQL Injection, Blind SQLi, Boolean-based, Time-based, 데이터베이스 보안, 웹 취약점, 매개변수화 쿼리, WAF, 보안 테스트, 침투 테스트

728x90
반응형