SQL Injection
개요
SQL 인젝션은 공격자가 애플리케이션의 데이터베이스 쿼리에 악의적인 SQL 코드를 삽입할 수 있는 웹 보안 취약점입니다. 입력 필드에 악성 코드를 주입함으로써 공격자는 민감한 데이터를 조회하거나, 데이터베이스 내용을 수정하거나, 관리자 권한을 획득하는 등의 비인가된 작업을 수행할 수 있습니다.

🚨 공격 조건과 작동 원리
SQL 인젝션 공격이 성공하려면 다음 조건이 충족되어야 합니다:
- 애플리케이션이 사용자 입력을 적절히 검증하거나 매개변수화하지 않고 SQL 쿼리에 직접 사용해야 합니다.
- 공격자가 데이터베이스와 상호작용하는 입력 필드(예: 로그인 폼, 검색창)를 식별할 수 있어야 합니다.
- 데이터베이스 서버가 애플리케이션의 요청으로 악성 쿼리를 실행해야 합니다.
공격은 일반적으로 다음 단계를 따릅니다:
- 공격자가 취약한 입력 필드(예: 로그인 폼, 검색창)를 식별합니다.
-
공격자가 입력 필드에 악성 SQL 코드를 제출합니다. 예를 들어, 로그인
폼의 사용자 이름 필드에
' OR '1'='1
을 입력하면 인증을 우회할 수 있습니다. - 애플리케이션이 검증되지 않은 입력으로 SQL 쿼리를 구성하여 예상치 못한 동작을 유발합니다.
- 데이터베이스가 변경된 쿼리를 실행하여 민감한 데이터 노출, 레코드 수정 또는 기타 악의적인 작업을 수행합니다.
예제
애플리케이션이 다음과 같은 SQL 쿼리를 구성하는 로그인 폼을 생각해 봅시다:
SELECT * FROM users WHERE username = 'input' AND password =
'input';
공격자가 사용자 이름 필드에 ' OR '1'='1' --
를
입력하면 쿼리는 다음과 같이 변합니다:
SELECT * FROM users WHERE username = '' OR '1'='1' --' AND
password = 'input';
--
는 쿼리의 나머지 부분을 주석 처리하고,
'1'='1'
은 항상 참이므로, 공격자는 유효한 자격 증명
없이 로그인할 수 있습니다.
🔒 예방 방법
Prepared Statement
Prepared Statement를 사용하여 SQL 코드와 사용자 입력을 분리하고, 입력이 실행 가능한 코드가 아닌 데이터로 처리되도록 합니다.
입력 검증 및 정제
모든 사용자 입력을 예상된 형식에 맞게 검증하고 정제하여 특수 문자를 필터링합니다.
사용자 입력 이스케이프
매개변수화 쿼리가 불가능한 경우, 사용자 입력의 특수 문자를 적절히 이스케이프하여 쿼리 구조를 변경하지 못하도록 합니다.
최소 권한 원칙
애플리케이션에 필요한 최소한의 데이터베이스 권한만 부여하여 공격 성공 시 영향을 줄입니다.
ORM 사용
SQLAlchemy나 Hibernate와 같은 객체-관계 매핑(ORM) 도구는 SQL 인젝션에 대한 내장 보호 기능을 제공합니다.