Computer >> 컴퓨터 >  >> 네트워킹 >> 네트워크 보안

SQL 인젝션(SQLi) 공격 완벽 가이드: 개념부터 예방법까지

다양한 웹 애플리케이션은 백엔드 기능을 제공하기 위해 데이터베이스 시스템을 활용합니다. 데이터베이스를 조회·조작·관리하는 데 가장 널리 쓰이는 언어가 바로 SQL(Structured Query Language)입니다. 그러나 전 세계 웹 애플리케이션에서 SQL이 광범위하게 사용되는 만큼, SQL 기반 데이터베이스는 해커들에게 손쉽고 빈번한 공격 대상이 되며, 피해의 심각성은 각 시스템의 구조와 보안 수준에 따라 크게 달라집니다.

SQL 인젝션 공격이란?

SQL 인젝션(SQL Injection, SQLi) 공격은 현재 가장 흔하게 발생하는 웹 해킹 기법 중 하나로, 공격자가 웹 페이지의 입력 필드를 이용해 SQL 문에 악성 코드를 삽입하는 공격입니다. 웹 페이지가 사용자명이나 사용자 ID 같은 입력값을 요구할 때 발생하기 쉬우며, 공격자는 이 틈을 이용해 SQL 문을 주입하여 사용자가 모르는 사이에 데이터베이스에서 실행되도록 만듭니다.

SQL 인젝션 공격의 진행 과정

이러한 공격이 미치는 영향은 웹 애플리케이션이 공격자가 제공한 데이터를 어떻게 처리하고 SQL 문을 구성하는지에 따라 달라집니다. 그 결과로 나타날 수 있는 보안 위협은 인증 우회부터 정보 유출, 다른 사용자에게 악성 코드 확산까지 매우 다양합니다. 특히 WordPress, PHP, Joomla 등 수많은 웹 플랫폼이 SQL 데이터베이스를 지원하기 때문에 위험은 전체 웹사이트 생태계 전반에 걸쳐 존재합니다.

SQL 인젝션 공격 성공 시 발생하는 피해

SQL 인젝션은 심각도가 높은 취약점으로 분류됩니다. 실제 피해 규모는 공격자의 기술력과 상상력, 그리고 데이터베이스 서버에 최소 권한 계정만 허용하는 것과 같은 방어 조치가 마련되어 있는지에 따라 결정됩니다.

일단 시스템이 침해되면, 데이터베이스가 지금까지 숨겨왔던 방대한 양의 민감한 정보가 공격자의 손에 넘어갑니다. 공격자는 데이터베이스에서 민감한 데이터를 탈취하거나, DBMS 종료와 같은 관리 작업을 실행하고, DBMS 파일 시스템에 있는 특정 파일의 내용을 열람할 수 있으며, 경우에 따라서는 운영체제 자체를 장악할 수도 있습니다.

SQL 인젝션이 발생하면 일반적으로 다음과 같은 공격이 가능해집니다.

  1. 공격자는 아무런 자격 증명 없이 인증을 우회하여 애플리케이션에 로그인할 수 있으며, 잠재적으로 관리자 권한까지 획득할 수 있습니다.
  2. 공격자는 데이터베이스 내용을 변조하여 데이터 무결성을 훼손하거나, 웹 페이지를 위조(디페이싱)하거나, 정상적인 웹사이트에 악성 콘텐츠를 삽입할 수 있습니다.
  3. 공격자는 데이터베이스에서 로그나 감사(audit) 정보를 삭제하여 데이터 가용성을 침해할 수 있습니다.
  4. 공격자는 데이터베이스를 통한 명령 실행으로 호스트 운영체제의 정상 작동을 위협할 수 있습니다.

SQL 인젝션 공격으로부터 사이트를 지키는 방법

SQL 인젝션은 전 세계 웹 애플리케이션을 위협하는 가장 흔한 애플리케이션 계층 공격 중 하나지만, 역설적으로 코드 차원에서는 매우 간단하게 예방할 수 있습니다.

핵심적인 접근법은 첫째, 사용자가 입력한 데이터를 검증하는 것이고, 둘째, 어떤 형태의 사용자 입력도 SQL 명령의 논리적 의미를 변경할 수 없도록 SQL 문을 구성하는 것입니다.

1. 입력값 검증(Input Validation)

입력값 검증에는 블랙리스트 방식과 화이트리스트 방식 두 가지가 있습니다. 블랙리스트 방식은 사용자 입력에서 이미 알려진 악성 문자를 제거하거나 대체하는 방법입니다. 널리 사용되지만 화이트리스트만큼 효과적이지는 못합니다. 공격자가 필터를 우회하여 악성 SQL 문을 주입할 여지가 남아 있기 때문입니다. 반면 화이트리스트 방식은 사용자 입력의 모든 문자를 하나하나 검사하여, 허용 목록에 부합하는 문자로만 구성된 입력만 통과시킵니다.

2. 안전한 SQL 문 작성

철저한 입력값 검증에 더해, ASP.NET에서는 파라미터화된 쿼리(parameterized query), Java에서는 프리페어드 스테이트먼트(prepared statement)를 사용하는 등 웹 애플리케이션을 구성하는 각 언어에 맞는 안전한 쿼리 기법을 반드시 적용해야 합니다. 이렇게 SQL 문을 강화하면, 쿼리가 데이터베이스에 전달되기 전에 위험한 문자들이 이스케이프 처리되므로 악성 코드가 실행될 여지를 원천적으로 차단할 수 있습니다.

3. 정기적인 보안 감사

정적(static) 및 동적(dynamic) 테스트를 활용해 애플리케이션에 잠재적인 SQL 인젝션 취약점이 없는지 정기적으로 점검하는 습관이 필요합니다.

Astra를 통한 SQL 인젝션 방어

Astra의 웹 애플리케이션 방화벽(WAF)은 실시간 스캔을 통해 SQL 인젝션을 비롯한 흔한 웹 애플리케이션 취약점을 완화합니다. 클라우드 기반 보안 플랫폼을 통해 애플리케이션 보안 프로그램을 손쉽게 관리하고, 진행 상황을 추적하며, e-learning 교육 자료를 통해 직원들이 SQL 인젝션 등 보안 취약점을 예방하고 수정하는 방법을 학습하도록 지원합니다.