SQL 인젝션(SQLi)은 사이버 범죄자가 사용자 이름 또는 암호와 같은 일반 입력 또는 양식 필드에 SQL 쿼리를 삽입하여 애플리케이션 코드의 취약성을 악용하려고 시도하는 공격 유형입니다.
웹 애플리케이션은 사용자 입력을 기반으로 SQL 쿼리를 생성하여 데이터베이스와 상호작용 하는데요. 하지만 입력 데이터에 대한 검증이 제대로 이루어지지 않을 경우, 공격자는 입력 필드에 악성 SQL 코드를 주입해 데이터베이스를 제어할 수 있습니다.
SQL 인젝션은 공격 방식에 따라 4가지 유형으로 나뉘며, 각각의 특징과 작동 원리가 다른데요. 각 공격 유형을 정확히 이해하고 그에 맞는 보안 대책을 마련하는 것이 중요합니다.
1️⃣ Error based SQL Injection
데이터베이스에서 발생하는 오류 메시지를 통해 데이터베이스 구조나 정보를 파악하는 공격 기법입니다. 공격자는 SQL 쿼리에서 의도적으로 오류를 발생시켜 오류 메시지에 나타나는 정보를 통해 테이블명, 컬럼 구조, 데이터 내용 등 데이터베이스의 정보를 추론합니다.
-상세 오류 메시지를 숨기거나(500 internal같은 일반적인 에러 코드 반환) 오류 정보는 서버의 로그에만 기록되도록 설정합니다. -사용자 입력값 자체를 검증, 필터링할 수도 있습니다.
2️⃣ Union SQL Injection
SQL의 UNION 명령어를 사용하여 원래 쿼리에 악의적인 쿼리를 삽입하고, 두 쿼리의 결과를 합쳐서 정보를 탈취하는 공격 기법입니다. 공격자는 UNION 명령어를 사용하여 원본 쿼리와 동일한 형태의 악성 쿼리를 추가하여, 사용자 정보, 로그인 계정, 시스템 정보 등을 탈취합니다.
-파라미터화된 쿼리를 사용하여 쿼리와 데이터가 분리되도록 합니다.
$stmt = $conn->prepare("SELECT * FROM users WHERE username = ? AND password = ?");
$stmt->bind_param("ss", $username, $password); // "ss"는 두 개의 문자열을 바인딩
$stmt->execute();
-ORM을 사용하면 SQL 쿼리를 직접 작성하지 않고 객체 지향적인 방식으로 데이터베이스를 다룰 수 있습니다. 대부분의 ORM 라이브러리는 내부적으로 파라미터화된 쿼리를 사용하여 SQL Injection을 방지합니다.
-sql 쿼리에서 반환되는 결과 개수를 제한하여 해커가 쿼리 결과를 합성하는 것을 어렵게 만들 수 있습니다.
-사용자 입력값 자체를 검증, 필터링할 수도 있습니다.
3️⃣ Blind SQL Injection
오류 메시지를 확인할 수 없는 환경에서 참/거짓 판단을 통해 데이터베이스 정보를 유추하는 공격 기법입니다. 공격자는 SQL 쿼리에 조건을 삽입하고, 서버 응답 결과나 응답 시간을 통해 조건의 참/거짓을 판별합니다. 이를 여러 번 반복해 데이터베이스 정보를 점진적으로 탈취합니다.
-파라미터화된 쿼리를 사용하여 쿼리와 데이터가 분리되도록 합니다.
-ORM을 사용하여 간접적으로 파라미터화된 쿼리를 사용합니다.
-사용자 입력값 자체를 검증, 필터링할 수도 있습니다.
4️⃣ Stored Procedure SQL Injection
데이터베이스에 저장된 저장 프로시저(Stored Procedure)의 취약점을 이용하는 공격 기법입니다. 저장 프로시저는 미리 컴파일된 SQL 코드를 저장하여 실행하는 데이터베이스 객체인데요. 공격자는 저장 프로시저에 악성 SQL 코드를 삽입하여 데이터베이스를 제어합니다. 저장 프로시저의 권한을 이용하여 데이터베이스 전체를 장악할 수 있다는 점에서 위험성이 높습니다.
-저장 프로시저를 실행하는 데이터베이스 계정에 최소한의 권한만 부여합니다. 예를들어 select권한만 부여하고 delete나 update권한을 제한할 수 있습니다.
-파라미터화된 쿼리를 사용하여 쿼리와 데이터가 분리되도록 합니다.
-ORM을 사용하여 간접적으로 파라미터화된 쿼리를 사용합니다.
-사용자 입력값 자체를 검증, 필터링할 수도 있습니다.
-입력길이를 제한 할 수 있습니다.
#저장 프로시저 (Stored Procedure)는 데이터베이스 내에 저장되어 반복적으로 실행할 수 있는 SQL 코드 블록입니다. 간단히 말하면, 저장 프로시저는 미리 정의된 SQL 명령문을 하나의 단위로 묶어서 데이터베이스에서 실행할 수 있도록 저장하는 것입니다.
https://www.skshieldus.com/blog-security/security-trend-idx-45
'대외활동 > UMC 8기' 카테고리의 다른 글
4주차. spring web MVC-DispatcherServlet (0) | 2025.04.07 |
---|---|
3주차. API URL의 설계 & 프로젝트 세팅 (0) | 2025.03.31 |
2주차. 실전 SQL - 어떤 Query를 작성해야 할까? (0) | 2025.03.24 |
1주차. Database 설계 (0) | 2025.03.22 |
0주차. CIDR이란? (0) | 2025.03.21 |