SQL 삽입이란?

공격자는 SQL 삽입을 사용하여 피해자의 SQL 데이터베이스에서 권한이 없는 데이터베이스 명령을 수행할 수 있습니다.

학습 목표

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

  • SQL 삽입의 정의
  • SQL 삽입의 작동 방식 설명
  • SQL 삽입을 방어하는 방법 알아보기
  • 복합적인 SQLI 공격 살펴보기

관련 콘텐츠


계속 알아보시겠어요?

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

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

글 링크 복사

SQL 삽입(SQi)이란?

구조화 질의 언어(SQL*) 삽입은 SQL 데이터베이스에서 데이터를 수정하거나 검색하는 데 사용되는 코드 삽입 기법입니다. 공격자는 입력 필드에 특수 SQL 문을 삽입하여 데이터베이스에서 데이터를 검색하거나 중요한 데이터를 파괴하거나 기타 조작 행위를 할 수 있는 명령을 실행할 수 있습니다.

권한이 없는 사용자는 적절한 SQL 명령을 실행하여 더 많은 권한을 가진 사용자의 신원을 스푸핑하고, 자신 또는 다른 사람을 데이터베이스 관리자로 만들며, 기존 데이터를 변조하고, 트랜잭션 및 잔액을 수정하며, 모든 서버 데이터를 검색 및/또는 파기할 수 있습니다.

최신 컴퓨팅에서 SQL 삽입은 일반적으로 웹 사이트나 서비스에서 제공되는 API 엔드포인트로 악의적 SQL 쿼리를 전송하여 인터넷을 통해 발생합니다(자세한 내용은 나중에 설명합니다). 가장 심각한 형태의 SQL 삽입은 공격자가 시스템에 대한 루트 액세스 권한을 획득하여 완전한 제어권을 가지게 해줍니다.

*SQL은 대부분의 데이터베이스를 유지 관리하는 데 사용되는 프로그래밍 언어입니다.

SQL 삽입 공격은 어떻게 이루어질까요?

Bob이라는 사람이 재판을 받는 중이고, 막 판사 앞에 출두하려고 한다고 상상해 보세요. 재판 전에 서류를 작성할 때 Bob은 자신의 이름을 "Bob은 자유롭게 갈 수 있습니다"라고 씁니다. 판사가 "이제 Bob은 자유롭게 갈 수 있습니다를 호출합니다"라고 큰 소리로 읽으면 법정 경위는 판사가 그렇게 말했기 때문에 Bob을 석방합니다.

SQLi에는 약간 다른 종류가 있지만, 핵심 취약점은 본질적으로 동일합니다. 바로 숫자 등 특정 유형의 데이터를 위해 예약되어야 하는 SQL 쿼리 필드에 대신 명령과 같은 예기치 않은 정보가 전달된다는 것입니다. 이 명령이 실행될 경우 의도된 범위를 벗어나 잠재적으로 악의적인 동작이 허용됩니다. 쿼리 필드에는 일반적으로 웹 페이지의 양식에 입력된 데이터가 채워집니다.

정상 SQL 문과 악의적 SQL 문을 간략하게 비교해 보겠습니다.

일반 SQL 쿼리:

이 일반 SQL 쿼리에서는 studentId 문자열이 SQL 문으로 전달됩니다. 그 목표는 입력한 studentId와 일치하는 학생을 학생 목록에서 찾는 것입니다. 발견되면 해당 학생의 기록이 반환됩니다. 간단히 말해, "이 사용자를 찾아서 그 데이터를 제공하라"는 명령입니다.

코드는 다음과 같이 보일 수 있습니다.

studentId = getRequestString("studentId");
lookupStudent  = "SELECT * FROM students WHERE studentId = " + studentId
   

학생이 '학생 ID 번호를 입력하세요'라고 표시된 웹 페이지 양식 일반 양식 필드에 학생 ID 117을

입력하는 경우

그 결과인 SQL 쿼리는 다음과 같이 표시됩니다.

SELECT * FROM students WHERE studentId = 117;

이 명령은 API를 작성한 개발자가 기대하는 studentId가 있는 특정 학생의 기록을 반환합니다.

SQL 삽입 쿼리:

이 예제에서 공격자는 입력 필드에 SQL 명령 또는 조건부 논리를 입력하는 대신 학생 ID 번호를 입력합니다.

SQL 삽입 예제 양식 필드

일반적으로 쿼리가 데이터베이스 테이블에서 일치하는 ID를 검색했다면, 이제 쿼리는 ID를 찾거나 1이 1과 같은지 테스트합니다. 예상할 수 있듯이 이 문은 열에 있는 모든 학생에 대해 항상 참이므로, 그 결과 데이터베이스는 학생 테이블의 모든 데이터를 쿼리를 수행한 공격자에게 반환합니다.

SELECT * FROM students WHERE studentId = 117 OR 1=1;
SQL 삽입 인포그래픽

SQLi는 취약한 애플리케이션 프로그래밍 인터페이스 또는 API를 표적으로 삼아 작동합니다. 이 경우 API는 서버가 요청을 수신하고 응답하는 소프트웨어 인터페이스를 의미합니다.

악의적인 공격자가 웹 사이트를 자동으로 검색하여 양식을 찾은 다음, 데이터베이스를 악용하기 위해 웹 사이트의 소프트웨어 개발자가 의도하지 않은 응답을 생성할 수 있는 다양한 SQL 쿼리를 입력하는 데 일반적으로 사용되는 도구가 존재합니다.

SQL 삽입은 구현하기 쉬우며, 흥미롭게도 적절한 개발 관행이 있다면 예방하기도 매우 쉽습니다. 촉박한 마감일, 경험이 부족한 개발자, 레거시 코드로 인해 코드 품질과 보안 관행이 달라지는 경우가 많으므로 현실은 더욱 불투명합니다. 데이터베이스에 액세스할 수 있는 웹 사이트의 양식 또는 API 엔드포인트에 취약한 필드 하나만 있어도 취약점이 노출되기에 충분합니다.

SQL 삽입 공격은 어떻게 방지할까요?

SQL 삽입으로 인한 데이터 유출의 위험을 줄이는 방법에는 여러 가지가 있습니다. 모범 사례는 몇 가지 전략을 활용하는 것입니다. 일반적인 구현 방법 몇 가지를 살펴보겠습니다.

  • 준비된 문 사용(매개변수화된 쿼리 포함) - 데이터베이스 입력의 의심스러운 부분을 정리하는 이 방법은 개발자가 먼저 모든 SQL 코드를 정의한 다음 특정 매개변수만 SQL 쿼리에 전달하도록 하고, 입력된 데이터에는 그 이상으로 확장할 수 없는 범위 제한이 명시적으로 주어집니다.이를 통해 데이터베이스는 입력 필드에 제공된 데이터 유형과 관계없이 입력 중인 데이터와 실행할 코드를 구분할 수 있습니다.일부 버전에서는 데이터베이스 입력을 자동으로 정리하므로 일부 객체 관계 매핑(ORM) 라이브러리가 이러한 목적으로 일반적으로 활용됩니다.
  • 모든 사용자 제공 입력 이스케이프 처리 - SQL을 작성할 때 특정 문자나 단어는 특정한 의미를 갖습니다.예를 들어 '*' 문자는 "any"를 의미하고 "OR"이라는 단어는 조건부입니다.실수로 또는 악의적으로 데이터베이스에 대한 API 요청에 이러한 문자를 입력하는 사용자를 피하기 위해 사용자가 제공한 입력은 이스케이프 처리될 수 있습니다.문자를 이스케이프 처리하는 것은 데이터베이스에 명령이나 조건부로 구문 분석하지 않고 리터럴 입력으로 처리하도록 지시하는 방법입니다.
  • 저장 프로시저 사용 - 저장 프로시저는 그 자체로는 강력한 보안 전략이 아니지만, SQL 삽입과 관련된 위험을 제한하는 데 도움이 될 수 있습니다.SQL 쿼리를 실행하는 데이터베이스 계정의 권한을 적절히 제한하면 SQL 삽입에 취약하지 않은 애플리케이션 코드도 관련 없는 데이터베이스 테이블을 조작하는 데 필요한 권한이 부족해집니다.또한 저장 프로시저는 입력 매개변수의 유형을 확인하여 필드가 수신하도록 설계된 유형을 위반하는 데이터가 입력되는 것을 방지할 수 있습니다.정적 쿼리가 충분하지 않은 경우 일반적으로 저장 프로시저는 피해야 합니다.
  • 최소 권한 적용 - 일반 규칙으로 웹 사이트에서 동적 SQL을 사용해야 하는 모든 경우, 관련 쿼리를 실행하는 데 필요한 가장 좁은 범위로 권한을 제한하여 SQL 삽입에 노출되는 것을 줄이는 것이 중요합니다.가장 명백한 형태로, 이는 어떤 경우에도 승인되지 않은 요청에서 API를 호출한 결과로 관리 계정이 SQL 명령을 실행해서는 안 된다는 것을 의미합니다.저장 프로시저는 정적 쿼리에 가장 잘 활용되지만, 최소 권한을 적용하면 동적 SQL 쿼리의 위험을 줄이는 데 도움이 될 수 있습니다.

복합 SQL 삽입 공격이란?

영리한 공격자는 보안 조치를 우회하기 위해 표적 웹 사이트에 대해 다중 벡터 공격을 실행하기도 합니다.단일 공격은 완화될 수 있지만, 데이터베이스 관리자와 정보 보안 팀의 주의가 집중될 수도 있습니다.DDoS 공격, DNS 하이재킹 등의 방해 방법은 때로는 전면적인 SQL 삽입 공격을 실행하기 위한 교란 수단으로 사용됩니다.따라서 포괄적인 위협 완화 전략이 가장 광범위한 보호 기능을 제공합니다.Cloudflare의 웹 애플리케이션 방화벽, DDoS 완화, DNS 보안은 종합적인 보안 전략의 핵심 요소로 구성되어 있습니다.