본문 바로가기
보안

코드 인젝션(Code Injection)과 SQL 인젝션(SQL Injection): 웹 보안의 핵심 이슈

by 낭만뚱랑이 2024. 11. 27.
반응형

 

안녕하세요! 오늘은 웹 애플리케이션 개발자와 보안 전문가 모두가 반드시 알고 있어야 할 **코드 인젝션(Code Injection)**과 **SQL 인젝션(SQL Injection)**에 대해 알아보겠습니다. 이 두 가지는 해커가 시스템을 공격하는 데 사용하는 대표적인 기법으로, 제대로 이해하고 방어해야 안전한 시스템을 구축할 수 있습니다.


1. 코드 인젝션이란?

코드 인젝션은 공격자가 외부 입력을 통해 애플리케이션에 악성 코드를 삽입하고 실행시키는 공격 기법입니다. 애플리케이션이 사용자 입력을 적절히 검증하지 않으면 시스템의 동작을 해커가 원하는 방향으로 조작할 수 있습니다.

코드 인젝션의 유형

  1. OS 명령어 인젝션
    • 공격자가 운영 체제 명령어를 삽입하여 시스템 명령을 실행.
    • 예: ping, rm, ls 등.
  2. 스크립트 인젝션
    • JavaScript, Python, PHP 등 스크립트 언어를 악용.
    • 예: 크로스 사이트 스크립팅(XSS).
  3. 코드 삽입
    • 애플리케이션의 내부 코드 흐름을 변경하거나 악성 코드를 추가.

예시: OS 명령어 인젝션

 
# 공격자의 입력
; rm -rf /important-data

2. SQL 인젝션이란?

**SQL 인젝션(SQL Injection)**은 데이터베이스와 상호작용하는 애플리케이션에 SQL 쿼리를 삽입하여, 데이터베이스를 조작하거나 정보를 탈취하는 공격 기법입니다. 웹 애플리케이션의 취약점 중 가장 흔하게 발생하며, 심각한 데이터 유출을 초래할 수 있습니다.

SQL 인젝션의 작동 원리

  • SQL 쿼리를 작성할 때 사용자의 입력을 그대로 포함하는 경우 발생.
  • 공격자가 SQL 구문을 추가하거나 변형하여 쿼리의 의도를 바꿀 수 있습니다.

예시: SQL 인젝션

 
# 일반적인 로그인 쿼리
SELECT * FROM users WHERE username = 'admin' AND password = 'password123';

# 공격자가 입력을 조작했을 경우
username: 'admin' --
password: (빈 값)

# 실행되는 쿼리
SELECT * FROM users WHERE username = 'admin' -- AND password = 'password123';

3. 코드 인젝션과 SQL 인젝션의 차이점

특징 코드 인젝션 SQL 인젝션
공격 대상 운영 체제 명령어, 스크립트 언어 등 데이터베이스(SQL 쿼리)
위험성 시스템 파일 삭제, 악성 코드 실행 데이터베이스 조작, 정보 유출
사용 기술 쉘 명령어, 프로그래밍 언어 SQL 언어
방어 방법 입력 검증, 권한 제한 Prepared Statement, ORM 등 사용

4. 공통된 방어 방법

코드 인젝션과 SQL 인젝션은 서로 다르지만, 공통적으로 다음과 같은 보안 대책을 통해 예방할 수 있습니다:

  1. 사용자 입력 검증
    • 입력 값의 길이, 데이터 타입, 특수 문자 등을 제한.
    • 화이트리스트 기반 필터링 권장.
  2. Prepared Statements와 ORM 사용
    • SQL 쿼리를 작성할 때, Prepared Statements를 사용하여 데이터와 명령어를 분리.
    • 데이터베이스 작업에 ORM(Object Relational Mapping) 프레임워크를 활용.
  3. 권한 최소화
    • 애플리케이션이 최소한의 권한으로 데이터베이스에 접근하도록 설정.
    • 관리 권한을 애플리케이션 계정에서 분리.
  4. 출력 인코딩
    • HTML, JavaScript, SQL 등 출력되는 데이터에 맞는 인코딩을 적용.
    • 예: XSS 방어를 위한 HTML 이스케이프 처리.
  5. 보안 테스트
    • 정적 코드 분석(SAST), 동적 애플리케이션 보안 테스트(DAST) 도구를 활용하여 취약점을 사전에 탐지.

5. SQL 인젝션 방어의 구체적인 예: Prepared Statements

PHP 예제:

// 취약한 SQL 쿼리
$unsafe_query = "SELECT * FROM users WHERE username = '$_POST[username]' AND password = '$_POST[password]'";

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

6. 코드 인젝션과 SQL 인젝션의 영향

실제 사례

  1. 코드 인젝션 사례: 2017년 Equifax 데이터 유출
    • 악성 코드가 시스템에 삽입되어 1억 4,700만 명의 개인 정보가 유출.
  2. SQL 인젝션 사례: 2008년 Heartland Payment Systems
    • SQL 인젝션으로 인해 약 1억 건의 신용카드 정보가 탈취.

마무리

코드 인젝션과 SQL 인젝션은 해커들이 자주 사용하는 강력한 공격 기법입니다. 하지만 기본적인 보안 원칙만 잘 준수해도 효과적으로 방어할 수 있습니다. 개발자는 항상 "입력은 신뢰할 수 없다"는 원칙을 염두에 두고 애플리케이션을 설계해야 합니다.

반응형