SQL Injection은 웹 애플리케이션의 보안 취약점을 이용하여 악의적인 SQL 문을 실행시키는 공격 방법입니다.
이 공격으로 인해 데이터베이스의 정보를 탈취하거나 조작할 수 있으며, 심각한 경우에는 시스템을 완전히 제어할 수도 있습니다.
논리적 오류를 이용한 인증 우회
로그인 폼에 OR 1=1 --
와 같은 조건문을 입력하여 항상 참이 되도록 하여 인증을 우회하는 방식입니다.
에러 기반 공격
잘못된 SQL문을 입력하여 데이터베이스의 에러 메시지
를 통해 정보를 얻는 방식입니다.
예를 들어, UNION SELECT @@version --
와 같은 문장을 입력하여 데이터베이스의 버전 정보를 알아낼 수 있습니다.
블라인드 공격
데이터베이스의 에러 메시지가 출력되지 않는 경우에 사용하는 방식입니다.
참과 거짓을 판별할 수 있는 조건문을 반복적으로 입력
하여 데이터베이스의 정보를 하나씩 추출하는 방식입니다.
예를 들어, AND (SELECT SUBSTRING(password,1,1) FROM users WHERE id='admin')='a' --
와 같은 문장을 입력하여 admin의 비밀번호의 첫 글자가 a인지 확인할 수 있습니다.
입력 값 검증
사용자로부터 입력 받은 값에 대해 필터링하거나 검증하는 과정이 필요합니다.
예를 들어, SQL문에 사용되는 특수 문자나 예약어를 필터링하거나, 정규 표현식을 이용하여 입력 값의 형식을 검증할 수 있습니다.
파라미터화된 쿼리 사용
SQL문에 직접 값을 삽입하는 대신에 파라미터를 사용하는 방식입니다.
파라미터는 데이터베이스에 전달되기 전에 타입과 길이가 검사되므로 SQL Injection 공격을 방지할 수 있습니다.
예를 들어, SELECT * FROM users WHERE id=? AND password=?
와 같은 쿼리를 사용하고, ?
에 해당하는 값을 별도로 전달하는 방식입니다.
저장 프로시저 사용하기
저장 프로시저는 데이터베이스에 미리 정의된 SQL 문의 집합입니다.
저장 프로시저를 사용하면 SQL 문을 별도로 작성하지 않아도 되므로, SQL Injection 공격에 취약한 코드를 줄일 수 있습니다. 하지만 저장 프로시저 자체가 안전한 것은 아니므로, 사용자 입력값에 대한 검증과 필터링은 여전히 필요합니다.
최소 권한 원칙 적용
데이터베이스에 접근하는 계정의 권한을 최소한으로 제한하는 것입니다.
예를 들어, SELECT 문만 필요한 경우에는 INSERT나 UPDATE나 DELETE 문을 실행할 수 없도록 하는 것입니다. 이렇게 하면 SQL Injection 공격으로 인한 피해를 최소화할 수 있습니다.