반응형

SQL 인젝션 (SQL Injection)

SQL 인젝션(SQL Injection) 은 공격자가 웹 애플리케이션의 데이터베이스 쿼리를 조작하여 민감한 정보를 탈취하거나 시스템을 손상시키는 보안 취약점입니다.

SQL 인젝션은 잘못된 입력 검증으로 인해 발생하며, 가장 심각한 보안 위협 중 하나로 알려져 있습니다.


SQL 인젝션의 동작 원리

  • 공격자가 SQL 쿼리를 조작할 수 있는 입력값(예: URL, 폼, 쿠키)을 이용.
  • 애플리케이션이 공격자의 입력값을 그대로 SQL 쿼리에 포함시키는 경우, 데이터베이스의 무단 접근, 데이터 조작, 시스템 손상이 가능.

SQL 인젝션의 주요 유형

  1. 클래식 SQL 인젝션 (Classic SQL Injection)

    • 일반적인 쿼리 조작으로 데이터베이스를 공격.
    • 예시:

      sql

      SELECT * FROM users WHERE username = 'admin' AND password = '';
      
      공격 입력: admin' OR '1'='1
      실행 쿼리:

      sql

      SELECT * FROM users WHERE username = 'admin' OR '1'='1';
      
      결과: 조건이 항상 참이 되어 무단 로그인 성공.
  2. 블라인드 SQL 인젝션 (Blind SQL Injection)

    • 데이터베이스 결과를 직접 확인할 수 없지만, 참/거짓 기반의 응답을 이용.
    • 예시:

      sql

      SELECT * FROM users WHERE id = 1 AND 1=1; -- 참  
      SELECT * FROM users WHERE id = 1 AND 1=2; -- 거짓
      
  3. 에러 기반 SQL 인젝션 (Error-based SQL Injection)

    • 데이터베이스 에러 메시지를 통해 정보를 유출.
    • 예시: UNION SELECT null, @@version;
      결과: 데이터베이스 버전이 노출됨.
  4. UNION 기반 SQL 인젝션 (Union-based SQL Injection)

    • UNION 명령어를 이용해 추가적인 쿼리 결과를 결합.
    • 예시:

      sql

      SELECT name, email FROM users UNION SELECT username, password FROM admin;
      
  5. 타임 기반 SQL 인젝션 (Time-based SQL Injection)

    • 데이터베이스 응답 시간이 느려지는 것을 이용하여 정보를 유출.
    • 예시:

      sql

      SELECT IF(1=1, SLEEP(5), NULL);
      

SQL 인젝션의 주요 피해

  1. 데이터 유출: 사용자의 개인정보, 계정 정보, 민감 데이터 탈취.
  2. 데이터 변경: 데이터베이스 내용 삭제, 수정.
  3. 무단 접근: 관리자 계정 도용을 통한 시스템 제어.
  4. 서비스 중단: 데이터베이스 손상으로 인한 장애 발생.
  5. 백도어 설치: 악성 명령어를 데이터베이스에 삽입하여 추가 공격 수행.

SQL 인젝션 예방 방법

  1. Prepared Statement (사전 준비된 쿼리)

    • 파라미터화된 쿼리를 사용하여 입력값을 별도로 처리.
    • 예시 (Python + MySQL):

      python

      cursor.execute("SELECT * FROM users WHERE username = %s AND password = %s", (username, password))
      
  2. ORM 사용

    • Hibernate, Django ORM 등 SQL 쿼리를 직접 작성하지 않고 안전하게 데이터베이스 처리.
  3. 입력값 검증(Input Validation)

    • 사용자 입력을 철저히 검증하여 허용된 데이터만 처리.
    • 예: 숫자만 필요한 필드에 문자 입력 차단.
  4. 출력값 인코딩(Output Encoding)

    • 데이터베이스 결과값을 안전하게 렌더링.
  5. 최소 권한 부여

    • 데이터베이스 사용자 계정에 최소한의 권한만 부여.
  6. 에러 메시지 노출 금지

    • 클라이언트에 상세한 SQL 에러 정보를 숨김.
  7. 웹 방화벽 사용

    • WAF(Web Application Firewall)를 통해 악성 요청 차단.

SQL 인젝션은 입력값을 신뢰하지 않고 적절히 검증하거나, 안전한 쿼리 작성을 통해 예방할 수 있습니다.

모든 데이터베이스와 연동된 애플리케이션에서 철저히 관리해야 합니다.

728x90
반응형

+ Recent posts