
FFUF
Notes on Introduction to Attacking Web Applications with Ffuf
Overview
- Module centers on web fuzzing using the
ffuf
tool, recognized for its reliability and widespread use in directory and parameter brute-forcing. - Ffuf automates the process of testing web application components by sending requests to identify existing resources.
Topics Covered
- Fuzzing for Directories: Discovering accessible directories on a web server.
- Fuzzing for Files and Extensions: Detecting files and specific extensions (e.g.,
.php
,.txt
). - Identifying Hidden VHosts: Uncovering virtual hosts that are not directly exposed.
- Fuzzing for PHP Parameters: Identifying valid PHP parameters within web applications.
- Fuzzing for Parameter Values: Testing various parameter values to reveal hidden features or vulnerabilities.
Methodology
- Fuzzing Process: Utilizes wordlists to send requests to a web server, checking for responses like HTTP 200 to confirm the existence of pages or resources.
- Manual Analysis: Resources identified (e.g., pages, files) require manual inspection for deeper investigation or exploitation.
Tools
- Ffuf: A fast and dependable tool for automated web fuzzing tasks.
Notes on Web Fuzzing
Introduction
- Focuses on using the
ffuf
tool to fuzz websites for directories, starting with a basic exercise on a website with no visible links or navigation clues. - Example: Website at
http://<SERVER_IP>
displays “Welcome to HTB Academy” but lacks links, necessitating fuzzing to discover hidden pages.
Fuzzing Overview
- Definition: A testing technique that sends various inputs to an interface to observe reactions.
- SQL Injection: Send special characters to detect vulnerabilities.
- Buffer Overflow: Send incrementally longer strings to crash binaries.
- Web Fuzzing: Use wordlists of common terms to identify existing web pages or directories.
- Purpose: Web servers rarely list all links; fuzzing checks for valid pages by analyzing HTTP response codes.
- HTTP 404 (Not Found): Page does not exist (e.g.,
https://www.hackthebox.eu/doesnotexist
). - HTTP 200 (OK): Page exists (e.g.,
https://www.hackthebox.eu/login
).
- HTTP 404 (Not Found): Page does not exist (e.g.,
- Automation: Tools like
ffuf
send hundreds of requests per second, analyzing HTTP codes to identify valid resources efficiently.
Wordlists
- Role: Similar to password dictionary attacks, wordlists contain commonly used terms for web directories and pages.
- Effectiveness: May not find all pages (e.g., randomly named ones), but achieves up to 90% success on some websites.
- Sources:
- SecLists: GitHub repository (
/opt/useful/SecLists
on Pwnbox) with categorized wordlists for fuzzing, including passwords for brute-forcing. - Directory Wordlist:
directory-list-2.3-small
located at/opt/useful/SecLists/Discovery/Web-Content/directory-list-2.3-small.txt
.
- SecLists: GitHub repository (
- Tip: Wordlists may include copyright comments at the start, which can clutter results. Use
ffuf
with appropriate flags to skip these lines.
Notes on Directory Fuzzing
Introduction
- Builds on web fuzzing concepts, focusing on using
ffuf
to discover website directories. - Assumes familiarity with wordlists (e.g.,
directory-list-2.3-small
) and the need to identify hidden directories on a web server.
Ffuf Tool
- Availability: Pre-installed on Pwnbox; install on other systems via
apt install ffuf
or GitHub repository. - Help Command:
ffuf -h
displays options, including:- HTTP Options:
-H
: Add headers (e.g.,Name: Value
).-X
: Specify HTTP method (default: GET).-b
: Cookie data.-d
: POST data.-u
: Target URL.-recursion
: Enable recursive scanning (FUZZ keyword only).-recursion-depth
: Set maximum recursion depth (default: 0).
- Matcher Options:
-mc
: Match HTTP status codes (default: 200, 204, 301).-ms
: Match response size.
- Filter Options:
-fc
: Filter HTTP status codes.-fs
: Filter response size.
- Input Options:
-w
: Wordlist path and optional keyword (e.g.,/path:FUZZ
).
- Output Options:
-o
: Save output to file.
- Example:
Fuzzes paths, matches all responses, filters size 42, with colored verbose output.ffuf -w wordlist.txt -u https://example.org/FUZZ -mc all -fs 42 -c -v
- HTTP Options:
Directory Fuzzing Process
- Setup:
- Select wordlist:
/opt/useful/SecLists/Discovery/Web-Content/directory-list-2.3-small.txt
. - Assign keyword (e.g.,
FUZZ
) to wordlist:ffuf -w /opt/useful/SecLists/Discovery/Web-Content/directory-list-2.3-small.txt:FUZZ
- Place
FUZZ
in URL where directory is expected:ffuf -w /opt/useful/SecLists/Discovery/Web-Content/directory-list-2.3-small.txt:FUZZ -u http://<SERVER_IP>:<PORT>/FUZZ
- Select wordlist:
- Execution:
- Final command tests ~90,000 URLs in under 10 seconds (speed varies by network).
- Example:
ffuf -w /opt/useful/SecLists/Discovery/Web-Content/directory-list-2.3-small.txt:FUZZ -u http://<SERVER_IP>:<PORT>/FUZZ
- Performance Tuning:
- Increase threads (e.g.,
-t 200
) for speed, but risks Denial of Service or network disruption; not recommended for remote sites.
- Increase threads (e.g.,
- Results:
- Identifies directories like
http://<SERVER_IP>:<PORT>/blog
. - Example result:
/blog
returns an empty page (no HTTP 404/403), indicating access but no dedicated page.
- Identifies directories like
Next Steps
- Investigate discovered directories (e.g.,
/blog
) for hidden files or pages in subsequent fuzzing tasks.
Notes on Page Fuzzing
Introduction
- Builds on
ffuf
usage with wordlists and keywords to locate pages within directories. - Scenario: Continues from discovering the
/blog
directory, which appears empty, requiring fuzzing to find hidden pages.
Extension Fuzzing
- Purpose: Identify the file extensions used by the website (e.g.,
.html
,.php
,.aspx
) to focus page fuzzing. - Challenges:
- Guessing extensions based on server type (e.g., Apache →
.php
, IIS →.asp
/.aspx
) is unreliable. - Manual inspection of HTTP response headers may provide clues but is inefficient.
- Guessing extensions based on server type (e.g., Apache →
- Solution: Use
ffuf
to fuzz extensions with a dedicated wordlist. - Wordlist:
/opt/useful/SecLists/Discovery/Web-Content/web-extensions.txt
(includes dot, e.g.,.php
). - Approach:
- Use a common file like
index
to test extensions, avoiding the need to fuzz both filenames and extensions simultaneously. - Place
FUZZ
keyword where the extension belongs in the URL.
- Use a common file like
- Command:
ffuf -w /opt/useful/SecLists/Discovery/Web-Content/web-extensions.txt:FUZZ -u http://<SERVER_IP>:<PORT>/blog/indexFUZZ
- Ffuf Configuration:
- Method: GET
- Threads: 5
- Timeout: 10 seconds
- Matcher: HTTP status codes 200, 204, 301, 302, 307, 401, 403
- Follow Redirects: False
- Calibration: False
- Results:
.php
: HTTP 200 (valid, size: 0, empty page)..phps
: HTTP 403 (access denied, size: 283).- Total: 39 extensions tested.
- Conclusion: Website uses PHP, enabling targeted page fuzzing with
.php
extension.
Page Fuzzing
- Objective: Find PHP pages in the
/blog
directory using the same wordlist as directory fuzzing. - Wordlist:
/opt/useful/SecLists/Discovery/Web-Content/directory-list-2.3-small.txt
. - Command:
ffuf -w /opt/useful/SecLists/Discovery/Web-Content/directory-list-2.3-small.txt:FUZZ -u http://<SERVER_IP>:<PORT>/blog/FUZZ.php
- Ffuf Configuration:
- Method: GET
- Threads: 40
- Timeout: 10 seconds
- Matcher: HTTP status codes 200, 204, 301, 302, 307, 401, 403
- Follow Redirects: False
- Calibration: False
- Results:
index.php
: HTTP 200 (size: 0, empty page).[REDACTED].php
: HTTP 200 (size: 465, contains content, 42 words, 15 lines).- Total: 87,651 URLs tested in ~15 seconds (~5,843 req/sec).
- Verification:
- Visit
http://<SERVER_IP>:<PORT>/blog/[REDACTED].php
to confirm content. index.php
is empty, but[REDACTED].php
has accessible content.
- Visit
Next Steps
- Manually inspect discovered pages (e.g.,
[REDACTED].php
) for vulnerabilities or further exploration.
Notes on Recursive Fuzzing
Introduction
- Addresses the inefficiency of manually fuzzing directories and subdirectories sequentially, especially for websites with complex directory structures (e.g.,
/login/user/content/uploads/
). - Introduces recursive fuzzing to automate scanning of directories and their subdirectories.
Recursive Fuzzing Overview
- Definition: Automatically scans newly identified directories for pages and subdirectories, continuing until all specified levels are covered.
- Challenges:
- Large directory trees can significantly increase scan time and resource usage.
- Requires careful configuration to avoid excessive requests or network strain.
- Solution: Use recursion with a specified depth to limit scanning to manageable levels.
Ffuf Recursive Flags
- Flags:
-recursion
: Enables recursive scanning, starting new scans for discovered directories.-recursion-depth <n>
: Limits recursion ton
levels (e.g.,-recursion-depth 1
scans main directories and their immediate subdirectories only).-e <extension>
: Specifies file extensions (e.g.,-e .php
) for page fuzzing, assuming site-wide consistency.-v
: Outputs full URLs for clarity, distinguishing files across directories.
- Note: Extensions like
.php
are typically uniform across a site, simplifying fuzzing.
Recursive Scanning Example
- Command:
ffuf -w /opt/useful/SecLists/Discovery/Web-Content/directory-list-2.3-small.txt:FUZZ -u http://<SERVER_IP>:<PORT>/FUZZ -recursion -recursion-depth 1 -e .php -v
- Ffuf Configuration:
- Method: GET
- Wordlist:
/opt/useful/SecLists/Discovery/Web-Content/directory-list-2.3-small.txt
- Extensions:
.php
- Threads: 40
- Timeout: 10 seconds
- Matcher: HTTP status codes 200, 204, 301, 302, 307, 401, 403
- Follow Redirects: False
- Calibration: False
- Results:
- Discovered directories:
/blog
,/forum
. - Files:
http://<SERVER_IP>:<PORT>/index.php
(Status: 200, Size: 986).http://<SERVER_IP>:<PORT>/forum/index.php
(Status: 200, Size: 0).
- Other hits include previously identified pages and new subdirectories.
- Scan characteristics:
- Longer duration due to recursive checks.
- ~6x more requests than non-recursive scans.
- Wordlist effectively doubled (with and without
.php
).
- Discovered directories:
- Sample Output:
[Status: 200, Size: 986, Words: 423, Lines: 56] | URL | http://<SERVER_IP>:<PORT>/index.php [INFO] Adding a new job to the queue: http://<SERVER_IP>:<PORT>/forum/FUZZ [Status: 301, Size: 326, Words: 20, Lines: 10] | URL | http://<SERVER_IP>:<PORT>/blog [Status: 200, Size: 0, Words: 1, Lines: 1] | URL | http://<SERVER_IP>:<PORT>/forum/index.php
Key Observations
- Efficiency: Single command retrieves all previous results plus additional subdirectories and pages.
- Strategic Use: Start with shallow recursion (e.g.,
-recursion-depth 1
), then focus deeper scans on interesting directories to optimize time and resources.
Notes on DNS Records
Introduction
- Context: After accessing
/blog
directory, a message indicates the admin panel has moved toacademy.htb
. - Issue: Attempting to visit
http://academy.htb:<PORT>
results in a “can’t connect to the server” error.
Problem Analysis
- Browser Behavior:
- Browsers resolve URLs to IPs using:
- Local
/etc/hosts
file. - Public DNS servers (e.g., Google’s 8.8.8.8).
- Local
academy.htb
is not a public website and is not listed in public DNS or the local/etc/hosts
, causing connection failure.
- Browsers resolve URLs to IPs using:
- Direct IP Access: Visiting the server’s IP directly works, but using
academy.htb
fails due to unresolved DNS.
Solution: Modify /etc/hosts
- Command:
sudo sh -c 'echo "<SERVER_IP> academy.htb" >> /etc/hosts'
- Effect: Maps
academy.htb
to the target server’s IP, allowing the browser to resolve the URL. - Verification:
- Visit
http://academy.htb:<PORT>
; displays “Welcome to HTB Academy” (same as direct IP access). - Access
http://academy.htb:<PORT>/blog/index.php
to confirm it’s the same domain.
- Visit
Observations
- Domain Equivalence:
academy.htb
resolves to the same website as the direct IP, indicating it’s the same server. - Fuzzing Results: Previous recursive scans on the IP did not reveal admin panels or related directories.
- Next Steps: Investigate subdomains under
*.academy.htb
to locate the admin panel, covered in the next section.
Notes on Sub-domain Fuzzing
Introduction
- Focuses on using
ffuf
to identify subdomains (e.g.,photos.google.com
as a subdomain ofgoogle.com
) for a target website. - Subdomains are checked for existence by verifying if they resolve to a valid server IP via DNS records.
Requirements
- Wordlist: A list of common subdomain names.
- Location:
/opt/useful/SecLists/Discovery/DNS/subdomains-top1million-5000.txt
(shorter list for efficiency; larger lists available for broader scans).
- Location:
- Target: The domain to fuzz for subdomains (e.g.,
inlanefreight.com
oracademy.htb
).
Sub-domain Fuzzing Process
-
Methodology:
- Place the
FUZZ
keyword in the subdomain position of the URL (e.g.,https://FUZZ.domain.com
). - Use
ffuf
to send requests and check for valid HTTP responses indicating active subdomains.
- Place the
-
Example 1: inlanefreight.com:
- Command:
ffuf -w /opt/useful/SecLists/Discovery/DNS/subdomains-top1million-5000.txt:FUZZ -u https://FUZZ.inlanefreight.com/
- Ffuf Configuration:
- Method: GET
- Threads: 40
- Timeout: 10 seconds
- Matcher: HTTP status codes 200, 204, 301, 302, 307, 401, 403, 405
- Follow Redirects: False
- Calibration: False
- Results:
support.inlanefreight.com
: HTTP 301ns3.inlanefreight.com
: HTTP 301blog.inlanefreight.com
: HTTP 301my.inlanefreight.com
: HTTP 301www.inlanefreight.com
: HTTP 200 (Size: 22,266, Words: 2,903, Lines: 316)
- Observation: Multiple subdomains identified, with
www
returning a substantial page.
- Command:
-
Example 2: academy.htb:
- Command:
ffuf -w /opt/useful/SecLists/Discovery/DNS/subdomains-top1million-5000.txt:FUZZ -u https://FUZZ.academy.htb/
- Ffuf Configuration:
- Method: GET
- Threads: 40
- Timeout: 10 seconds
- Matcher: HTTP status codes 200, 204, 301, 302, 307, 401, 403
- Follow Redirects: False
- Calibration: False
- Progress: 4,997 requests (~131 req/sec)
- Results: No hits returned.
- Reason:
academy.htb
is not a public domain and lacks public DNS records.- Although
academy.htb
was added to/etc/hosts
, subdomains (e.g.,admin.academy.htb
) are not included, and public DNS queries fail.
- Command:
Key Insights
- No Hits ≠No Subdomains: Lack of results for
academy.htb
indicates no public DNS records, not an absence of subdomains. - Local Environment Limitation: Since
academy.htb
is a local HTB domain, subdomains may exist but require manual/etc/hosts
updates or alternative discovery methods (e.g., VHost fuzzing, covered later).
Notes on VHost Fuzzing
Introduction
- Addresses limitations of subdomain fuzzing for non-public domains (e.g.,
academy.htb
), where public DNS records are unavailable. - Introduces VHost (Virtual Host) fuzzing to identify subdomains and virtual hosts served on the same IP, including those without public DNS records.
VHosts vs. Sub-domains
- Sub-domains: Distinct domains under a parent domain (e.g.,
photos.google.com
undergoogle.com
), typically with public DNS records. - VHosts: Multiple websites (subdomains or domains) served on the same server/IP, which may or may not have public DNS records.
- Key Difference: VHosts share the same IP, allowing a single server to host multiple sites, unlike subdomains which may resolve to different IPs.
- Challenge: Non-public subdomains/VHosts (e.g., under
academy.htb
) are not discoverable via public DNS or standard subdomain fuzzing.
VHost Fuzzing
- Purpose: Identify both public and non-public subdomains/VHosts on a known IP by fuzzing the HTTP
Host
header. - Method:
- Avoid manually updating
/etc/hosts
for each potential subdomain. - Use
ffuf
with the-H
flag to set theHost
header with theFUZZ
keyword.
- Avoid manually updating
- Command:
ffuf -w /opt/useful/SecLists/Discovery/DNS/subdomains-top1million-5000.txt:FUZZ -u http://academy.htb:<PORT>/ -H "Host: FUZZ.academy.htb"
- Behavior:
- All requests target the same IP (
academy.htb
), with theHost
header varied to test potential VHosts. - Default response: HTTP 200 OK for all requests, as the server accepts any
Host
header and serves the default site (e.g.,academy.htb
). - Detection: Valid VHosts return different response sizes, indicating a unique page served for that host.
- All requests target the same IP (
Key Insights
- Response Analysis: Filter results by response size to identify valid VHosts, as different sizes suggest distinct content.
- Non-Public VHosts: Enables discovery of hidden subdomains (e.g.,
admin.academy.htb
) not listed in public DNS, critical for local HTB environments.
Notes on Filtering Results
Introduction
- Default
ffuf
behavior filters out HTTP 404 (Not Found) responses, retaining codes like 200, 301, etc. - Issue: VHost fuzzing on
academy.htb
returns many HTTP 200 responses, necessitating additional filtering to identify valid VHosts.
Filtering Options in Ffuf
- Command:
ffuf -h
reveals filtering and matching options:- Matcher Options:
-mc
: Match HTTP status codes (default: 200, 204, 301, 302, 307, 401, 403).-ml
: Match response line count.-mr
: Match response regex.-ms
: Match response size.-mw
: Match response word count.
- Filter Options:
-fc
: Filter HTTP status codes.-fl
: Filter response line count.-fr
: Filter response regex.-fs
: Filter response size.-fw
: Filter response word count.
- Matcher Options:
- Strategy: Filtering is preferred over matching when the response size of valid VHosts is unknown, but the size of incorrect responses is known.
VHost Fuzzing with Filtering
- Context: Previous VHost fuzzing showed all responses with HTTP 200 and a consistent response size of 900 bytes for incorrect VHosts.
- Filter: Use
-fs 900
to exclude responses with size 900 bytes. - Command:
ffuf -w /opt/useful/SecLists/Discovery/DNS/subdomains-top1million-5000.txt:FUZZ -u http://academy.htb:<PORT>/ -H "Host: FUZZ.academy.htb" -fs 900
- Ffuf Configuration:
- Method: GET
- Wordlist:
/opt/useful/SecLists/Discovery/DNS/subdomains-top1million-5000.txt
- Header:
Host: FUZZ.academy.htb
- Threads: 40
- Timeout: 10 seconds
- Matcher: HTTP status codes 200, 204, 301, 302, 307, 401, 403
- Filter: Response size 900
- Progress: 4,997 requests (~1,249 req/sec, ~4 seconds)
- Result:
admin.academy.htb
: HTTP 200, Size: 0, Words: 1, Lines: 1.
Verification
- Update /etc/hosts:
- Add
admin.academy.htb
to/etc/hosts
with the server IP:sudo sh -c 'echo "<SERVER_IP> admin.academy.htb" >> /etc/hosts'
- Add
- Access Check:
- Visit
https://admin.academy.htb:<PORT>/
:- Returns an empty page, unlike
academy.htb
, confirming a distinct VHost.
- Returns an empty page, unlike
- Visit
https://admin.academy.htb:<PORT>/blog/index.php
:- Returns HTTP 404 (Not Found), further confirming a separate VHost with different content.
- Visit
- Note: Ensure the correct port is used, especially if the exercise has been restarted.
Next Steps
- Perform a recursive scan on
admin.academy.htb
to identify pages and directories:ffuf -w /opt/useful/SecLists/Discovery/Web-Content/directory-list-2.3-small.txt:FUZZ -u http://admin.academy.htb:<PORT>/FUZZ -recursion -recursion-depth 1 -e .php -v
Notes on GET Parameter Fuzzing
Introduction
- Context: Recursive scan on
admin.academy.htb
revealshttp://admin.academy.htb:<PORT>/admin/admin.php
, which displays: “You don’t have access to read the flag!” - Hypothesis: Access may require a specific parameter (e.g., a key) passed via GET or POST request to authenticate or unlock content.
- Objective: Use
ffuf
to fuzz GET parameters to identify valid ones that grant access. - Significance: Fuzzing may uncover unpublished, less-secure parameters, which are prime targets for web vulnerabilities.
GET Request Fuzzing
- GET Parameters: Passed in the URL after a
?
(e.g.,http://admin.academy.htb:<PORT>/admin/admin.php?param1=key
). - Methodology:
- Replace the parameter name (e.g.,
param1
) with theFUZZ
keyword. - Use a wordlist of common parameter names.
- Filter out default responses to isolate valid parameters.
- Replace the parameter name (e.g.,
- Wordlist:
/opt/useful/SecLists/Discovery/Web-Content/burp-parameter-names.txt
. - Challenge: Many responses may return HTTP 200, requiring filtering by response size to identify unique results.
- Command:
ffuf -w /opt/useful/SecLists/Discovery/Web-Content/burp-parameter-names.txt:FUZZ -u http://admin.academy.htb:<PORT>/admin/admin.php?FUZZ=key -fs <default_response_size>
- Notes:
<default_response_size>
must be determined from initial scans (e.g., size of the “access denied” page).- The
key
value is a placeholder; actual fuzzing of parameter values is covered in later sections.
Key Insights
- Security Implications: Discovered parameters may be poorly tested, making them vulnerable to exploitation (e.g., SQL injection, XSS).
- Next Steps: If a valid parameter is found, test it for vulnerabilities or proceed to fuzz parameter values to unlock the flag.
Notes on POST Parameter and Value Fuzzing
POST Parameter Fuzzing
Introduction
- Context: Continues from GET parameter fuzzing on
http://admin.academy.htb:<PORT>/admin/admin.php
, which indicated restricted access to a flag. - Difference from GET: POST parameters are sent in the HTTP request body, not appended to the URL, requiring specific
ffuf
flags. - Objective: Fuzz POST parameters to identify those accepted by
admin.php
.
Methodology
- Ffuf Flags:
-d
: Specifies POST data with theFUZZ
keyword for parameter names.-X POST
: Sets the HTTP method to POST.-H "Content-Type: application/x-www-form-urlencoded"
: Ensures PHP compatibility for POST data.
- Wordlist:
/opt/useful/SecLists/Discovery/Web-Content/burp-parameter-names.txt
. - Command:
ffuf -w /opt/useful/SecLists/Discovery/Web-Content/burp-parameter-names.txt:FUZZ -u http://admin.academy.htb:<PORT>/admin/admin.php -X POST -H "Content-Type: application/x-www-form-urlencoded" -d "FUZZ=key" -fs <default_response_size>
- Note:
<default_response_size>
is the size of the default “access denied” response, used to filter out invalid results.
Results
- Hits:
- Same parameter as found in GET fuzzing (not specified).
- New parameter:
id
.
- Verification:
- Test
id
with a POST request usingcurl
:curl -X POST http://admin.academy.htb:<PORT>/admin/admin.php -d "id=key"
- Response:
<div class='center'><p>Invalid id!</p> ...
, indicatingid
is a valid parameter but requires a specific value.
- Test
Value Fuzzing
Introduction
- Objective: Fuzz values for the
id
parameter to find the correct one that grants access to the flag. - Challenge: No pre-made wordlist may match the expected value format, requiring a custom wordlist.
Custom Wordlist Creation
- Assumption:
id
likely accepts a numerical value (e.g., sequential IDs from 1 to 1000). - Command:
for i in $(seq 1 1000); do echo $i >> ids.txt; done
- Output: Creates
ids.txt
with numbers 1 to 1000:1 2 3 ...
- Alternative: Use existing SecLists wordlists (e.g., for usernames) or script custom formats in Bash/Python if the parameter expects non-numeric values.
Value Fuzzing Process
- Methodology:
- Place
FUZZ
where theid
value belongs in the POST data. - Use
ids.txt
as the wordlist.
- Place
- Command:
ffuf -w ids.txt:FUZZ -u http://admin.academy.htb:<PORT>/admin/admin.php -X POST -H "Content-Type: application/x-www-form-urlencoded" -d "id=FUZZ" -fs <default_response_size>
- Result: Identifies a valid
id
value (specific status and size redacted).
Verification
- Final POST Request:
- Use
curl
with the discoveredid
value:curl -X POST http://admin.academy.htb:<PORT>/admin/admin.php -d "id=<valid_id>"
- Collects the flag from the response.
- Use
Key Insights
- POST Fuzzing: Essential for parameters not exposed in URLs, using
-d
and-X POST
with appropriate headers. - Custom Wordlists: Critical for value fuzzing when parameters expect specific formats (e.g., numeric IDs).
- Security Note: Discovered parameters/values may reveal vulnerabilities, warranting further testing (e.g., injection attacks).