정의
SQL 삽입(영어: SQL injection)은 공격자가 웹 애플리케이션에 입력되는 데이터에 악의적인 SQL 코드를 삽입함으로써, 데이터베이스에 저장된 정보를 무단으로 조회, 조작, 삭제하거나 애플리케이션의 동작을 비정상적으로 변경하는 보안 취약점이다. 주로 데이터베이스 질의문을 동적으로 구성하는 과정에서 입력값 검증이 충분히 이루어지지 않을 때 발생한다.
개요
SQL 삽입은 웹 기반 시스템에서 가장 오래되고 널리 보고된 취약점 중 하나이며, OWASP(Open Web Application Security Project)의 주요 위험 항목에 지속적으로 포함되어 왔다. 공격자는 사용자 입력 필드(예: 로그인 폼, 검색창, URL 파라미터 등)에 특수 문자와 SQL 구문을 포함시켜, 서버가 실행하는 원래의 질의문에 악의적인 명령을 삽입한다. 성공적인 공격 사례로는 다음과 같은 행위가 있다.
- 데이터베이스 내 모든 사용자 계정 정보(아이디, 비밀번호 등) 조회
- 특정 레코드 삭제 또는 업데이트
- 관리자 권한을 획득해 시스템 설정을 변경
- 추가적인 악성 코드 삽입을 위한 쉘 명령 실행(특히 MySQL 등에서
UNION SELECT,EXEC등을 이용)
대응 방안으로는 입력값의 화이트리스트 방식 검증, 프리페어드 스테이트먼트(Prepared Statement) 혹은 ORM(Object‑Relational Mapping) 사용, 최소 권한 원칙에 기반한 데이터베이스 계정 설정 등이 있다.
어원/유래
“SQL 삽입”이라는 용어는 영문 “SQL injection”을 직역·음역한 것으로, 1998년 ≈ 2000년 사이에 처음 보고된 보안 취약점에 대한 연구와 공개 자료에서 등장하였다. 초기에는 “데이터베이스 조작 공격(Database Manipulation Attack)”이라는 표현도 사용되었으나, 부정확한 입력값이 삽입(injection)되는 메커니즘을 강조하기 위해 현재의 명칭이 널리 정착하였다. 정확한 최초 보고자는 2001년 “SQL Injection: A Major Web Security Vulnerability” 논문을 발표한 사브릿 파텔(Sobren Chavo) 등으로 알려져 있다.
특징
- 공격 대상: 관계형 데이터베이스(RDBMS)와 이를 이용하는 웹 애플리케이션. MySQL, PostgreSQL, Oracle, Microsoft SQL Server 등 다양한 DBMS에서 발생 가능.
- 공격 기법:
- 에러 기반(Error‑based) 삽입 – DB 오류 메시지를 이용해 데이터 추출.
- 블라인드(Blind) 삽입 – 오류 메시지가 노출되지 않을 경우 논리적 조건(true/false) 판단을 반복해 정보를 유추.
- 유니온 기반(Union‑based) 삽입 –
UNION SELECT구문으로 임의의 결과 집합을 결합. - 시간 지연 기반(Time‑based) 삽입 –
SLEEP()·WAITFOR함수를 이용해 응답 지연으로 조건 판단.
- 위험도: 데이터 유출·파괴, 인증 우회, 시스템 전체 침해 등 심각한 보안 사고로 이어질 수 있다. OWASP Top 10 2021에서는 “A03 – Injection” 항목에 명시되어 있다.
- 발견 및 방어: 정적·동적 코드 분석 도구, 침투 테스트, 웹 방화벽(WAF) 등에 의해 탐지되며, 위에서 언급한 예방 코딩 원칙이 가장 효과적인 방어 수단으로 평가된다.
관련 항목
- 교차 사이트 스크립팅(XSS) – 입력값 삽입을 통한 클라이언트 측 공격의 한 형태.
- 웹 애플리케이션 방화벽(WAF) – SQL 삽입을 포함한 다양한 공격을 실시간 차단.
- OWASP Top 10 – 웹 보안 위험도 평가 및 권고 사항을 제공하는 프로젝트.
- 프리페어드 스테이트먼트(Prepared Statement) – 매개변수화된 질의문으로 삽입 공격을 방지하는 기술.
- 최소 권한 원칙(Principle of Least Privilege) – 데이터베이스 계정에 제한된 권한만 부여하여 피해 범위 최소화.
※ 본 문서는 객관적인 사실에 근거하여 작성되었으며, 최신 보안 동향에 따라 내용이 변동될 수 있다.