SQL 삽입
SQL 삽입(SQL Injection)은 공격자가 입력값에 데이터베이스 명령어(SQL)를 섞어 넣어 데이터베이스를 마음대로 조작하는 취약점입니다. 애플리케이션은 사용자가 입력한 아이디나 검색어를 SQL 문에 넣어 데이터베이스에 필요한 정보를 요청합니다. 이때 입력값을 단순히 문자열로 이어 붙여 SQL 문을 만들면, 공격자가 입력값을 조작해 원래 SQL 문의 조건이나 구조를 바꿀 수 있습니다. 예를 들어, 로그인 화면에 특수한 입력값을 넣어 비밀번호 확인 조건을 무력화하고 로그인할 수도 있습니다.
공격이 성공하면 데이터베이스에 저장된 개인정보, 계정 정보, 업무 데이터 등이 노출될 수 있습니다. 데이터가 추가, 수정, 삭제될 수도 있습니다. 애플리케이션이 쓰는 데이터베이스 계정의 권한이 높다면 피해가 더 커집니다. 공격자가 데이터베이스 관리 기능을 쓰거나, 피해가 다른 시스템으로 번질 수도 있습니다.
가장 중요한 방어 방법은 Prepared Statement(Parameterized Query)를 쓰는 것입니다. 이 방식은 SQL 문의 구조와 사용자 입력값을 분리해서 처리합니다. 입력값은 항상 데이터로만 처리되므로 SQL 문의 구조가 바뀌지 않습니다. ORM 같은 데이터 접근 프레임워크를 쓰더라도, 문자열을 이어 붙여 쿼리를 만드는 부분은 주의해야 합니다. 허용된 입력값만 받도록 검증하고, 데이터베이스 계정에는 꼭 필요한 최소한의 권한만 주는 것도 좋습니다.
SQL 삽입은 오래전부터 알려진 대표적인 인젝션(Injection) 취약점입니다. 그럼에도 지금도 실제 소프트웨어에서 계속 발견되는 중요한 보안 문제입니다.
대표 사례는 다음과 같습니다. 2008년 미국 결제 처리 업체 Heartland Payment Systems는 SQL 삽입 공격을 시작으로 약 1억 3천만 건의 카드 정보를 유출당했습니다. 또한 2023년 랜섬웨어 조직 Cl0p이 파일 전송 솔루션 MOVEit Transfer의 SQL 삽입 취약점을 악용해, 전 세계 2,700여 개 기관에서 9천만 명 이상의 개인정보를 탈취했습니다.

