SQL 인젝션 (SQL Injection) - MySQL
SQL Injection
설명
SQL 인젝션은 애플리케이션에서 사용자의 입력 데이터를 SQL 쿼리문에 직접 삽입하여 실행할 때 발생하는 취약점입니다. 공격자가 쿼리문의 구조를 망가뜨리거나, 악의적인 SQL 코드를 삽입해 인증 우회, 데이터 열람/수정/삭제와 같은 불법적인 행위를 할 수 있습니다.
잠재적 영향
데이터 유출/변조(데이터 노출 및 조작): 공격자가 데이터베이스의 중요 데이터를 불법적으로 조회, 변경, 삭제할 수 있습니다.
인증 우회(인증 우회): 로그인/권한 검증 쿼리에 인젝션을 넣어 허가받지 않은 사용자가 시스템에 접근할 수 있습니다.
시스템 손상(서비스 거부 또는 시스템 파괴): 데이터베이스 구조의 삭제/변경 등으로 서비스가 마비될 수 있습니다.
해결 방법
쿼리 작성 시 항상 파라미터 바인딩(Prepared Statement, parameterized query)을 사용하세요.
사용자 입력값을 쿼리문에 직접 삽입하지 마세요.
ORM(Object-Relational Mapping)에서 제공하는 안전한 쿼리 메서드를 사용하세요.
입력값의 유효성(형식, 길이, 허용값 등)을 검증하고, 불필요한 입력값은 거부하세요.
취약한 코드 및 안전한 코드 예시
취약한 코드
안전한 코드
설명:
취약한 코드: 위 코드는 userId를 쿼리 문자열에 직접 연결합니다. 공격자는 userId에 악의적인 SQL 구문을 입력하여 쿼리 조작 및 데이터 탈취, 삭제 등의 공격이 가능합니다.
안전한 코드: 파라미터 바인딩을 사용하면 입력값이 쿼리의 변수(? 기호)에 안전하게 삽입됩니다. 데이터베이스 드라이버가 특수문자를 자동으로 이스케이프 처리하므로 SQL 인젝션 공격을 방지할 수 있습니다.
참조
Last updated