Post

웹 보안 이론 1

SQL Injection

개념

  • SQL Injection은 웹 애플리케이션의 입력 필드에서 악의적인 SQL 구문을 삽입하여 데이터베이스를 조작하거나 정보를 탈취하는 공격 기법
  • 공격자는 인증 우회, 데이터 유출, 데이터베이스 조작, 시스템 권한 상승 등의 행위를 수행할 수 있음

원리

  1. 입력 값 조작
    • 사용자가 입력한 데이터를 SQL 쿼리에 삽입하는 과정에서 검증 부족으로 인해 발생
    • 공격자는 쿼리를 조작하여 의도치 않은 동작을 유발
  2. 쿼리 구조 변경
    • 예시:
      1
      
      SELECT * FROM users WHERE username='admin' AND password='password';
      
      • 입력 필드에 admin' --를 입력하면 아래와 같이 쿼리가 조작됨:
        1
        
        SELECT * FROM users WHERE username='admin' --' AND password='password';
        
      • '--는 주석 처리 역할을 하며, 비밀번호 조건을 무시하고 인증 우회를 가능하게 함

위험성

  1. 데이터 유출
    • 공격자는 데이터베이스에 저장된 민감한 정보를 탈취
  2. 인증 우회
    • 공격자는 비밀번호를 알지 못해도 로그인 절차를 우회할 수 있음
  3. 데이터 조작
    • 데이터 삽입, 수정, 삭제 등 데이터베이스의 무단 조작 가능
  4. 시스템 장악
    • 공격자는 데이터베이스뿐만 아니라 서버 자체를 공격할 수 있는 발판을 마련

공격 유형

  1. 인증 우회
    • 입력: admin' --
    • 결과: 관리자 계정으로 인증 우회
  2. 데이터베이스 정보 열람
    • SQL Query:
      1
      
      ' OR 1=1; --
      
    • 쿼리를 참으로 만들어 모든 데이터를 열람
  3. 테이블, 컬럼 정보 추출
    • 정보 스키마를 이용해 테이블 및 컬럼 구조를 탐지:
      1
      
      UNION SELECT table_name, NULL FROM information_schema.tables;
      
  4. 데이터 추출
    • 특정 데이터베이스의 컬럼 값을 추출:
      1
      
      UNION SELECT column_name FROM information_schema.columns WHERE table_name='users';
      

방어 기법

  1. 입력 값 검증
    • 사용자 입력 값의 길이, 형식, 데이터 타입 등을 검증
    • 특수문자 필터링 및 이스케이프 처리
  2. Prepared Statement 사용
    • 쿼리를 동적으로 생성하지 않고, 파라미터화된 쿼리를 사용하여 입력 값과 쿼리를 분리:
      1
      
      cursor.execute("SELECT * FROM users WHERE username = ? AND password = ?", (username, password))
      
  3. 최소 권한 원칙
    • 데이터베이스 사용자 계정에 최소 권한만 부여
  4. WAF(Web Application Firewall)
    • SQL Injection 패턴을 탐지하고 차단
  5. 보안 패치 적용
    • 데이터베이스 및 웹 애플리케이션의 최신 보안 패치를 유지
  6. 오류 메시지 제한
    • 데이터베이스 관련 오류 메시지를 사용자에게 노출하지 않도록 설정