SQL - 2025년12월13일
SQL
SQL Injection
개념 및 정의
SQL Injection은 악의적인 사용자가 SQL 쿼리문에 비정상적인 SQL 코드를 삽입하여 데이터베이스를 공격하는 보안 취약점입니다. 웹 애플리케이션의 입력 필드나 URL 매개변수 등을 통해 악의적인 SQL 명령어를 주입하고, 이를 데이터베이스에서 실행하게 함으로써 권한 없이 데이터에 접근하거나 조작할 수 있습니다.
문제점
- 데이터 유출: 데이터베이스의 민감한 정보(사용자 계정, 개인정보 등)가 노출될 수 있습니다.
- 데이터 손상: 악의적으로 데이터를 삭제하거나 수정할 수 있습니다.
- 인증 우회: 로그인 인증을 우회하여 관리자 권한으로 접근할 수 있습니다.
- 시스템 제어: 데이터베이스 서버에 대한 제어권을 얻을 수 있습니다.
SQL Injection 예시:
-- 정상적인 쿼리
SELECT * FROM users WHERE id = 'user_input' AND password = 'password_input'
-- 악의적인 입력 (id: ' OR '1'='1)
SELECT * FROM users WHERE id = '' OR '1'='1' AND password = 'password_input'
-- 결과: 모든 사용자 정보가 반환됨
예방 방법
- Prepared Statement 사용
- 쿼리의 구조와 데이터를 분리하여 입력값을 매개변수로 처리합니다.
-- 안전한 방법 (Prepared Statement)
PREPARE stmt FROM 'SELECT * FROM users WHERE id = ? AND password = ?'
EXECUTE stmt USING user_input, password_input
- 입력값 검증 및 필터링
- 사용자 입력값의 길이, 형식, 타입을 검증합니다.
- 특수문자(‘ “ ; – /* */ 등)를 제거하거나 이스케이프 처리합니다.
- 이스케이프 처리
- 쿼리에 포함되는 모든 문자열을 적절히 이스케이프 처리합니다.
# Python 예시
escaped_input = input_value.replace("'", "''")
- 최소 권한 원칙 (Least Privilege)
- 데이터베이스 계정에 필요한 최소한의 권한만 부여합니다.
- 읽기 전용 계정, 특정 테이블만 접근 가능한 계정 등으로 제한합니다.
- 에러 메시지 제한
- 데이터베이스 에러 메시지를 사용자에게 노출하지 않습니다.
- 일반적인 에러 메시지만 반환하도록 처리합니다.
- 웹 애플리케이션 방화벽 (WAF)
- SQL Injection 패턴을 탐지하고 차단하는 WAF 솔루션을 사용합니다.
- 정기적인 보안 감시 및 로깅
- 의심스러운 SQL 쿼리를 모니터링하고 로깅합니다.
- 정기적인 보안 감사를 수행합니다.