SQL 주입이란 무엇입니까? SQLi 공격을 방지하는 방법
게시 됨: 2023-09-15웹 애플리케이션은 매일 우리의 온라인 경험을 강화합니다. 우리는 웹 앱을 사용하여 연결하고, 상호작용하고, 쇼핑하고, 재미있는 고양이 동영상을 시청합니다. 중요한 비즈니스 서비스를 제공하고 민감한 데이터를 보관하지만, 무언가를 더 많이 사용할수록 공격을 받기 쉽습니다.
구조화된 쿼리 언어(SQL)의 취약점을 악용하는 앱에서 주의해야 할 사이버 공격 중 하나는 일반적이고 위험한 SQL 삽입입니다.
SQL 주입이란 무엇입니까?
SQL 주입(SQLi)은 사이버 공격자가 웹 애플리케이션의 취약점을 악용하기 위해 사용하는 유해 코드 주입 기술입니다. 그들은 데이터베이스 쿼리에 일련의 악성 코드를 추가하여 약점을 활용하여 무단 액세스를 얻습니다.
SQL 주입 공격은 부적절한 데이터 액세스, 조작, 신원 도용, 금전적 손실, 평판 손상 및 법적 결과를 초래합니다. 개발자와 조직은 위험을 이해하고 완전한 보안 조치를 구현해야 합니다. 웹 애플리케이션 방화벽(WAF) 소프트웨어 및 디지털 포렌식 소프트웨어와 같은 도구는 SQL 주입 공격을 방지하도록 설계되었습니다. 기업은 포괄적인 웹사이트 보안 제품군을 활용하여 앱을 보호할 수도 있습니다.
이 SQL 주입 치트 시트를 읽고 예제, 변형 및 이러한 공격을 방지하는 방법을 통해 SQL 공격이 실행되는 방법을 알아보세요.
SQL 주입 공격이 위험한 이유는 무엇입니까?
SQL 주입은 OWASP(Open Worldwide Application Security Project)의 웹 애플리케이션 보안 위험 상위 10개 목록에 수년 동안 포함되어 왔습니다. 2022년에만 OWASP는 테스트한 앱에서 특정 형태의 삽입이 274,000회 이상 발견되었습니다. SQL 주입과 XSS(교차 사이트 스크립팅)가 가장 일반적이었습니다.
공격자는 SQL 주입을 사용하여 다음을 유발할 수 있습니다.
- 데이터베이스 내의 정보를 수정하거나 삭제하여 웹 애플리케이션에 오류가 발생합니다 .
- 해커가 개인 정보, 금융 기록, 비밀번호 등 데이터베이스에 저장된 민감한 데이터에 무단으로 접근하는 경우 데이터 침해가 발생합니다.
- 동일한 공유 데이터베이스를 사용하는 승인되지 않은 추가 시스템에 액세스하여 시스템이 손상되었습니다 . 이를 통해 공격자는 공격을 동일한 네트워크의 다른 시스템으로 확대하거나 DDoS(분산 서비스 거부)를 수행할 수 있습니다.
이러한 파괴적인 행동은 기업에 돌이킬 수 없는 피해를 입힙니다. 이러한 범죄는 개인 정보 보호와 데이터 무결성을 손상시켜 고객의 신뢰와 비즈니스 평판을 떨어뜨립니다. 그 여파를 처리하는 기업에도 재정적 부담이 가중된다.
실제 SQL 인젝션 공격 사례
SQL 주입이 처음 등장한 지 20년이 넘었습니다. 20년이 지난 지금도 다음과 같은 주요 SQL 주입 사건에서 알 수 있듯이 이는 여전히 악명 높습니다.
- Heartland Payments Systems: 2008년에 Heartland Payments Systems는 SQLi 공격을 통해 1억 3천만 개 이상의 신용 카드 및 직불 카드 세부 정보가 노출되는 역사상 최대 규모의 데이터 유출 사고를 겪었습니다. Heartland는 수백만 달러의 벌금을 지불했습니다.
- Yahoo : 2012년에는 SQL 주입 공격으로 이메일 주소와 비밀번호를 포함해 약 500만 명의 Yahoo 사용자 계정 세부정보가 손상되었습니다.
- Freepik: 해커들은 회사의 Flaticon 웹사이트에 대한 SQL 주입 공격 중에 2020년에 830만 명의 Freepik 및 Flaticon 사용자의 이메일과 비밀번호를 훔쳤습니다.
- WooCommerce: 인기 있는 WordPress 플러그인은 500만 개의 사이트를 데이터 도난에 노출시키는 SQL 주입 취약점을 수정했습니다.
- BillQuick: 사이버 범죄자들은 인기 있는 청구 플랫폼의 블라인드 SQL 취약점을 악용하여 랜섬웨어를 확산시켰습니다.
- MOVEit: 2023년 5월, Cl0p 랜섬웨어 집단은 관리형 파일 전송 소프트웨어 도구인 MOVEit의 SQL 주입 취약점을 사용하여 1,000개 이상의 조직과 최소 6천만 명 이상의 개인에게 영향을 미쳐 올해 들어 최대 규모의 데이터 침해로 기록했습니다.
SQL 주입 공격은 어떻게 작동하나요?
최신 웹 애플리케이션에서 사용하는 데이터베이스와 SQL 쿼리의 기본 사항을 살펴보겠습니다. 이는 SQL 주입의 내부 작동 방식을 더 잘 이해하는 데 도움이 됩니다.
모든 웹사이트는 SQL 데이터베이스라고도 하는 관계형 데이터베이스를 사용하여 사용자와 앱에 대한 데이터를 저장합니다. 이는 사용자 정보, 로그인 자격 증명, 결제 정보 또는 회사에 관한 기타 정보일 수 있습니다. 예를 들어 전자상거래 웹사이트를 생각해 보세요. 제품 데이터, 사용자 계정, 주문 데이터 및 결제 정보를 데이터베이스에 저장합니다.
그런 다음 웹사이트는 이러한 데이터베이스에서 데이터를 가져와 사용자에게 특정한 콘텐츠나 서비스를 제공합니다. 이 프로세스는 데이터베이스 관리에 사용되는 표준화된 프로그래밍 언어인 SQL 덕분에 발생합니다. 구매 내역과 같이 앱에서 무언가를 가져와야 할 때마다 실제로는 데이터베이스에 특정 작업을 수행하도록 지시하는 명령인 SQL 쿼리를 사용하여 데이터베이스에 요청하는 것입니다.
웹 상호 작용을 원활하게 하기 위해 많은 웹 사이트에서는 사용자가 데이터를 입력하여 SQL 쿼리를 수행하도록 허용합니다. 여기에는 검색어, 사용자 이름, 결제 세부정보 등이 포함될 수 있습니다.
전자상거래 웹사이트의 예를 생각해 보세요. "주문" 테이블(o) 및 "제품" 테이블(p)이 있는 데이터베이스의 주문 내역을 표시하는 간단한 SQL 쿼리는 다음과 같습니다.
SELECT o.주문_ID, o.주문_날짜, p.제품_이름, p.가격
주문에서 o
JOIN 제품 p ON o.product_id = p.product_id
o.user_id = 12345;
이 SQL 코드는 웹 사이트 데이터베이스의 사용자 ID 12345에 대한 제품 테이블의 제품 이름 및 가격과 함께 주문 테이블에서 주문 ID 및 날짜를 선택합니다. 일반적으로 ID는 사용자의 입력을 기반으로 합니다. 입력을 제대로 확인하고 제어하지 않으면 문제가 발생합니다. 공격자는 이 취약점을 악용하여 SQL 주입 공격을 수행합니다.
일반적으로 전개되는 방식은 다음과 같습니다.
- 취약한 입력 필드 식별: 공격자는 잠재적으로 악성 코드를 삽입할 수 있는 웹 애플리케이션의 입력 필드를 찾는 것부터 시작합니다. 그들은 다양한 값을 제출하고 앱이 어떻게 반응하는지 확인합니다. 여부를 알아보기 위해. 애플리케이션이 사용자 입력의 유효성을 제대로 검사하거나 삭제하지 않으면 애플리케이션은 해당 입력을 SQL 코드로 처리합니다. 이 잠재적인 취약점은 코드 삽입에 사용됩니다.
- 사용자 입력을 통한 코드 삽입: 공격자는 애플리케이션이 입력을 처리하는 방식을 이해한 후 취약점을 이용하는 악성 SQL 코드인 페이로드를 구성합니다. 여기에는 작은따옴표('), 큰따옴표(“) 또는 등호(=)와 같은 SQL 제어 문자를 추가하여 SQL 쿼리 구조를 변경하는 것이 포함됩니다. SELECT 및 FROM과 같은 일반적인 SQL 명령과 함께 이러한 제어 문자를 사용하면 공격자가 데이터베이스 서버에서 데이터에 액세스하거나 데이터를 검색할 수 있습니다.
그런 다음 합법적인 요청과 함께 특별히 제작된 입력을 제출하여 애플리케이션이 의심스러운 코드를 쿼리의 합법적인 부분으로 처리하도록 속입니다. - 실행: 공격을 인지하지 못한 데이터베이스는 마치 합법적인 요청인 것처럼 쿼리를 처리하고 삽입된 코드를 실행합니다.
- 악용: 공격자의 의도에 따라 삽입된 SQL 코드는 민감한 데이터를 검색하거나, 정보를 수정 또는 삭제하거나, 심지어 무단 액세스를 허용할 수도 있습니다. 이로 인해 애플리케이션의 보안이 손상되고 잠재적으로 민감한 정보가 노출될 수 있습니다.
SQL 주입 예시
다음과 같이 URL 매개변수를 사용하여 제품 ID를 기반으로 제품 세부정보를 가져오는 웹 애플리케이션을 생각해 보세요.
http://example.com/products?id=1
공격자는 오류를 발생시키고 다음과 같은 정보를 검색하기 위해 악성 SQL 코드를 삽입하려고 시도할 수 있습니다. http://example.com/products?id=1' OR 1=1; –
애플리케이션이 사용자 입력을 적절하게 검증하고 삭제하지 못하는 경우 SQL 쿼리는 다음과 같이 조작될 수 있습니다.
SELECT * FROM 제품 WHERE OR 1=1; - - ';
이 경우 원래 쿼리는 ID 1인 제품을 검색하도록 설계되었으나 1=1이 추가되고 이중 하이픈(- -)이 추가되어 공격자의 입력으로 인해 모든 제품을 반환하도록 쿼리가 수정됩니다. 이는 원래 닫는 작은따옴표를 무효화하고 모든 제품 세부 정보를 표시하거나 공격자가 악용할 수 있는 오류 메시지를 표시하는 결과를 초래합니다.
33%
2022년 웹 애플리케이션의 심각한 취약점 중 SQL 삽입으로 인한 취약점의 비율
출처: 스태티스타
SQL 취약점이 널리 퍼져 있고 비즈니스에 중요한 모든 데이터가 포함된 웹 앱 데이터베이스의 매력으로 인해 SQL 주입은 가장 지속적인 사이버 공격 중 하나가 되었습니다.
출처: 스파이스웍스
SQL 주입 공격 유형
공격자가 정보를 검색하거나 데이터베이스와 상호 작용하는 방식에 따라 SQL 주입 공격에는 세 가지 주요 유형이 있습니다.
- 클래식 또는 대역 내 SQLi
- 맹목적 또는 추론적 SQLi
- 대역 외 SQLi
1. 클래식 또는 대역 내 SQLi
대역 내 공격은 가장 일반적인 유형의 SQL 주입 공격입니다. 전형적인 해커는 동일한 통신 채널(대역 내)을 사용하여 악성 SQL 코드를 주입하고 결과를 검색합니다. 대역 내 SQLi의 두 가지 주요 변형은 다음과 같습니다.
통합 기반 대역 내 SQLi
이 공격은 두 개 이상의 SELECT 문의 결과에서 데이터를 결합하는 데 사용되는 UNION SQL 연산자를 활용합니다. 이를 통해 공격자는 직접 액세스할 수 없는 테이블에서 데이터를 검색할 수 있습니다.
오류 기반 대역 내 SQLi
이 기술에서 공격자는 데이터베이스에서 반환된 오류 메시지를 악용하기 위해 의도적으로 SQL 쿼리에 오류를 발생시킵니다. 오류로 인해 데이터베이스 구조, 테이블 이름, 열 이름, 때로는 데이터 자체에 대한 귀중한 정보가 드러날 수 있습니다. 오류 기반 SQLi는 대역 외 SQLi로 실행될 수도 있습니다.
2. 추론(블라인드) SQLi
블라인드 SQLi에서는 공격자가 공격 결과를 직접 볼 수 없습니다. 대신, 쿼리에 응답하는 애플리케이션 동작이나 오류 메시지를 관찰하여 정보를 추론합니다. 해커가 악용할 잠재적인 취약점을 찾기 위해 일련의 SQL 쿼리를 작성해야 하므로 이러한 유형의 공격은 시간 집약적입니다. 블라인드 SQLi의 두 가지 변형은 다음과 같습니다.
시간 기반 블라인드 SQLi
여기서 공격자는 데이터베이스가 반응하기 전에 응답을 지연시키는 쿼리를 요청합니다. 응답 시간에 주의를 기울여 데이터베이스에 대한 정보를 추론합니다.
불리언 블라인드 SQLi
Boolean blind SQLi의 경우 공격자는 애플리케이션이 SQL 쿼리의 true 또는 false 조건에 응답하는 방식을 이용합니다. 데이터베이스의 데이터가 반환되지 않더라도 웹 애플리케이션의 응답을 기반으로 데이터베이스에 대한 정보를 추론합니다.
3. 대역 외 SQLi
대역 외 SQLi 공격으로 인해 애플리케이션은 해커가 제어하는 원격 엔드포인트로 데이터를 보냅니다. 이와 같은 공격을 위해서는 SQL 서버에 HTTP(Hypertext Transfer Protocol) 요청과 같은 외부 네트워크 요청을 시작할 수 있는 것과 같은 특정 기능이 필요합니다.
SQL 주입 공격을 방지하는 방법: 치트 시트
SQL 주입을 방지하려면 보안 코딩 실행과 지속적인 모니터링을 포함하는 다계층 접근 방식이 필요합니다. 다음은 SQL 주입 공격으로부터 사용자를 안전하게 보호하는 데 도움이 되는 필수 단계가 포함된 치트 시트입니다.
준비된 진술을 사용하십시오
SQL 주입 공격에 대한 기본 방어는 매개변수화된 쿼리가 포함된 준비된 명령문입니다. 준비된 명령문은 사용자 입력이 실행 가능한 코드가 아닌 데이터로 처리되도록 보장합니다.
개발자는 쿼리에 대한 SQL 코드를 사용자의 입력 값에 대한 자리 표시자가 있는 템플릿으로 미리 컴파일합니다. 쿼리 실행 시 준비된 문은 자리 표시자 대신 실제 값을 바인딩합니다. 그러면 악성 코드 실행이 중지됩니다.
준비된 문은 동적 SQL 문보다 선호됩니다. 실행 시간 동안 SQL 쿼리를 작성하므로 주입 공격에 대한 공격이 약화됩니다.
널리 사용되는 프로그래밍 언어로 작성된 명령문:
널리 사용되는 데이터베이스 프로그래밍에서 준비된 문(매개변수화된 쿼리)을 사용하기 위한 언어별 권장 사항은 다음과 같습니다.
- Java Enterprise Edition(EE): java.sql 패키지의 ReadyStatement 클래스를 사용합니다. setString , setInt 등과 같은 메소드를 사용하여 매개변수를 바인딩합니다.
- Python(SQLite3) : 쿼리에 자리 표시자( ? )를 사용합니다. 튜플 이나 리스트를 사용하여 매개변수를 바인딩합니다.
- PHP: PHP 데이터 개체(PDO) 확장을 사용합니다. 자리표시자(:)와 함께 준비된 명령문을 활용하세요. BindValue 또는 BindParam을 사용하여 매개변수를 바인딩합니다.
- .NET : MySqlCommand 개체를 사용합니다. Parameters.AddWithValue를 사용하여 매개변수를 바인딩합니다.
또 다른 SQL 주입 방지 방법은 반복해서 사용할 수 있는 저장 프로시저나 미리 컴파일된 SQL 코드 그룹을 사용하는 것입니다.
입력 검증 연습
입력 유효성 검사에는 사용자 입력을 검사하여 처리하기 전에 특정 기준을 충족하는지 확인하는 작업이 포함됩니다. 허용 목록(화이트리스트라고도 함)은 입력 유효성 검사의 핵심 측면입니다. 여기서는 미리 정의된 안전한 값이나 패턴만 SQL 쿼리의 일부로 허용됩니다. 설정된 기준과 일치하지 않는 입력은 거부됩니다. 이는 악성이거나 예상치 못한 입력이 시스템에 유입되는 것을 적극적으로 방지합니다.
객체 관계형 매핑 라이브러리 사용
ORM(객체 관계형 매핑) 라이브러리는 관계형 데이터베이스를 사용하는 개발자에게 유용한 도구입니다. 이를 통해 개발자는 자신이 선택한 프로그래밍 언어를 사용하여 데이터베이스와 상호 작용할 수 있으므로 원시 SQL 쿼리를 작성할 필요성이 줄어듭니다. ORM 라이브러리는 SQL 주입 공격에 대한 기본 보호 기능을 제공합니다.
보안 코딩 방법에 대해 개발자와 IT 팀을 교육합니다. 취약점을 찾기 위해 정기적인 보안 감사와 침투 테스트를 수행하십시오.
팁: 보안 코드 교육 도구를 사용하여 프로그래머와 개발자가 보안 코딩을 더 빠르게 배울 수 있도록 도와주세요.
최소 권한 원칙 시행
최소 권한 원칙은 데이터베이스 사용자에게 작업을 수행하는 데 필요한 최소한의 권한만 부여합니다. 이 원칙을 따르면 잠재적인 SQL 주입 공격이나 사이버 공격의 영향이 줄어듭니다. 또한 데이터베이스에 엄격한 액세스 제어를 적용하십시오.
웹 애플리케이션 방화벽(WAF) 배포
WAF는 애플리케이션의 수신 네트워크 트래픽을 모니터링하고 잘 알려진 공격 서명 목록을 기반으로 잠재적인 악성 트래픽을 차단합니다.
상위 5개 웹 애플리케이션 방화벽(WAF) 도구:
- Azure 웹 애플리케이션 방화벽
- AWS WAF
- Imperva 웹 애플리케이션 방화벽(WAF)
- Cloudflare 스펙트럼
- Symantec Web Application Firewall 및 역방향 프록시
* 위 내용은 G2의 2023년 여름 그리드 보고서에 나온 5가지 주요 WAF 솔루션입니다.
WAF는 사전 정의된 규칙을 사용하여 SQL 키워드 및 악성 페이로드와 같은 수신 트래픽의 의심스러운 패턴과 변칙을 감지합니다. 사용자 입력을 삭제 및 검증하고 유해한 요청을 차단하거나 필터링합니다. 이는 위험한 SQL 쿼리가 시스템에 입력될 때 이를 중지하는 데 도움이 됩니다.
최신 WAF는 기계 학습을 사용하여 새로운 공격 방법에 적응합니다.
SQL 주입 공격을 방지하는 기타 보안 도구
WAF 외에도 여러 다른 보안 플랫폼이 SQL 주입 공격을 방해합니다.
- 취약점 스캐너는 웹 애플리케이션에서 알려진 취약점과 알려지지 않은 취약점을 찾습니다.
- SAST(정적 애플리케이션 보안 테스트) 도구와 정적 코드 분석 소프트웨어는 실제로 코드를 실행하지 않고도 보안 취약점을 찾아냅니다.
- 동적 애플리케이션 보안 테스트 소프트웨어는 실행 중인 애플리케이션에 대한 공격을 시뮬레이션하고 약점을 식별합니다.
- 침입 탐지 및 방지 시스템과 디지털 포렌식 소프트웨어는 애플리케이션에 대한 이상 징후와 공격을 실시간으로 조사합니다.
데이터 포트리스를 보호하세요
SQL 주입 공격은 웹 앱 보안에 심각한 위협이 됩니다. 공격이 성공하면 기업은 귀중한 데이터, 사용자 개인 정보 보호 및 좋은 평판을 잃을 위험이 있습니다.
단일 솔루션은 SQL 주입에 대한 절대적인 안전을 보장하지 않지만 여기서 설명한 예방 조치를 결합하면 공격 가능성이 크게 줄어듭니다. 웹 개발자와 데이터베이스 관리자는 엄격한 방어 조치를 취하고 잠재적인 악용에 대비해 웹 앱을 강화해야 합니다.
귀하의 웹사이트를 보호하기 위한 포괄적인 솔루션을 원하십니까? 웹 보안 소프트웨어와 이 소프트웨어가 데이터 침해로 이어지는 사이버 공격에 어떻게 도움이 되는지 알아보세요.