SQL 인젝션(SQL Injection)은 가장 널리 알려진 웹 애플리케이션 공격 중 하나로, 공격자가 애플리케이션의 데이터베이스에 악의적인 SQL 코드를 삽입하여 민감한 정보를 탈취하거나 시스템을 조작하는 행위입니다.
이 공격은 잘못된 입력 검증과 보안이 취약한 SQL 쿼리 구조를 악용합니다.
SQL 인젝션의 기본 개념, 유형, 피해 사례, 그리고 이를 방어하는 방법에 대해 자세히 알아보겠습니다.


SQL 인젝션의 개념

SQL 인젝션은 사용자 입력 값이 제대로 검증되지 않은 상태로 SQL 쿼리 문에 포함될 때 발생합니다.
이를 통해 공격자는 다음을 수행할 수 있습니다:

  • 데이터 유출: 데이터베이스에서 민감한 정보를 추출.
  • 데이터 변경: 데이터를 수정, 삭제, 또는 삽입.
  • 권한 상승: 데이터베이스 관리자 권한 획득.
  • 서비스 거부(DoS): 데이터베이스 과부하 유발.

SQL 인젝션의 주요 유형

1. Classic SQL Injection (클래식 SQL 인젝션)

사용자 입력을 통해 직접적으로 악성 SQL 코드를 삽입합니다.

예시:

 
SELECT * FROM users WHERE username = 'admin' --' AND password = '1234';
  • '--는 주석으로 처리되어 이후의 코드가 무시됩니다.
  • 결과적으로 비밀번호 조건 없이 모든 사용자 데이터를 조회합니다.

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

결과를 직접 확인할 수 없을 때, 참/거짓 질문을 통해 데이터를 추출합니다.

예시:

SELECT * FROM users WHERE id = 1 AND 1=1; -- 참인 경우 결과 반환  
SELECT * FROM users WHERE id = 1 AND 1=2; -- 거짓인 경우 결과 반환 없음

이 방식을 통해 데이터베이스의 구조를 유추합니다.


3. Union-based SQL Injection (유니온 기반 SQL 인젝션)

UNION 키워드를 사용하여 여러 SQL 쿼리의 결과를 결합해 데이터를 추출합니다.

예시:

SELECT username, password FROM users WHERE id = 1 UNION SELECT version(), user();

이 코드는 데이터베이스 버전과 사용자 정보를 추가로 반환합니다.


4. Error-based SQL Injection (에러 기반 SQL 인젝션)

의도적으로 쿼리에 오류를 발생시켜 데이터베이스의 정보를 노출시킵니다.

예시:

SELECT * FROM users WHERE id = 1 AND extractvalue(1,concat(0x7e,(SELECT @@version),0x7e));
  • 오류 메시지에 데이터베이스 정보가 포함되어 있을 수 있습니다.

5. Second Order SQL Injection (2차 SQL 인젝션)

공격자가 데이터베이스에 저장된 값을 활용해 악성 SQL 코드를 실행합니다.

  • 이 공격은 즉시 실행되지 않으며, 저장된 데이터가 다시 호출될 때 실행됩니다.

SQL 인젝션의 피해 사례

  1. 대규모 데이터 유출
    • 2019년, Quest Diagnostics의 SQL 인젝션 취약점으로 약 1200만 건의 환자 데이터가 유출.
  2. 웹사이트 손상
    • 소규모 웹사이트에서 SQL 인젝션을 통해 관리자 계정 탈취 후 사이트를 변조.
  3. 금융 정보 탈취
    • SQL 인젝션을 사용하여 신용카드 정보와 금융 거래 데이터를 불법 수집.

SQL 인젝션 방어 방법

1. 입력 검증 및 필터링

  • 사용자의 입력 값에서 특수문자(', --, ;` 등)를 필터링.
  • 화이트리스트를 활용하여 허용된 값만 입력받기.

2. Prepared Statements와 Parameterized Queries

  • SQL 문에 사용자의 입력값을 직접 포함하지 않고, 파라미터 바인딩을 사용.

안전한 예시 (파라미터화된 쿼리):

cursor.execute("SELECT * FROM users WHERE username = ? AND password = ?", (username, password))

3. ORM(Object-Relational Mapping) 사용

  • SQL 쿼리 대신 ORM 도구(Django ORM, SQLAlchemy 등)를 사용하여 데이터베이스와 상호작용.

4. 권한 관리

  • 데이터베이스 사용자 계정별로 최소 권한을 설정하여 중요한 데이터 접근을 제한.

5. 보안 모니터링

  • 웹 애플리케이션 방화벽(WAF)을 사용하여 SQL 인젝션 시도를 탐지 및 차단.
  • 로그 모니터링 및 알림 시스템 활용.

결론

SQL 인젝션은 오래된 공격 방식이지만 여전히 보안 사고의 주요 원인으로 자리 잡고 있습니다.
안전한 코딩 관행과 보안 설정을 준수하면 SQL 인젝션으로 인한 위협을 효과적으로 방어할 수 있습니다.
지속적인 보안 점검과 모의해킹을 통해 애플리케이션의 안전성을 유지하는 것이 중요합니다.


 

+ Recent posts