In수

Music GIF

SQL - 2025년12월13일


SQL

SQL Injection

개념 및 정의

SQL Injection은 악의적인 사용자가 SQL 쿼리문에 비정상적인 SQL 코드를 삽입하여 데이터베이스를 공격하는 보안 취약점입니다. 웹 애플리케이션의 입력 필드나 URL 매개변수 등을 통해 악의적인 SQL 명령어를 주입하고, 이를 데이터베이스에서 실행하게 함으로써 권한 없이 데이터에 접근하거나 조작할 수 있습니다.

문제점

  • 데이터 유출: 데이터베이스의 민감한 정보(사용자 계정, 개인정보 등)가 노출될 수 있습니다.
  • 데이터 손상: 악의적으로 데이터를 삭제하거나 수정할 수 있습니다.
  • 인증 우회: 로그인 인증을 우회하여 관리자 권한으로 접근할 수 있습니다.
  • 시스템 제어: 데이터베이스 서버에 대한 제어권을 얻을 수 있습니다.

SQL Injection 예시:

-- 정상적인 쿼리
SELECT * FROM users WHERE id = 'user_input' AND password = 'password_input'

-- 악의적인 입력 (id: ' OR '1'='1)
SELECT * FROM users WHERE id = '' OR '1'='1' AND password = 'password_input'
-- 결과: 모든 사용자 정보가 반환됨

예방 방법

  1. Prepared Statement 사용
    • 쿼리의 구조와 데이터를 분리하여 입력값을 매개변수로 처리합니다.
      -- 안전한 방법 (Prepared Statement)
      PREPARE stmt FROM 'SELECT * FROM users WHERE id = ? AND password = ?'
      EXECUTE stmt USING user_input, password_input
      
  2. 입력값 검증 및 필터링
    • 사용자 입력값의 길이, 형식, 타입을 검증합니다.
    • 특수문자(‘ “ ; – /* */ 등)를 제거하거나 이스케이프 처리합니다.
  3. 이스케이프 처리
    • 쿼리에 포함되는 모든 문자열을 적절히 이스케이프 처리합니다.
      # Python 예시
      escaped_input = input_value.replace("'", "''")
      
  4. 최소 권한 원칙 (Least Privilege)
    • 데이터베이스 계정에 필요한 최소한의 권한만 부여합니다.
    • 읽기 전용 계정, 특정 테이블만 접근 가능한 계정 등으로 제한합니다.
  5. 에러 메시지 제한
    • 데이터베이스 에러 메시지를 사용자에게 노출하지 않습니다.
    • 일반적인 에러 메시지만 반환하도록 처리합니다.
  6. 웹 애플리케이션 방화벽 (WAF)
    • SQL Injection 패턴을 탐지하고 차단하는 WAF 솔루션을 사용합니다.
  7. 정기적인 보안 감시 및 로깅
    • 의심스러운 SQL 쿼리를 모니터링하고 로깅합니다.
    • 정기적인 보안 감사를 수행합니다.