웹 보안 이론 1
SQL Injection
개념
- SQL Injection은 웹 애플리케이션의 입력 필드에서 악의적인 SQL 구문을 삽입하여 데이터베이스를 조작하거나 정보를 탈취하는 공격 기법
- 공격자는 인증 우회, 데이터 유출, 데이터베이스 조작, 시스템 권한 상승 등의 행위를 수행할 수 있음
원리
- 입력 값 조작
- 사용자가 입력한 데이터를 SQL 쿼리에 삽입하는 과정에서 검증 부족으로 인해 발생
- 공격자는 쿼리를 조작하여 의도치 않은 동작을 유발
- 쿼리 구조 변경
- 예시:
1
SELECT * FROM users WHERE username='admin' AND password='password';
- 입력 필드에
admin' --
를 입력하면 아래와 같이 쿼리가 조작됨:1
SELECT * FROM users WHERE username='admin' --' AND password='password';
'--
는 주석 처리 역할을 하며, 비밀번호 조건을 무시하고 인증 우회를 가능하게 함
- 입력 필드에
- 예시:
위험성
- 데이터 유출
- 공격자는 데이터베이스에 저장된 민감한 정보를 탈취
- 인증 우회
- 공격자는 비밀번호를 알지 못해도 로그인 절차를 우회할 수 있음
- 데이터 조작
- 데이터 삽입, 수정, 삭제 등 데이터베이스의 무단 조작 가능
- 시스템 장악
- 공격자는 데이터베이스뿐만 아니라 서버 자체를 공격할 수 있는 발판을 마련
공격 유형
- 인증 우회
- 입력:
admin' --
- 결과: 관리자 계정으로 인증 우회
- 입력:
- 데이터베이스 정보 열람
- SQL Query:
1
' OR 1=1; --
- 쿼리를 참으로 만들어 모든 데이터를 열람
- SQL Query:
- 테이블, 컬럼 정보 추출
- 정보 스키마를 이용해 테이블 및 컬럼 구조를 탐지:
1
UNION SELECT table_name, NULL FROM information_schema.tables;
- 정보 스키마를 이용해 테이블 및 컬럼 구조를 탐지:
- 데이터 추출
- 특정 데이터베이스의 컬럼 값을 추출:
1
UNION SELECT column_name FROM information_schema.columns WHERE table_name='users';
- 특정 데이터베이스의 컬럼 값을 추출:
방어 기법
- 입력 값 검증
- 사용자 입력 값의 길이, 형식, 데이터 타입 등을 검증
- 특수문자 필터링 및 이스케이프 처리
- Prepared Statement 사용
- 쿼리를 동적으로 생성하지 않고, 파라미터화된 쿼리를 사용하여 입력 값과 쿼리를 분리:
1
cursor.execute("SELECT * FROM users WHERE username = ? AND password = ?", (username, password))
- 쿼리를 동적으로 생성하지 않고, 파라미터화된 쿼리를 사용하여 입력 값과 쿼리를 분리:
- 최소 권한 원칙
- 데이터베이스 사용자 계정에 최소 권한만 부여
- WAF(Web Application Firewall)
- SQL Injection 패턴을 탐지하고 차단
- 보안 패치 적용
- 데이터베이스 및 웹 애플리케이션의 최신 보안 패치를 유지
- 오류 메시지 제한
- 데이터베이스 관련 오류 메시지를 사용자에게 노출하지 않도록 설정