SQL Injection

기술노트

SQL Injection

개념

SQL Injection은 웹 애플리케이션의 주요 보안 취약점으로, 공격자가 악의적인 SQL 코드를 삽입하여 데이터베이스를 비정상적으로 조작하는 공격 기법입니다. 이 공격은 애플리케이션이 사용자 입력을 적절히 검증하지 않고 SQL 쿼리에 직접 포함시킬 때 발생합니다.

유형

기본적인 SQL Injection

  • 사용자 입력이 SQL 쿼리의 구조를 변경하는 경우
  • 예: SELECT * FROM users WHERE username='admin' AND password= OR '1'='1'
  • '1'='1'은 항상 참이므로 인증 우회 가능

Blind SQL Injection

  • 직접적인 결과를 볼 수 없지만 참/거짓 응답으로 정보를 유추
  • 예: SELECT * FROM users WHERE username='admin' AND (SELECT 1 FROM information_schema.tables WHERE table_name='users' LIMIT 1)=1
  • 시스템 반응을 통해 특정 테이블 존재 여부 확인

Error-based SQL Injection

  • 데이터베이스 오류 메시지를 통해 정보 획득
  • 예: SELECT * FROM users WHERE id=1 AND EXTRACTVALUE(1, CONCAT(0x7e, (SELECT version()), 0x7e))
  • 오류 메시지에 데이터베이스 버전 정보가 포함됨

Time-based SQL Injection

  • 시간 지연을 통해 정보 유추
  • 예: SELECT * FROM users WHERE id=1 AND IF(1=1, SLEEP(5), 0)
  • 조건이 참이면 5초간 지연됨

Union-based SQL Injection

  • UNION 구문을 이용해 추가 쿼리 실행
  • 예: SELECT name, email FROM users WHERE id=1 UNION SELECT username, password FROM admin
  • 관리자 테이블의 정보 획득 가능

방어 방법

매개변수화된 쿼리(Prepared Statements) 사용

  • SQL 쿼리와 데이터를 분리하여 처리
  • 예:
String query = "SELECT * FROM users WHERE username = ? AND password = ?";
PreparedStatement stmt = connection.prepareStatement(query);
stmt.setString(1, username);
stmt.setString(2, password);

입력 값 검증

  • 사용자 입력에 SQL 명령어나 특수문자가 포함되었는지 확인
  • 화이트리스트 방식으로 유효한 입력만 허용

ORM(Object-Relational Mapping) 사용

  • SQL 쿼리를 직접 작성하지 않고 객체 모델을 통해 데이터베이스에 접근
  • 예: Hibernate, Entity Framework, Django ORM 등

최소 권한 원칙

  • 데이터베이스 계정에 필요한 최소한의 권한만 부여
  • 읽기 전용 작업에는 SELECT 권한만 부여된 계정 사용

오류 메시지 숨기기

  • 상세한 데이터베이스 오류 메시지를 사용자에게 노출하지 않음
  • 일반적인 오류 메시지로 대체

WAF(Web Application Firewall) 사용

  • 웹 애플리케이션 방화벽을 통해 SQL Injection 패턴 차단

실제 사례

Sony Pictures (2011)

  • LulzSec 해커 그룹이 SQL Injection 취약점을 이용해 100만 명 이상의 사용자 정보 유출

Yahoo (2012)

  • 약 45만 명의 계정 정보가 SQL Injection을 통해 유출됨

LinkedIn (2012)

  • 약 650만 명의 사용자 비밀번호 해시가 유출

TalkTalk (2015)

  • 영국 통신회사 TalkTalk의 고객 정보 15만 건이 SQL Injection 공격으로 유출

보안 인식의 중요성

  • SQL Injection은 OWASP Top 10에서 지속적으로 상위권에 포함되는 심각한 보안 위협
  • 개발자 교육과 코드 리뷰를 통해 SQL Injection 취약점 예방 가능
  • 정기적인 보안 테스트와 코드 스캐닝으로 취약점 조기 발견

관련 주제

  • 웹 보안
  • OWASP
  • 데이터베이스 보안
  • 입력 검증
  • 보안 코딩 가이드라인