1. 개요 ✎ ⊖
Structured Query Language injection
SQL Injection은 웹 애플리케이션의 입력값 처리 취약점을 이용하여, 사용자가 입력한 데이터가 SQL 쿼리 구조에 포함되도록 조작함으로써 데이터베이스를 비정상적으로 제어하는 공격 기법이다. 주로 로그인, 검색, 회원 정보 처리 등 사용자 입력이 SQL 문과 직접 결합되는 환경에서 발생한다. OWASP Top 10에 지속적으로 포함될 정도로 대표적인 웹 보안 취약점이다.
SQL Injection은 웹 애플리케이션의 입력값 처리 취약점을 이용하여, 사용자가 입력한 데이터가 SQL 쿼리 구조에 포함되도록 조작함으로써 데이터베이스를 비정상적으로 제어하는 공격 기법이다. 주로 로그인, 검색, 회원 정보 처리 등 사용자 입력이 SQL 문과 직접 결합되는 환경에서 발생한다. OWASP Top 10에 지속적으로 포함될 정도로 대표적인 웹 보안 취약점이다.
2. 원리 ✎ ⊖

관련 영상
SQL Injection은 애플리케이션이 사용자 입력을 단순한 데이터가 아닌 SQL 명령의 일부로 해석할 때 발생한다. 공격자는 입력값에 SQL 문법을 삽입하여 원래의 쿼리 구조를 변경하고, 이를 통해 인증 우회, 데이터 조회 범위 확장, 데이터 변조 등의 행위를 수행할 수 있다. 즉, 입력 데이터가 코드에 간섭할 수 있게 입력 데이터를 적절히 바꾸는 것이다.
3. 과정 ✎ ⊖
관련 영상
이러한 공격을 수행하기 위해 공격자는 먼저 대상 웹 애플리케이션의 입력 구조를 분석해야 한다. 예를 들어 로그인 폼이나 검색창, URL 파라미터 등이 SQL 쿼리에 어떻게 반영되는지를 확인해야 한다. 이 과정에서 에러 메시지 출력 여부, 응답 결과의 변화, 시간 지연 여부 등을 통해 취약점을 탐색할 수 있다.
이후 공격자는 해당 입력값이 SQL 쿼리에 직접 결합되는 지점을 찾아낸 뒤, 조건문 구조를 조작하거나 UNION과 같은 SQL 연산자를 활용하여 데이터베이스의 다른 정보를 조회할 수 있는지 테스트한다. 경우에 따라서는 결과가 직접 출력되지 않는 환경에서도 응답 차이 또는 시간 지연을 이용해 정보를 추론하기도 한다.
마지막으로 공격자는 게시판, URL, 이메일 등의 경로를 통해 조작된 입력값을 사용자 또는 시스템에 전달하거나 직접 요청을 보내 데이터베이스를 조작하게 만든다. 이 과정이 성공하면 인증 우회, 데이터 유출, 계정 탈취 등의 결과로 이어질 수 있다.
이러한 공격을 수행하기 위해 공격자는 먼저 대상 웹 애플리케이션의 입력 구조를 분석해야 한다. 예를 들어 로그인 폼이나 검색창, URL 파라미터 등이 SQL 쿼리에 어떻게 반영되는지를 확인해야 한다. 이 과정에서 에러 메시지 출력 여부, 응답 결과의 변화, 시간 지연 여부 등을 통해 취약점을 탐색할 수 있다.
이후 공격자는 해당 입력값이 SQL 쿼리에 직접 결합되는 지점을 찾아낸 뒤, 조건문 구조를 조작하거나 UNION과 같은 SQL 연산자를 활용하여 데이터베이스의 다른 정보를 조회할 수 있는지 테스트한다. 경우에 따라서는 결과가 직접 출력되지 않는 환경에서도 응답 차이 또는 시간 지연을 이용해 정보를 추론하기도 한다.
마지막으로 공격자는 게시판, URL, 이메일 등의 경로를 통해 조작된 입력값을 사용자 또는 시스템에 전달하거나 직접 요청을 보내 데이터베이스를 조작하게 만든다. 이 과정이 성공하면 인증 우회, 데이터 유출, 계정 탈취 등의 결과로 이어질 수 있다.
4. 특징 ✎ ⊖
SQL Injection은 공격 방식에 따라 여러 형태로 나뉜다. 에러 기반 SQL Injection은 데이터베이스 오류 메시지를 이용해 구조 정보를 파악하는 방식이며, UNION 기반 SQL Injection은 여러 SELECT 결과를 결합하여 다른 테이블의 데이터를 조회하는 방식이다. 블라인드 SQL Injection은 결과가 직접 표시되지 않는 환경에서 참/거짓 응답을 이용해 데이터를 추론하는 방식이고, 시간 기반 블라인드 SQL Injection은 응답 지연 시간을 이용해 조건의 참/거짓을 판별하는 방식이다.
SQL Injection 공격이 성공할 경우 데이터베이스에 저장된 민감 정보가 유출될 수 있으며, 사용자 계정 탈취, 관리자 권한 획득, 데이터 변조 및 삭제 등이 가능해진다. 서비스 전체가 손상되거나 마비될 수 있으며, 개인정보가 포함된 경우 심각한 보안 사고로 이어질 수 있다.
SQL Injection을 방어하기 위해서는 입력값과 SQL 구조를 분리하는 것이 핵심이다.파라미터화된 쿼리를 사용하면 사용자 입력이 코드로 해석되지 않도록 할 수 있다. 또한 입력값의 검증, 최소 권한 원칙의 적용, ORM 사용, 에러 메시지를 노출하지 않는 등의 방법을 병행하면 공격 가능성을 크게 줄일 수 있다.
SQL Injection 공격이 성공할 경우 데이터베이스에 저장된 민감 정보가 유출될 수 있으며, 사용자 계정 탈취, 관리자 권한 획득, 데이터 변조 및 삭제 등이 가능해진다. 서비스 전체가 손상되거나 마비될 수 있으며, 개인정보가 포함된 경우 심각한 보안 사고로 이어질 수 있다.
SQL Injection을 방어하기 위해서는 입력값과 SQL 구조를 분리하는 것이 핵심이다.파라미터화된 쿼리를 사용하면 사용자 입력이 코드로 해석되지 않도록 할 수 있다. 또한 입력값의 검증, 최소 권한 원칙의 적용, ORM 사용, 에러 메시지를 노출하지 않는 등의 방법을 병행하면 공격 가능성을 크게 줄일 수 있다.