웹 애플리케이션 퍼징: 숨겨진 버그 찾기
퍼징은 예상치 못한 입력을 애플리케이션에 던져 취약점, 숨겨진 엔드포인트, 엣지 케이스를 발견하는 기술이다. 이 가이드는 웹 보안 테스팅과 CTF 대회를 위한 실전 퍼징 기법을 다룬다.
웹 퍼징이란?
웹 퍼징은 웹 애플리케이션에 입력 변형을 자동으로 보내 다음을 분석하는 과정이다:
- 숨겨진 디렉토리와 파일
- 인젝션 취약점
- 인증 우회
- 파라미터 오염
- 레이트 리미팅 문제
수동 테스팅과 달리, 퍼징은 몇 분 안에 수천 개의 페이로드를 테스트할 수 있다.
필수 퍼징 도구
ffuf - 빠른 웹 퍼저
디렉토리 브루트포싱과 파라미터 발견에 최적인 현대적 선택:
# 디렉토리 퍼징
ffuf -w wordlist.txt -u https://target.com/FUZZ
# 가상 호스트 발견
ffuf -w vhosts.txt -u https://target.com -H "Host: FUZZ.target.com"
# 파라미터 퍼징
ffuf -w params.txt -u https://target.com?FUZZ=test
# POST 데이터 퍼징
ffuf -w payloads.txt -u https://target.com/api -X POST -d "user=FUZZ"
주요 기능: 빠른 멀티스레딩, 응답 매칭/필터링, 다중 단어 목록 지원, 다양한 출력 포맷.
wfuzz - 만능 퍼징 도구
복잡한 퍼징에 유용한 다재다능한 도구:
# 다중 인젝션 포인트
wfuzz -w users.txt -w passwords.txt http://target.com/login?user=FUZZ&pass=FUZ2Z
# 응답 코드로 필터링
wfuzz -w wordlist.txt --hc 404 http://target.com/FUZZ
실전 퍼징 기법
디렉토리 및 파일 발견
SecLists나 Dirbuster의 일반적인 단어 목록으로 시작한다:
# 일반 파일
ffuf -w /usr/share/seclists/Discovery/Web-Content/common.txt \
-u https://target.com/FUZZ \
-mc 200,301,302,403
# 백업 파일
ffuf -w /usr/share/seclists/Discovery/Web-Content/backup-files.txt \
-u https://target.com/FUZZ \
-e .bak,.old,.backup,.swp
팁: 확장자 -e .php,.html,.txt,.zip으로 퍼징하면 숨겨진 리소스를 자주 발견한다.
파라미터 오염
애플리케이션이 중복 파라미터를 어떻게 처리하는지 테스트한다:
# 파라미터 우선순위 테스트
curl "https://target.com/api?id=1&id=2&id=3"
# 배열 스타일 파라미터
curl "https://target.com/api?user[]=admin&user[]=guest"
애플리케이션이 첫 번째, 마지막, 또는 모든 파라미터 값을 다르게 처리하면 예상치 못한 동작이 발생할 수 있다.
인증 우회 퍼징
인증 메커니즘을 테스트한다:
# 사용자명 열거
ffuf -w usernames.txt -u https://target.com/login \
-X POST -d "username=FUZZ&password=test" \
-fr "Invalid username"
# SQL 인젝션 패턴
wfuzz -w /usr/share/seclists/Fuzzing/SQLi/quick-SQLi.txt \
-u https://target.com/login \
-d "username=admin&password=FUZZ"
응답 차이로 필터링: 크기(-fs), 줄 수(-fl), 단어 수(-fw), 정규식(-fr).
헤더 퍼징
HTTP 헤더의 인젝션 포인트를 테스트한다:
# User-Agent 퍼징
ffuf -w payloads.txt -u https://target.com -H "User-Agent: FUZZ"
# X-Forwarded-For 우회
ffuf -w ips.txt -u https://admin.target.com \
-H "X-Forwarded-For: FUZZ" -mc 200
많은 애플리케이션이 접근 제어에 X-Forwarded-For, X-Real-IP, X-Original-URL 같은 헤더를 신뢰한다.
효과적인 단어 목록 구축
타깃 사이트에서 키워드 추출:
# 스파이더링으로 고유 단어 추출
cewl https://target.com -d 2 -m 5 -w wordlist.txt
# 여러 소스 합치기
cat wordlist1.txt wordlist2.txt | sort -u > combined.txt
정찰 기반으로 단어 목록 구축:
- 기술 스택 (Laravel →
routes,api,admin) - 도메인 (금융 →
payment,transaction,account) - 프레임워크 패턴 (Django →
api/v1,admin/,static/)
퍼징 전략
단계적 퍼징
1. 빠른 스캔 - 작은 단어 목록 (1k5k 항목)50k)
2. 중간 스캔 - 타깃 단어 목록 (10k
3. 심층 스캔 - 대형 종합 목록 (100k+)
빠르게 시작하고 발견 사항을 기반으로 더 깊이 파고든다.
응답 분석
상태 코드 너머를 보라:
- 크기 이상 - 다른 응답 크기는 성공을 의미할 수 있다
- 타이밍 공격 - 더 느린 응답은 데이터베이스 쿼리를 의미할 수 있다
- 에러 메시지 - 스택 트레이스가 기술 세부 정보를 드러낸다
- 리다이렉트 체인 - 302 → 200은 성공적인 우회를 의미할 수 있다
레이트 리미팅 인식
IP 차단 방지:
# 딜레이 추가
ffuf -w wordlist.txt -u https://target.com/FUZZ -p 0.5
# 프록시 로테이션 사용
ffuf -w wordlist.txt -u https://target.com/FUZZ -x http://proxy:8080
자주 나오는 CTF 퍼징 패턴
숨겨진 관리자 패널 - /admin, /panel, /dashboard, /manager 퍼징
백업 파일 - .bak, .old, .swp, .save, ~
설정 파일 - .env, .git/config, wp-config.php, web.config
API 버전 - /api/v1, /api/v2, /api/internal
디버그 엔드포인트 - /debug, /test, /dev, /staging
빠른 CTF 스크립트
#!/bin/bash
TARGET=$1
echo "[+] 빠른 디렉토리 퍼징"
ffuf -w /usr/share/seclists/Discovery/Web-Content/common.txt \
-u $TARGET/FUZZ -mc 200,301,302,403 -t 50
echo "[+] 백업 파일 확인"
ffuf -w /usr/share/seclists/Discovery/Web-Content/backup-files.txt \
-u $TARGET/FUZZ -mc 200 -t 50
퍼징 베스트 프랙티스
정찰로 시작하기 - 퍼징 전에 타깃을 파악하라
노이즈 필터링 - 응답 크기/내용 필터로 오탐을 줄여라
로컬에서 먼저 테스트 - 실제 테스트 전에 애플리케이션 동작을 이해하라
범위 준수 - 권한이 있는 타깃만 퍼징하라
발견 사항 문서화 - 성공한 페이로드 로그를 유지하라
마치며
퍼징은 수동 테스팅을 자동화된 발견으로 전환한다. 이 도구와 기법을 마스터하면 CTF 문제든 실제 보안 평가든 더 빠르게 숨겨진 취약점을 찾을 수 있다.
디렉토리 퍼징으로 시작해서 파라미터 테스팅으로 발전하고, 항상 응답을 꼼꼼히 분석하라. 404와 403의 차이가 다음 버그 발견의 열쇠일 수 있다.
해피 퍼징!