오늘은 웹 모의해킹 심화 과정의 필수품, Wfuzz에 대해 알아보겠습니다.
Wfuzz는 이름 그대로 웹 애플리케이션을 'Fuzzing(무작위 데이터 입력 테스트)'하는 데 특화된 도구입니다.
단순히 파일만 찾는 Gobuster와 달리, 로그인 폼의 아이디/비밀번호를 찾거나(Brute-force), 헤더를 변조하거나, 파라미터 값을 조작하는 등 훨씬 정교한 공격이 가능합니다.
Gobuster가 "여기 문이 있나?"라고 두드려보는 도구라면, Wfuzz는 "이 문을 열쇠 1만 개로 다 찔러보고, 발로도 차보고, 창문도 흔들어보는" 도구입니다.
SQL 인젝션, XSS, 로그인 브루트포싱 등 다양한 시나리오에서 활약하는 Wfuzz의 사용법을 마스터해 봅시다.
◎ Wfuzz의 핵심 원리: FUZZ 키워드
- Wfuzz의 사용법은 딱 하나만 기억하면 됩니다.
> "내가 바꾸고 싶은 자리에 FUZZ라고 쓴다."
- URL 경로를 찾고 싶다면: http://target.com/FUZZ
- 파라미터 값을 찾고 싶다면: http://target.com/view.php?id=FUZZ
- 로그인 비밀번호를 찾고 싶다면: password=FUZZ
- Wfuzz는 이 FUZZ라는 단어를 사전 파일(Wordlist)에 있는 단어들로 하나씩 갈아끼우며 요청을 보냅니다.
◎ 필수 옵션 완전 정복
① 결과 필터링 (가장 중요!)
> Wfuzz는 기본적으로 모든 응답을 다 보여줍니다.
> 404(Not Found) 에러가 1만 개 뜨면 화면이 꽉 차서 정작 중요한 200(성공)을 못 봅니다.
> 그래서 필터링 옵션은 선택이 아니라 필수입니다.
- --hc [코드] (Hide Code): 해당 응답 코드는 숨깁니다. (주로 404 숨김)
- --sc [코드] (Show Code): 해당 응답 코드만 보여줍니다. (주로 200만 보고 싶을 때)
- --hw [숫자] (Hide Word): 응답 페이지의 단어 수(Word Count)가 특정 개수면 숨깁니다. (에러 페이지 걸러낼 때 유용)
- --hl [숫자] (Hide Line): 응답 줄 수(Line Count)로 숨깁니다.
② 컬러 모드 (-c)
> 결과를 알록달록하게 보여줘서 가독성을 높입니다. 무조건 쓰세요.
◎ 실전 명령어 가이드
① 디렉터리 및 파일 스캔 (기본)
> Gobuster와 비슷하지만 더 세밀한 제어가 가능합니다.
| # wfuzz -c -w /usr/share/wordlists/dirb/common.txt --hc 404 http://target.com/FUZZ |
- -c: 컬러 출력
- -w [파일]: 사용할 사전 파일 지정
- --hc 404: 없는 페이지(404)는 화면에 출력하지 않음
② 파라미터 퍼징 (숨겨진 변수 찾기)
> 개발자가 숨겨놓은 admin=true 같은 파라미터를 찾을 때 씁니다.
| # wfuzz -c -w /usr/share/wordlists/dirb/common.txt --hc 404 http://target.com/index.php?FUZZ=test |
- ?id=test, ?user=test, ?admin=test ... 이런 식으로 대입해 봅니다.
③ 인증 크랙 (아이디/비번 동시에)
> Wfuzz는 FUZZ, FUZ2Z, FUZ3Z... 를 사용해 여러 곳을 동시에 바꿀 수 있습니다.
| # wfuzz -c -w users.txt -w passwords.txt \ --sc 200 \ -d "username=FUZZ&password=FUZ2Z" \ http://target.com/login.php |
- -w를 두 번 씀: 첫 번째 -w는 FUZZ(아이디)에, 두 번째 -w는 FUZ2Z(비번)에 매핑됩니다.
- -d: POST 데이터 전송 (로그인 시도)
④ 헤더(Header) 조작 공격
> User-Agent를 바꾸거나, 쿠키 값을 변조할 때 사용합니다.
| # wfuzz -c -w malicious_headers.txt -H "User-Agent: FUZZ" http://target.com |
◎ 인코딩(Encoding) 기능 활용 (-e)
> 만약 서버가 Base64로 인코딩된 값만 받는다면? Wfuzz는 알아서 인코딩해서 보내줍니다.
| 평문 사전을 Base64로 바꿔서 전송 # wfuzz -c -w payloads.txt -e md5 http://target.com/api?token=FUZZ |
- -e md5: 사전 파일의 내용을 MD5 해시로 변환해서 FUZZ 자리에 넣습니다. (urlencode, base64 등 다양한 인코더 지원)
◎ 전문가의 꿀팁: "에러 페이지 걸러내기"
- 실무에서 Wfuzz를 쓰다 보면, "모든 페이지가 200 OK"로 떠서 당황할 때가 있습니다. (서버가 404 대신 "페이지를 찾을 수 없습니다"라는 예쁜 200 페이지를 보여줄 때)
> 이럴 때는 --hw (Hide Word) 옵션을 씁니다.
- 먼저 이상한 값(sdfasdf)을 넣어 봅니다.
- 그때 나오는 단어 수(Word Count)를 확인합니다. (예: 153 W)
- 그 단어 수를 숨겨버립니다.
| 153개 단어를 가진 응답(가짜 200 페이지)은 다 숨겨라! # wfuzz -c -w common.txt --hw 153 http://target.com/FUZZ |
◎ 전문가는 어떤 옵션을 쓰는가
① 노이즈 제거의 끝판왕: --hh (Hide Characters)
>사실 실무에서는 --hh (Hide Characters, 글자 수 숨김)를 더 많이 씁니다.
> 왜냐하면 서버 응답이 미세하게 바뀌더라도(예: "Error: 123" vs "Error: 456"), 전체 글자 수(Character Count)는 고정적인 경우가 많기 때문입니다.
- 상황: 아무 값이나 넣었는데 응답 크기가 항상 1024 Chars로 나온다. 이게 바로 실패(에러) 페이지다.
- 해결: 1024 글자짜리 응답은 다 숨겨라!
| # wfuzz -c -w common.txt --hh 1024 http://target.com/FUZZ |
> 이제 1024글자가 아닌, 무언가 다른(진짜 성공한) 페이지가 떴을 때만 결과가 출력됩니다.
② 속도 조절의 핵심: -t (Threads)
> Wfuzz의 기본 속도가 답답하셨나요? 스레드(Threads)를 늘려주면 됩니다.
- 기본값: 10 (너무 느림)
- 추천값: 50 ~ 200
- 사용법:
| # wfuzz -c -t 100 -w common.txt http://target.com/FUZZ |
> 주의: 너무 높이면(500 이상) 서버가 죽거나(DoS), WAF(방화벽)가 여러분의 IP를 차단해 버립니다. 적당히 조절하세요.
③ 메소드(Method) 바꿔 찌르기: -X
> 웹 서버는 GET 요청에는 404를 주지만, POST나 PUT 요청에는 반응할 때가 있습니다. (특히 REST API 테스트할 때 중요!)
Wfuzz는 기본적으로 GET을 보내지만, -X 옵션으로 이를 바꿀 수 있습니다.
- 사용법:
| POST 메소드로 퍼징 # wfuzz -c -w common.txt -X POST http://target.com/api/FUZZ DELETE 메소드로 삭제 가능한 파일 찾기 (위험!) # wfuzz -c -w files.txt -X DELETE http://target.com/uploads/FUZZ |
④ 인증 우회와 로그인: -u (User/Password)
> Basic Auth(브라우저 팝업으로 아이디/비번 묻는 창)가 걸린 페이지를 뚫어야 할 때 씁니다.
- -u 옵션을 쓰면 Authorization: Basic ... 헤더를 자동으로 만들어줍니다.
- 사용법:
| admin 계정으로 인증하며 스캔 # wfuzz -c -w secrets.txt -u admin:password123 http://target.com/admin/FUZZ |
> 참고: 만약 폼 로그인(Form Login)이라면 -d 옵션으로 데이터를 보내야 하고, Basic Auth라면 -u를 씁니다.
| 옵션 | 의미 | 언제 쓰는가? |
| --hh | Hide Characters | 가짜 200 OK 페이지를 정밀하게 걸러낼 때 (가장 확실함) |
| -t | Threads | 스캔이 너무 느릴 때 속도를 올리려고 |
| -X | Method | GET 말고 POST, PUT, DELETE 등으로 테스트할 때 |
| -u | Auth | Basic Authentication(팝업 로그인)을 통과해야 할 때 |
◎ 전문가의 One-Liner
- 이 모든 옵션을 조합하면 아래와 같은 강력한 명령어가 탄생합니다.
> 상황
- http://target.com/api/FUZZ 경로를 찾고 싶다.
- POST 메소드(-X POST)를 써야 한다.
- Basic Auth 인증(-u)이 필요하다.
- 빠르게(-t 100) 하고 싶다.
- 실패 시 응답 크기가 450글자(--hh 450)라서 이걸 안 보고 싶다.
- 명령어:
| # wfuzz -c -w /usr/share/wordlists/dirb/common.txt \ -t 100 \ -X POST \ -u testuser:testpass \ --hh 450 \ http://target.com/api/FUZZ |
◎ 요약: Wfuzz, 언제 써야 할까?
- 단순 폴더 찾기 -> Gobuster (빠름)
- 정교한 조작 필요 -> Wfuzz (강력함)
- 파라미터 값 변조 (?id=FUZZ)
- POST 데이터 전송 (-d)
- 여러 개 동시에 대입 (FUZZ, FUZ2Z)
- 특정 길이의 응답만 골라내기 (--hw)
- Wfuzz는 옵션이 많아 처음엔 복잡해 보이지만, 옵션을 조합할수록 강력해집니다.
- FUZZ 키워드와 필터링(--hc, --hw)만 이해하면 그 어떤 도구보다 자유도가 높은 강력한 무기입니다.
- 특히 --hh 옵션은 결과의 질(Quality)을 결정하는 가장 중요한 필터이니 꼭 손에 익혀두시기 바랍니다.
'OFFENSIVE > Vulnerable Web Application' 카테고리의 다른 글
| [WAPT] 웹 애플리케이션 모의해킹 nf(NucleiFuzzer) 가이드 (0) | 2025.12.13 |
|---|---|
| [WAPT] 웹 애플리케이션 모의해킹 Nikto 가이드 (0) | 2025.12.13 |
| [WAPT] 웹 애플리케이션 모의해킹 Curl 가이드 (0) | 2025.12.13 |
| [WAPT] 웹 애플리케이션 모의해킹 Spyhunt 가이드 (0) | 2025.12.13 |
| [WAPT] 웹 애플리케이션 모의해킹 ParamSpider 가이드 (0) | 2025.12.13 |
