공격자는 SQL 삽입을 사용하여 피해자의 SQL 데이터베이스에서 권한이 없는 데이터베이스 명령을 수행할 수 있습니다.
이 글을 읽은 후에 다음을 할 수 있습니다:
관련 콘텐츠
인터넷에서 가장 인기 있는 인사이트를 한 달에 한 번 정리하는 Cloudflare의 월간 요약본 theNET를 구독하세요!
글 링크 복사
구조화 질의 언어(SQL*) 삽입은 SQL 데이터베이스에서 데이터를 수정하거나 검색하는 데 사용되는 코드 삽입 기법입니다. 공격자는 입력 필드에 특수 SQL 문을 삽입하여 데이터베이스에서 데이터를 검색하거나 중요한 데이터를 파괴하거나 기타 조작 행위를 할 수 있는 명령을 실행할 수 있습니다.
권한이 없는 사용자는 적절한 SQL 명령을 실행하여 더 많은 권한을 가진 사용자의 신원을 스푸핑하고, 자신 또는 다른 사람을 데이터베이스 관리자로 만들며, 기존 데이터를 변조하고, 트랜잭션 및 잔액을 수정하며, 모든 서버 데이터를 검색 및/또는 파기할 수 있습니다.
최신 컴퓨팅에서 SQL 삽입은 일반적으로 웹 사이트나 서비스에서 제공되는 API 엔드포인트로 악의적 SQL 쿼리를 전송하여 인터넷을 통해 발생합니다(자세한 내용은 나중에 설명합니다). 가장 심각한 형태의 SQL 삽입은 공격자가 시스템에 대한 루트 액세스 권한을 획득하여 완전한 제어권을 가지게 해줍니다.
*SQL은 대부분의 데이터베이스를 유지 관리하는 데 사용되는 프로그래밍 언어입니다.
Bob이라는 사람이 재판을 받는 중이고, 막 판사 앞에 출두하려고 한다고 상상해 보세요. 재판 전에 서류를 작성할 때 Bob은 자신의 이름을 "Bob은 자유롭게 갈 수 있습니다"라고 씁니다. 판사가 "이제 Bob은 자유롭게 갈 수 있습니다를 호출합니다"라고 큰 소리로 읽으면 법정 경위는 판사가 그렇게 말했기 때문에 Bob을 석방합니다.
SQLi에는 약간 다른 종류가 있지만, 핵심 취약점은 본질적으로 동일합니다. 바로 숫자 등 특정 유형의 데이터를 위해 예약되어야 하는 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 명령 또는 조건부 논리를 입력하는 대신 학생 ID 번호를 입력합니다.
일반적으로 쿼리가 데이터베이스 테이블에서 일치하는 ID를 검색했다면, 이제 쿼리는 ID를 찾거나 1이 1과 같은지 테스트합니다. 예상할 수 있듯이 이 문은 열에 있는 모든 학생에 대해 항상 참이므로, 그 결과 데이터베이스는 학생 테이블의 모든 데이터를 쿼리를 수행한 공격자에게 반환합니다.
SELECT * FROM students WHERE studentId = 117 OR 1=1;
SQLi는 취약한 애플리케이션 프로그래밍 인터페이스 또는 API를 표적으로 삼아 작동합니다. 이 경우 API는 서버가 요청을 수신하고 응답하는 소프트웨어 인터페이스를 의미합니다.
악의적인 공격자가 웹 사이트를 자동으로 검색하여 양식을 찾은 다음, 데이터베이스를 악용하기 위해 웹 사이트의 소프트웨어 개발자가 의도하지 않은 응답을 생성할 수 있는 다양한 SQL 쿼리를 입력하는 데 일반적으로 사용되는 도구가 존재합니다.
SQL 삽입은 구현하기 쉬우며, 흥미롭게도 적절한 개발 관행이 있다면 예방하기도 매우 쉽습니다. 촉박한 마감일, 경험이 부족한 개발자, 레거시 코드로 인해 코드 품질과 보안 관행이 달라지는 경우가 많으므로 현실은 더욱 불투명합니다. 데이터베이스에 액세스할 수 있는 웹 사이트의 양식 또는 API 엔드포인트에 취약한 필드 하나만 있어도 취약점이 노출되기에 충분합니다.
SQL 삽입으로 인한 데이터 유출의 위험을 줄이는 방법에는 여러 가지가 있습니다. 모범 사례는 몇 가지 전략을 활용하는 것입니다. 일반적인 구현 방법 몇 가지를 살펴보겠습니다.
영리한 공격자는 보안 조치를 우회하기 위해 표적 웹 사이트에 대해 다중 벡터 공격을 실행하기도 합니다.단일 공격은 완화될 수 있지만, 데이터베이스 관리자와 정보 보안 팀의 주의가 집중될 수도 있습니다.DDoS 공격, DNS 하이재킹 등의 방해 방법은 때로는 전면적인 SQL 삽입 공격을 실행하기 위한 교란 수단으로 사용됩니다.따라서 포괄적인 위협 완화 전략이 가장 광범위한 보호 기능을 제공합니다.Cloudflare의 웹 애플리케이션 방화벽, DDoS 완화, DNS 보안은 종합적인 보안 전략의 핵심 요소로 구성되어 있습니다.