IT이야기/보안

SQL 인젝션(SQL Injection): 웹 애플리케이션 보안 위협과 대응 전략

Chiba-in 2025. 3. 1. 17:30

🔹 SQL 인젝션이란?

1. SQL 인젝션(SQL Injection)의 정의

SQL 인젝션(SQL Injection)웹 애플리케이션의 취약점을 이용해 악의적인 SQL 코드를 삽입하여 데이터베이스를 조작하는 사이버 공격 기법입니다. 공격자는 이를 통해 데이터를 탈취, 조작, 삭제하거나 관리자 권한을 획득할 수 있습니다.

SQL 인젝션의 주요 특징:

  • 데이터베이스의 기밀 정보(사용자 계정, 비밀번호 등) 탈취 가능
  • 데이터 조작을 통해 악성 코드 삽입 및 시스템 장애 유발 가능
  • 관리자 계정 탈취 후 웹사이트 완전 제어 가능
  • 웹 애플리케이션의 보안 취약점을 노린 대표적인 해킹 기법

📌 SQL 인젝션 공격은 기업, 금융 기관, 전자상거래 사이트 등 데이터베이스를 다루는 모든 웹 애플리케이션에서 발생할 수 있습니다.


🔹 SQL 인젝션 공격 기법

1. 기본 SQL 인젝션(Basic SQL Injection)

가장 일반적인 SQL 인젝션 공격으로, 단순한 SQL 문을 삽입하여 인증을 우회하거나 데이터를 조회하는 방식

✔️ 기본 SQL 인젝션 예제:

SELECT * FROM users WHERE username = 'admin' --' AND password = 'password';
  • '-- 이후의 내용은 주석 처리되어 공격자가 인증을 우회할 수 있음

📌 입력값을 검증하지 않으면 공격자가 SQL 문을 조작하여 관리자 권한을 획득할 수 있습니다.

2. 블라인드 SQL 인젝션(Blind SQL Injection)

데이터베이스의 응답을 직접 확인할 수 없는 경우, 참(True) 또는 거짓(False) 응답을 통해 정보를 유추하는 방식

✔️ 블라인드 SQL 인젝션 예제:

SELECT * FROM users WHERE username = 'admin' AND 1=1; -- (참, 로그인 성공)
SELECT * FROM users WHERE username = 'admin' AND 1=2; -- (거짓, 로그인 실패)

📌 공격자는 참과 거짓의 응답을 비교하여 데이터베이스 구조 및 내용을 추론할 수 있습니다.

3. 타임 기반 SQL 인젝션(Time-Based SQL Injection)

쿼리 실행 시간을 조작하여 데이터베이스의 응답을 기반으로 정보를 추출하는 방식

✔️ 타임 기반 SQL 인젝션 예제:

SELECT * FROM users WHERE username = 'admin' AND IF(1=1, SLEEP(5), 0);

📌 이 명령어를 실행하면 데이터베이스가 5초 동안 응답하지 않아 참(True)인지 확인할 수 있습니다.

4. UNION 기반 SQL 인젝션(Union-Based SQL Injection)

SQL의 UNION 연산자를 사용하여 추가적인 데이터를 불러오는 방식

✔️ UNION 기반 SQL 인젝션 예제:

SELECT username, password FROM users WHERE id = 1 UNION SELECT username, password FROM admin;

📌 공격자는 데이터베이스 내의 중요 정보를 추가적으로 조회할 수 있습니다.


🔹 SQL 인젝션 공격을 방어하는 방법

1. 입력값 검증(Input Validation) 적용

사용자가 입력한 값이 SQL 문법에 영향을 미치지 않도록 입력값을 철저히 검증해야 합니다.

✔️ 입력값 검증 방법:

  • 화이트리스트(허용된 문자만 입력 가능) 적용
  • 특수 문자(', --, ;, /* */ 등) 제거
  • 예상하지 않은 긴 문자열 입력 제한

📌 사용자가 입력한 값이 그대로 SQL 쿼리에 반영되지 않도록 주의해야 합니다.

2. SQL 프리페어드 스테이트먼트(Prepared Statement) 사용

SQL 프리페어드 스테이트먼트를 사용하면 입력값이 쿼리 구조와 분리되어 공격을 방지할 수 있습니다.

✔️ 프리페어드 스테이트먼트 적용 예제 (PHP & MySQL):

$stmt = $conn->prepare("SELECT * FROM users WHERE username = ? AND password = ?");
$stmt->bind_param("ss", $username, $password);
$stmt->execute();

📌 프리페어드 스테이트먼트를 사용하면 SQL 문과 사용자 입력값이 분리되므로 SQL 인젝션이 차단됩니다.

3. 최소 권한 원칙 적용

데이터베이스 사용자 계정에 최소한의 권한만 부여하여 피해를 최소화해야 합니다.

✔️ 보안 강화를 위한 권한 설정:

  • 웹 애플리케이션 계정에는 SELECT, INSERT, UPDATE 권한만 부여
  • 관리자 계정과 일반 사용자 계정을 분리하여 사용
  • DROP, DELETE 등의 위험한 권한 제한

📌 최소 권한 원칙을 적용하면 SQL 인젝션 공격이 발생하더라도 피해를 최소화할 수 있습니다.

4. 웹 애플리케이션 방화벽(WAF) 사용

웹 애플리케이션 방화벽(WAF)은 SQL 인젝션 공격 패턴을 실시간으로 감지하고 차단하는 역할을 합니다.

✔️ 대표적인 WAF 솔루션:

  • ModSecurity (오픈소스 WAF)
  • AWS WAF, Cloudflare WAF (클라우드 기반 보안 서비스)
  • 기업 내부 보안 솔루션 연계 적용

📌 WAF를 적용하면 SQL 인젝션을 포함한 다양한 웹 공격을 효과적으로 방어할 수 있습니다.


📌 결론

SQL 인젝션은 웹 애플리케이션의 보안 취약점을 악용하여 데이터베이스를 조작하는 위험한 공격 기법입니다.
입력값 검증, 프리페어드 스테이트먼트 사용, 최소 권한 원칙 적용 등 다양한 보안 조치를 통해 SQL 인젝션을 방어해야 합니다.
웹 애플리케이션 방화벽(WAF)을 활용하여 실시간으로 SQL 인젝션 공격을 차단할 수 있습니다.
개발자는 보안 모범 사례를 준수하고, 보안 취약점을 지속적으로 점검해야 합니다.

🚀 지금 바로 보안 점검을 수행하고, SQL 인젝션 공격으로부터 웹 애플리케이션을 보호하세요!