[웹 보안] 초기 도입부
1. 서론
SQL Injection은 웹 애플리케이션에서 사용자 입력값을 적절히 검증하지 않을 때 발생하는 대표적인 웹 보안 취약점이다. 공격자가 입력 필드에 악의적인 SQL 구문을 삽입하면 의도하지 않은 데이터베이스 쿼리가 실행되어 인증 우회, 데이터 탈취, 데이터 변조 등의 심각한 보안 사고로 이어질 수 있다. OWASP TOP 10 에서도 Injection 공격은 꾸준히 상위에 랭크되어 있으며 여전히 많은 웹 사이트에서 발견되는 취약점이다.
본 과제에서는 가상 머신 환경에서 Apache, PHP, MySQL 기반의 웹 서버를 직접 구축하고 의도적으로 취약하게 작성된 웹 사이트에 대해 SQL Injection의 세 가지 기법 (Basic, Union-based, Blind)을 단계별로 수행하여 각 공격의 원리와 위험성을 실증적으로 분석하고자 한다. 나아가 각 공격에 대한 방어 기법을 적용하여 그 효과를 입증하고자 한다.
2. 본론
2.1 실험 환경 구축
VMware 가상 머신 위에 웹 서버 환경을 구축하여 실험하려고 한다. 구체적인 구성은 다음과 같다.
가상화: VMware
운영체제: Ubuntu
웹 서버: Apache
서버 사이드 언어: PHP
데이터베이스: MySQL
Apache 웹 서버 설치 및 PHP 모듈 연동, MySQL 데이터베이스 서버 설치 및 설정 과정을 거쳐 웹 서비스 환경을 구성한다.
MySQL 에는 실험용 데이터베이스를 생성하고 사용자 계정 정보 (아이디, 패스워드), 게시판 글 등의 테스트 데이터를 삽입하여 공격 대상 데이터를 준비한다.
2.2 취약한 웹 사이트 구성
각 공격 기법을 시연하기 위해 의도적으로 취약하게 작성된 웹 페이지를 구성한다.
로그인 페이지: 사용자 입력값을 검증 없이 SQL 쿼리에 직접 삽입하는 구조로 작성하여 Basic SQL Injection에 활용한다.
게시판 검색 페이지: 검색어 입력값이 SQL 쿼리에 그대로 반영되도록 구현하여 Union-based SQL Injection에 활용한다.
에러 메시지를 숨긴 페이지: SQL 에러 출력을 비활성화하여 응답의 참/거짓 차이만으로 정보를 추출하는 Blind SQL Injection 실험에 활용한다.
2.3 공격 시나리오 및 과정
step 1: Basic SQL Injection (로그인 우회)
로그인 폼의 아이디 또는 패스워드 입력란에 ‘ or 1=1 — 과 같은 구문을 삽입하여 인증을 우회한다. 서버 측에서 사용자 입력을 필터링 없이 SQL 쿼리에 결합할 경우, WHERE 조건이 항상 참이 되어 패스워드를 모르더라도 로그인에 성공하게 되는 원리를 분석한다.
step 2: Union-based SQL Injection (데이터 탈취)
게시판 검색 기능을 이용하여 UNION SELECT 구문을 삽입한다. 먼저 ORDER BY를 통해 원래 쿼리의 컬럼 수를 파악한 뒤. UNION SELECT를 활용하여 데이터베이스명, 테이블명, 컬럼명을 순차적으로 조회한다. 최종적으로 사용자 테이블에서 아이디와 패스워드 등 민감 데이터를 탈취하는 과정을 시연한다.
step 3: Blind SQL Injection (참/거짓 기반 정보 추출)
에러 메시지가 출력되지 않는 환경에서 조건문에 따른 페이지 응답 차이를 관찰하여 데이터를 한 글자씩 추출한다. SUBSTRING, ASCII 함수 등을 활용하여 데이터베이스명이나 패스워드를 한 글자씩 알아내는 과정을 시연하며 에러가 노출되지 않는 상황에서도 정보 유출이 가능함을 입증한다.
2.4 방어 기법 적용 및 효과 검증
각 공격에 대해 다음과 같은 방어 기법을 적용한 후, 동일한 공격을 재시도하여 방어 효과를 비교 분석한다.
Prepared Statement: 사용자 입력을 쿼리 구조와 분리하여 SQL Injection을 원천적으로 차단한다.
입력값 검증 및 필터링: 특수문자 이스케이프 처리, 화이트 리스트 기반 입력 제한 등을 적용한다.
WAF(Web Application Firewall) 적용: 웹 방화벽을 통해 악의적인 요청을 탐지 및 차단하는 방법을 실험한다.
방어 적용 전후의 공격 결과를 비교하여 각 방어 기법의 효과와 한계를 분석한다.
3. 결론
본 과제에서는 직접 구축한 Apache + PHP + MySQL 기반 웹 서버 환경에서 SQL Injection의 세 가지 기법을 단계적으로 실험하고 각 공격에 대한 방어 기법을 적용하여 그 효과를 검증한다. Basic SQL Injection을 통한 인증 우회, Union-based SQL Injection을 통한 데이터 탈취, Blind SQL Injection을 통한 은밀한 정보 추출까지 공격의 난이도와 심각성이 단계적으로 높아지는 구성을 통해 SQL Injection의 위험성을 종합적으로 입증하고자 한다.
나아가 각 공격에 대한 방어 기법 (Prepared Statement, 입력값 검증, WAF 적용 등)을 추가로 구현하여 방어 전후의 결과를 비교 분석함으로써 제안하는 웹 보안 기법의 효과를 실증적으로 입증하고자 한다.