Week 09 — 웹 취약점 자동화 스캐너 개발
전체 소스코드는 GitHub에서 확인할 수 있습니다. hojjang98 / skshielders-rookies-28 — projects/week_09
교육 목적으로 구성된 실습입니다. 의도적으로 취약한 환경을 대상으로만 사용하며, 무단 스캔은 정보통신망법 위반입니다.
개요
Week 08 에서는 공격자 시점에서 SQL Injection 과 XSS 를 직접 수행했다. Week 09 는 그 반대편이다. 이번에는 방어자 시점에서, 취약점을 자동으로 찾아내는 Python 기반 보안 스캐너를 직접 설계하고 구현했다.
단순히 “공격이 가능한가?“를 넘어 어디에, 어떤 심각도로, 왜 취약한가 를 자동으로 판단하고 리포트로 출력하는 도구를 만드는 것이 이번 주의 핵심이었다.
시스템 전체 구조
프로젝트는 취약한 타깃 앱 과 이를 진단하는 스캐너 두 부분으로 구성된다.
vulnerable_app/ -- 의도적으로 취약하게 구현한 Flask 웹 앱 (스캔 대상)
├── app.py -- 메인 애플리케이션 (SQL Injection, XSS, CSRF, 파일업로드 취약)
├── templates/ -- 로그인, 게시판, 검색, 업로드, 프로필 HTML
└── uploads/ -- 업로드 파일 저장소 (확장자 검증 없음)
scanners/ -- 자동화 취약점 스캐너 모음
├── sql_injection_scanner.py
├── xss_scanner.py
├── csrf_scanner.py
├── file_upload_scanner.py
└── integrated_scanner.py -- 4개 스캐너를 통합 실행하는 오케스트레이터
reports/ -- 스캔 결과 자동 저장
└── FINAL_COMPREHENSIVE_REPORT_*.txt
구현된 취약점 4종 (타깃 앱)
타깃 앱은 현실적인 공격 시나리오를 테스트할 수 있도록 4가지 취약점을 의도적으로 내포하고 있다.
| 취약점 | 위치 | 심각도 | 대표 페이로드 |
|---|---|---|---|
| SQL Injection | 로그인 폼, 검색 기능 | CRITICAL ~ HIGH | ’ OR ‘1’=‘1 |
| XSS | 게시판, 검색 결과 | HIGH | script 태그, img onerror |
| CSRF | 프로필 수정, 글 작성 | HIGH ~ MEDIUM | CSRF 토큰 미구현 |
| File Upload | 파일 업로드 기능 | CRITICAL | .php, .py, .exe 업로드 가능 |
테스트 계정:
admin / admin123 -- 관리자 계정
user1 / password1 -- 일반 사용자
testuser / test123 -- 테스트 사용자
핵심 코드 — 스캐너 설계 원칙
1. 공통 스캔 인터페이스
각 개별 스캐너는 동일한 구조의 딕셔너리를 반환한다. 이 일관된 인터페이스 덕분에 IntegratedScanner 가 결과를 타입 무관하게 수집하고 집계할 수 있다.
# 각 스캐너의 반환 형식 (예: SQL Injection 취약점 발견 시)
{
"type": "SQL Injection",
"severity": "CRITICAL",
"location": "http://localhost:5000/login",
"payload": "' OR '1'='1' --",
"description": "로그인 폼에서 SQL Injection 취약점 발견. 인증 우회 가능"
}
심각도 기준:
- CRITICAL — 즉각적인 데이터 탈취 또는 시스템 제어 가능 (파일 업로드, SQLi 인증 우회)
- HIGH — 사용자 세션 탈취 또는 중요 기능 조작 가능 (XSS, CSRF)
- MEDIUM — 정보 노출 또는 부분적 기능 영향
2. IntegratedScanner — 오케스트레이터 패턴
4개의 개별 스캐너를 순차 실행하고, 결과를 통합하여 종합 리포트를 생성하는 클래스다.
흐름:
IntegratedScanner("http://localhost:5000")
│
├── [1/4] SQLInjectionScanner.scan() => sql_vulns 리스트
├── [2/4] XSSScanner.scan() => xss_vulns 리스트
├── [3/4] CSRFScanner.scan() => csrf_vulns 리스트
└── [4/4] FileUploadScanner.scan() => upload_vulns 리스트
│
▼
all_vulnerabilities 통합
│
▼
generate_summary_report()
=> CRITICAL / HIGH / MEDIUM 심각도별 분류
=> 취약점별 위치 + 페이로드 + 설명 상세 기록
=> 보안 권장사항 자동 추가
핵심 집계 로직 (축약):
class IntegratedScanner:
def __init__(self, base_url):
self.base_url = base_url
self.all_vulnerabilities = []
self.scan_results = {}
def run_all_scans(self):
for Scanner, key in [(SQLInjectionScanner, 'SQL Injection'), ...]:
vulns = Scanner(self.base_url).scan()
self.scan_results[key] = vulns
self.all_vulnerabilities.extend(vulns) # 타입 무관 통합
def generate_summary_report(self):
critical = [v for v in self.all_vulnerabilities if v.get('severity') == 'CRITICAL']
high = [v for v in self.all_vulnerabilities if v.get('severity') == 'HIGH']
medium = [v for v in self.all_vulnerabilities if v.get('severity') == 'MEDIUM']
# 심각도별 분류 후 리포트 문자열 생성
스캐너별 탐지 방식
SQL Injection 스캐너
로그인 폼과 검색 기능에 페이로드를 자동으로 주입하고 응답을 분석한다.
테스트 페이로드 목록:
- ' OR '1'='1 => Boolean-based: 항상 참인 조건 삽입
- ' OR '1'='1' -- => 주석으로 나머지 쿼리 무력화
- ' UNION SELECT username, password FROM users-- => UNION 기반 데이터 추출 시도
- '; DROP TABLE users-- => 구조 파괴 시도 (오류 메시지 분석용)
탐지 기준:
- 응답에 "Welcome", "Dashboard" 등 로그인 성공 키워드 포함 => 인증 우회 확인
- 응답에 "SQL", "sqlite", "syntax error" 포함 => 에러 기반 SQLi 확인
XSS 스캐너
게시판 글 작성과 검색 기능에 스크립트 페이로드를 삽입하고 응답 HTML 에 그대로 반영되는지 확인한다.
테스트 페이로드 목록:
- <script>alert('XSS')</script>
- <img src=x onerror=alert('XSS')> => 이벤트 핸들러 기반 (필터 우회 변형)
- <svg onload=alert('XSS')> => SVG 태그 활용 우회
- javascript:alert('XSS') => URL 스킴 기반
탐지 기준:
- 응답 HTML 에 페이로드 문자열이 이스케이프 없이 그대로 포함되면 취약으로 판정
CSRF 스캐너
상태 변경 기능(프로필 수정, 글 작성)의 HTML 폼에 CSRF 토큰이 존재하는지 점검한다.
탐지 기준:
- 폼 내부에 csrf_token, _token, authenticity_token 등 토큰 필드 부재 => CSRF 취약
- 요청 헤더에 Origin / Referer 검증 로직 부재 여부도 확인
File Upload 스캐너
위험한 확장자의 파일을 업로드하고 서버가 수용하는지 테스트한다.
테스트 확장자 목록:
.php, .php5, .phtml, => 서버사이드 코드 실행 가능
.py, .rb, .pl, => 스크립트 실행
.sh, .bash, => 쉘 스크립트
.exe, .bat, => 실행 파일
.htaccess => 서버 설정 덮어쓰기
탐지 기준:
- 업로드 요청 응답 코드가 200 이고 "success" 등의 키워드 포함 => CRITICAL
종합 리포트 출력 구조
스캔 완료 후 자동으로 생성되는 리포트 형식:
======================================================================
COMPREHENSIVE SECURITY SCAN REPORT
======================================================================
Scan Date: 2026-01-02 14:30:00
Target URL: http://localhost:5000
======================================================================
VULNERABILITY SUMMARY
----------------------------------------------------------------------
Total Vulnerabilities Found: 9
- SQL Injection : 3 vulnerabilities
- XSS : 2 vulnerabilities
- CSRF : 2 vulnerabilities
- File Upload : 2 vulnerabilities
SEVERITY BREAKDOWN
----------------------------------------------------------------------
CRITICAL : 3
HIGH : 5
MEDIUM : 1
DETAILED VULNERABILITY LIST
======================================================================
1. [CRITICAL] SQL Injection
Location : http://localhost:5000/login
Payload : ' OR '1'='1' --
Description: 로그인 폼 인증 우회 가능
...
SECURITY RECOMMENDATIONS
======================================================================
1. SQL Injection Prevention:
- Use parameterized queries (prepared statements)
...
Week 08 -> Week 09 성장 포인트
| 관점 | Week 08 (공격자) | Week 09 (방어자) |
|---|---|---|
| 역할 | 취약점을 직접 익스플로잇 | 취약점을 자동으로 탐지 |
| 도구 | 브라우저 입력창 | Python requests + BeautifulSoup |
| 대상 | 단일 취약점 실습 | 4가지 취약점 종합 스캔 |
| 결과물 | 공격 성공 확인 | 심각도별 분류 + 자동 리포트 |
| 관점 | “어떻게 뚫을까?” | “어디가 뚫릴 수 있는가?” |
방어 권장사항 (리포트 내 자동 생성)
SQL Injection
- Parameterized Queries (Prepared Statements) 사용
- ORM 프레임워크 활용 (SQLAlchemy, Django ORM)
- 입력값 화이트리스트 검증
XSS
- Output Encoding / Escaping 구현
- Content Security Policy (CSP) 헤더 적용
- 템플릿 엔진의 Auto-escaping 유지 (|safe 미사용)
CSRF
- 모든 상태 변경 요청에 CSRF 토큰 구현
- SameSite 쿠키 속성 설정 (Strict 또는 Lax)
- Origin / Referer 헤더 서버 측 검증
File Upload
- 화이트리스트 기반 확장자 검증 (허용 목록만 통과)
- 파일 내용 검증 (Magic Bytes 확인)
- 업로드 파일을 웹 루트 외부 경로에 저장
- 업로드 파일명 서버 측 재생성 (원본 파일명 사용 금지)
- 업로드 용량 제한 설정
학습 성과 정리
| 영역 | 학습 내용 |
|---|---|
| 보안 자동화 | 반복적인 취약점 테스트를 스크립트로 자동화하는 방법론 체득 |
| 스캐너 설계 | 공통 인터페이스 기반 모듈화로 확장성 있는 구조 설계 |
| 취약점 탐지 | SQL Injection / XSS / CSRF / File Upload 자동 탐지 로직 구현 |
| 리포트 생성 | 심각도별 분류, 발견사항 상세 기록, 권장사항 자동 출력 |
| 공격-방어 연결 | 공격 기법을 이해해야 탐지 로직을 설계할 수 있다는 원칙 체감 |
향후 확장 방향
- Path Traversal 스캐너 — ../../../etc/passwd 형태의 디렉토리 탐색 탐지
- SSRF 스캐너 — 서버를 통한 내부 네트워크 요청 위조 탐지
- 인증/세션 스캐너 — 세션 고정, 취약한 쿠키 설정 탐지
- HTML 리포트 — 텍스트 리포트를 색상 코드 기반 인터랙티브 HTML 로 전환
- 크롤러 통합 — 엔드포인트를 자동 탐색하여 스캔 범위 자동 확장