본문으로 건너뛰기

웹 애플리케이션 퍼징: 숨겨진 버그 찾기

퍼징은 예상치 못한 입력을 애플리케이션에 던져 취약점, 숨겨진 엔드포인트, 엣지 케이스를 발견하는 기술이다. 이 가이드는 웹 보안 테스팅과 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 항목)
2. 중간 스캔 - 타깃 단어 목록 (10k
50k)
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의 차이가 다음 버그 발견의 열쇠일 수 있다.

해피 퍼징!