SQL 삽입을 방지하는 방법

최소 권한 액세스를 적용하고, 사용자 입력을 삭제하며, 데이터베이스 프로시저를 제한하면 SQL 삽입과 그에 따른 데이터 유출을 방지하는 데 도움이 됩니다.

학습 목표

이 글을 읽은 후에 다음을 할 수 있습니다:

  • SQL 삽입의 작동 방식 설명
  • SQL 삽입을 차단하는 모범 사례 검토
  • Cloudflare에서 SQLi 공격을 방지하는 방법 알아보기

관련 콘텐츠


계속 알아보시겠어요?

인터넷에서 가장 인기 있는 인사이트를 한 달에 한 번 정리하는 Cloudflare의 월간 요약본 theNET를 구독하세요!

Cloudflare가 개인 데이터를 수집하고 처리하는 방법은 Cloudflare의 개인정보 취급방침을 참조하세요.

글 링크 복사

SQL 삽입 공격의 작동 방식

구조화된 질의 언어 삽입(SQLi)은 공격자가 SQL 데이터베이스에 있는 중요한 정보를 검색, 조작, 파기할 수 있도록 하는 코드 삽입 공격입니다. 이러한 공격은 SQL 쿼리 필드에 특수 명령을 삽입하는 방식으로 작동하며, 이 명령이 실행되면 공격자는 정상적인 사용자의 신원을 스푸핑하고 보호된 데이터를 보거나 검색할 수 있으며 서버에 대한 루트 액세스 권한까지 획득할 수 있습니다.

공격자는 합법적인 코드와 신뢰할 수 없는 코드를 제대로 구분할 수 없는 애플리케이션 프로그래밍 인터페이스(API)의 취약점을 악용하여 SQLi를 실행하는 경우가 많습니다. 변경된 명령이나 쿼리를 감지할 수 없는 경우, 이들 API는 웹 애플리케이션 방화벽(WAF) 또는 인증 조치를 우회하는 등 악의적 요청을 실행하는 데 사용될 수 있습니다.

일반적으로 SQLi는 다음 세 가지 방법 중 하나를 사용하여 수행됩니다.

  1. 대역 내 SQL 삽입은 단일 통신 채널을 사용하여 공격을 시작하고 완료합니다. 대역 내 SQLi의 일반적인 유형에는 오류 기반 SQLi(오류 메시지가 공격자가 기본 데이터베이스에 대한 중요 정보를 식별하는 데 도움이 되는 경우)와 유니온 기반 SQLi(공격자가 데이터베이스의 취약점을 발견하기 위해 유니온 SQL 연산자를 사용하는 경우)가 있습니다. 이는 가장 간단하고 일반적인 형태의 SQLi입니다.
  2. 반면 대역 외 SQL 삽입은 공격자가 동일한 통신 채널을 사용하여 공격을 시작하고 완료하는 것을 허용하지 않습니다. 대신, 감염된 애플리케이션은 DNS 또는 HTTP 요청을 통해 공격자가 제어할 수 있는 원격 엔드포인트로 데이터를 유출할 수 있어야 합니다. 이는 가장 어렵고 가장 일반적이지 않은 형태의 SQLi입니다.
  3. 블라인드 SQLi라고도 하는추론 SQL 삽입은 공격자가 악의적인 페이로드를 표적 서버로 보내야만 악용 방법을 학습할 수 있습니다. 일반적으로 블라인드 부울 기반 SQLi(공격자가 참-거짓 쿼리를 사용하여 서버가 다른 응답을 생성하도록 하는 경우) 또는 블라인드 시간 기반 SQLi(공격자가 서버의 응답 시간 변화를 통해 동일한 정보를 유추할 수 있는 경우)의 두 가지 형태 중 하나를 사용합니다. 이는 대역 내 SQLi보다 완료하는 데 더 많은 시간이 걸리는 경우가 많지만, 그 피해도 똑같이 클 수 있습니다.

양성 및 악성 SQL 쿼리의 실제 사례를 보려면 SQL 삽입이란?을 읽어보세요.

SQL 삽입을 방지하는 방법

SQL 삽입은 가장 널리 퍼진 API 위협 중 하나이지만, 올바른 예방 전략을 통해 효과적으로 방지할 수 있습니다. SQL 삽입을 방지하는 데 유용한 접근 방식에는 데이터베이스 프로시저 제한, 데이터베이스 입력 삭제, 최소 권한 액세스 시행 등이 있습니다.

데이터베이스 프로시저 및 코드 제한

SQL 삽입은 대체로 공격자의 데이터 입력 및 데이터베이스 함수 조작 능력에 따라 달라집니다. 이러한 입력을 제한하고 수행할 수 있는 데이터베이스 프로시저의 유형을 제한함으로써 조직에서는 무단 또는 악의적인 쿼리의 위험을 최소화할 수 있습니다. 그 방법에는 다음이 포함됩니다.

  • 준비된 문 및 매개변수화된 쿼리 적용: 준비된 문은 허용되는 SQL 코드를 정의한 다음 들어오는 쿼리에 대한 특정 매개 변수를 설정합니다. 악성 SQL 문은 실행 명령이 아닌 잘못된 데이터 입력으로 분류됩니다.
  • 저장된 프로시저 사용: 저장된 프로시저는 준비된 문과 마찬가지로 데이터베이스에서 검색할 수 있는 재사용 가능한 SQL 문으로, 악의적인 사용자가 데이터베이스 자체에서 직접 코드를 실행하는 것을 방지합니다.

데이터베이스 입력 유효성 검사 및 삭제

모든 SQL 데이터베이스에 대한 사용자 입력은 정기적으로 모니터링, 유효성 검사, 삭제하여 악성 코드를 제거해야 합니다. 입력 유효성 검사는 데이터가 미리 정해진 기준에 따라 올바르게 검사되고 형식이 지정되었는지 확인하며, 입력 정리는 유효하지 않거나 안전하지 않은 문자를 제거하고 필요에 따라 다시 포맷하여 입력을 수정(또는 "삭제")합니다. 입력 유효성 검사를 보장하는 방법은 다음과 같습니다.

  • 허용 목록 설정: 허용 목록은 데이터베이스에서 비정상적으로 보이는 들어오는 쿼리를 확인(및 거부)할 수 있는 유효한 사용자 입력을 정의하는 데 도움이 됩니다. 예를 들어, 특수 문자와 확장 URL은 공격자가 악의적인 쿼리를 실행하기 전에 데이터베이스에 대한 정보를 수집하기 위해 악용할 수 있는 두 가지 유형의 사용자 입력입니다. 이러한 입력의 사용을 제한하면 공격 가능성을 최소화하는 데 도움이 될 수 있습니다.
  • 사용자 제공 입력 이스케이프 처리: 또한 조직에서는 특정 문자나 단어가 악의적인 요청을 만드는 데 사용되지 않도록 사용자가 제공한 모든 입력을 이스케이프 처리(즉, 명령이나 조건부가 아닌 입력으로 처리)하도록 선택할 수 있습니다.

최소 권한 액세스 시행

최소 권한 액세스는 사용자에게 역할에 필요한 만큼만 보호된 리소스에 액세스할 권한을 부여하는 원칙입니다. 예를 들어, 데이터베이스에 대하여 관리자 수준의 권한을 부여하는 사용자 수를 제한하거나 나중에 취소할 수 있는 임시 관리자 수준의 액세스 권한을 사용자에게 부여할 수도 있습니다.

역할 기반 수준에서 사용자 액세스를 제한하면 도난당한 자격 증명을 사용하여 데이터베이스를 침해하는 공격자도 마찬가지로 보호된 데이터를 확인, 수정, 도용, 파기할 수 있는 능력이 제한되므로 침해의 영향을 최소화하는 데 도움이 됩니다. 같은 이유로 조직에서는 여러 웹 사이트 및 애플리케이션에서 데이터베이스에 대한 공유 액세스를 제한해야 합니다.

Cloudflare에서 SQL 삽입을 방지하는 방법

Cloudflare에서는 강력한 애플리케이션 및 API 보안 포트폴리오를 통해 조직에서 SQLi 공격에 대한 복원력을 개선할 수 있도록 지원합니다.

  • Cloudflare WAF는 잠재적인 SQL 악용에 대한 트래픽 패턴을 모니터링하고, 우회 및 공격 유형의 변형을 감지하며, 고급 머신 러닝 기술을 사용하여 진화하는 공격 방법에 맞게 WAF 규칙 집합을 조정합니다
  • Cloudflare D1은 기본적으로 Workers와 통합되어 준비된 문을 구현하고 사용자가 데이터베이스를 수정하거나 삭제하지 못하도록 하는 서버리스 SQL 데이터베이스입니다