Burp Suite Part 2: Repeater, Intruder, Sequencer & Decoder
This is Chapter 2 of the Web Tooling notebook and the second part of the Burp Suite series. Chapter 1 got you intercepting and scoping traffic — Burp as a window onto HTTP. This chapter turns Burp into a workshop. Four tools do the heavy lifting of manual web testing: Repeater (edit and resend one request, over and over, with precision), Intruder (automate that editing across huge payload sets), Sequencer (measure whether tokens are truly random), and Decoder (encode, decode, and hash data). Master these and you can express almost any web-testing idea as a concrete experiment against the target.
Everything here assumes the Chapter 1 setup: Burp installed, CA trusted, browser proxied, and — non-negotiably — Target scope configured so these tools only ever fire at hosts you are authorised to test. Intruder in particular is a machine gun; scope and throttling are what keep it a tool rather than a DoS.
Why This Matters
Section titled “Why This Matters”Chapter 1 let you change one request by hand. But real testing is iterative and combinatorial. To confirm SQL injection you send a quote, then a balanced quote, then a boolean pair, comparing each response — that’s Repeater. To find which of 500 user IDs you can access, or which of 10,000 passwords works, or which of 6,000 parameter names the endpoint secretly honours, you need to send thousands of variations and diff the results automatically — that’s Intruder. To argue that a “random” session token is actually predictable (so you could hijack sessions) you need to measure its entropy statistically — that’s Sequencer. And to make sense of the Base64/URL/hex/JWT soup that web apps run on, you need Decoder.
These four convert the vague intuition “something’s off here” into evidence a triager can’t argue with. They are where manual skill and light automation meet, and where most bounty-worthy web bugs are actually confirmed.
flowchart LR
P[Proxy: caught request] --> R[Repeater: iterate by hand]
P --> I[Intruder: iterate by machine]
R --> E{Evidence?}
I --> E
P --> S[Sequencer: token entropy]
P --> D[Decoder: encode/decode/hash]
D --> R
E -->|yes| Rep[Write the finding]
Part 1: Repeater — The Surgical Tool
Section titled “Part 1: Repeater — The Surgical Tool”Repeater holds a single request that you can edit and resend endlessly, viewing each response side by side. It is the most-used manual tool in Burp because most web testing is a conversation: send a probe, read the reply, form a hypothesis, adjust, send again.
1.1 Getting a request into Repeater
Section titled “1.1 Getting a request into Repeater”From anywhere (Proxy intercept, HTTP history, Site map, Intruder), right-click →
Send to Repeater (Ctrl+R). Switch to the Repeater tab (Ctrl+Shift+R). You
see the request on the left and, after sending (Ctrl+Space or the Send
button), the response on the right.
1.2 The Repeater workflow — hypothesis-driven testing
Section titled “1.2 The Repeater workflow — hypothesis-driven testing”Repeater’s power is discipline, not features. The loop:
- Baseline. Send the request unmodified. Note status, length, timing, and key response content. This is your control.
- One change. Alter exactly one thing (a single parameter, one header).
- Compare. Resend; diff the response against the baseline. Did status, length, content, or timing change? Why?
- Iterate. Refine the hypothesis and repeat.
A worked example — probing for SQL injection on a product lookup:
# BaselineGET /rest/products/1 HTTP/2Host: app.example.com→ 200 OK, {"id":1,"name":"Apple Juice","price":1.99} (len 512)
# Probe 1: break the query with a quoteGET /rest/products/1' HTTP/2→ 500 Internal Server Error, "SQLITE_ERROR: near ...'" (len predator) ← lead!
# Probe 2: balanced quote (valid SQL again)GET /rest/products/1'-- - HTTP/2→ 200 OK ← behaviour differs between broken and balanced = strong SQLi signalThe difference between the broken and the balanced probe — error vs success — is the evidence. You didn’t need to dump anything; you demonstrated the parameter reaches a SQL query. (Exploiting it is the Injection notebook’s job; confirming it is Repeater’s.)
1.3 Repeater features that matter
Section titled “1.3 Repeater features that matter”- Tabs. Each Repeater tab is an independent request; rename them
(double-click) so
login,idor-order,search-sqliare easy to find. - Change request method / body encoding. Right-click → Change request method to flip GET↔POST instantly (great for testing HTTP method confusion).
- Inspector (right panel). Decodes and lets you edit request/response components
— headers, cookies, query params, body params — in a structured view, and shows
the length/encoding of selected text. Invaluable for editing JSON/params without
breaking
Content-Length. - Follow redirects and show response in browser (right-click the response) to render a page you built via a mutated request.
- Send history — Repeater keeps a per-tab history (
<>arrows) so you can step back to a previous request/response pair.
Bug-bounty reality. The vast majority of your accepted bugs will be confirmed in Repeater. IDOR: change the ID, resend, see someone else’s (your second test account’s) data. Auth bypass: strip the auth header, resend, still get 200. Business logic: reorder or repeat a step, resend, get a free item. The pattern is always baseline → one change → compare. Learn to be ruthless about changing one variable at a time so you always know what caused the change.
Part 2: Intruder — Automation Over Payloads
Section titled “Part 2: Intruder — Automation Over Payloads”Intruder does what Repeater does, but for hundreds or thousands of automated variations. You mark positions in a request (the bytes to vary), supply payloads (the values to try), and Intruder sends one request per payload, tabulating the responses so outliers jump out.
Send a request to Intruder with Ctrl+I, then work through its sub-tabs:
Positions, Payloads, Resource pool, Settings.
2.1 Positions — marking what varies
Section titled “2.1 Positions — marking what varies”On the Positions tab, Burp auto-marks candidate insertion points with §...§
markers. Clear § and mark your own by selecting text and clicking Add §. The
positions plus the attack type determine how payloads are distributed.
2.2 The four attack types (the concept people get wrong)
Section titled “2.2 The four attack types (the concept people get wrong)”flowchart TD
A[How many positions? How to combine payloads?] --> B[Sniper: 1 payload set,<br/>one position at a time]
A --> C[Battering Ram: 1 payload set,<br/>SAME value in ALL positions]
A --> D[Pitchfork: N sets,<br/>parallel, in lockstep]
A --> E[Cluster Bomb: N sets,<br/>every combination]
| Attack type | Payload sets | Behaviour | Classic use |
|---|---|---|---|
| Sniper | 1 | Puts each payload in one position at a time, cycling through positions singly | Fuzzing a single parameter; testing each of several params one by one |
| Battering Ram | 1 | Puts the same payload into all marked positions simultaneously | When the same value must appear in several places (e.g. a token in header and body) |
| Pitchfork | up to 20 | Iterates multiple sets in parallel (1st with 1st, 2nd with 2nd) | Paired data: username[i] + password[i] from two lists (credential stuffing) |
| Cluster Bomb | up to 20 | Tries every combination of the sets (nested loops) | Brute force: every username × every password |
Getting these right is the whole skill. If you have a username list and a password
list and want to try all pairs, that’s Cluster Bomb; if you have leaked
user:pass pairs and want to try each pair as-is, that’s Pitchfork.
2.3 Payloads — where the values come from
Section titled “2.3 Payloads — where the values come from”On the Payloads tab, pick a payload type and a payload set:
- Simple list — paste or load values (from SecLists, a file, etc.).
- Runtime file — stream a huge wordlist from disk without loading it all.
- Numbers — generate a numeric range/step (perfect for IDOR:
1..1000). - Brute forcer — generate character combinations.
- Dates, Username generator, Bit flipper, Case modification, etc.
Payload processing rules transform each payload before sending — e.g. URL-encode
it, prefix/suffix it, hash it, or apply a match/replace. Payload encoding
controls URL-encoding of special characters. Example: to brute a user_id for IDOR:
Attack type : SniperPosition : GET /api/orders/§1§Payload type: Numbers (from 1 to 1000, step 1)2.4 Reading results — grep-match and grep-extract
Section titled “2.4 Reading results — grep-match and grep-extract”Intruder tabulates every response with status, length, and timing. Outliers are
your hits — a different length or status among a sea of identical 403s usually
means “this one worked.” Sharpen it with Settings → Grep - Match (flag responses
containing a string like "balance" or admin) and Grep - Extract (pull a
value — e.g. the account name — out of each response into its own column). For a
username brute you might Grep-Match on the absence of "Invalid credentials".
2.5 Throttling, the resource pool, and Community limits
Section titled “2.5 Throttling, the resource pool, and Community limits”Intruder is where you can accidentally hammer a target. Control the rate:
- Resource pool (tab) — set maximum concurrent requests and a delay between requests (fixed or with random variance). On a small target, 1–2 concurrent with a 100–500 ms delay is considerate.
- Community Edition throttles Intruder heavily (a hard per-request delay), making large attacks painfully slow — this is deliberate, to push serious users to Professional. For big brute forces in Community, people often use ffuf instead (covered in Chapter 5) and reserve Intruder for smaller, precise attacks.
OPSEC / rules. Respect the program’s rate-limit and automation rules from Chapter 1. An unthrottled Cluster Bomb against a fragile app is a denial of service — forbidden and potentially criminal. Throttle, keep it in scope, and attach your identifying header (Match-and-Replace from Chapter 1). Automated brute force also generates exactly the auth-failure spikes a blue team alerts on; that’s expected for authorised testing, which is why the identifying header matters.
2.6 Worked Intruder attacks
Section titled “2.6 Worked Intruder attacks”A. Fuzzing a parameter for injection/errors (Sniper). Mark the search
parameter, load a fuzzing list (/usr/share/seclists/Fuzzing/special-chars.txt),
Grep-Match on error|exception|syntax. Outlier responses reveal injection points.
B. IDOR enumeration (Sniper + Numbers). Mark the object ID, Numbers 1–1000, Grep-Extract the owner’s name/email. Rows whose extracted owner isn’t you prove horizontal access-control failure — but stop at proving it with a couple of IDs, do not harvest real users.
C. Credential stuffing of your own test accounts (Pitchfork). Two lists (usernames, passwords) in lockstep, Grep-Match on the success indicator. Only ever against accounts you own or the program authorises.
D. Hidden parameter discovery (Sniper). Position a bogus parameter name, payload set = a param wordlist, Grep on response-length change — a Burp-native version of Arjun (Chapter 5).
Part 3: Sequencer — Are Those Tokens Actually Random?
Section titled “Part 3: Sequencer — Are Those Tokens Actually Random?”Session cookies, password-reset tokens, CSRF tokens and API keys are only safe if they are unpredictable. If an attacker can guess or compute the next token, they can hijack sessions or forge requests. Sequencer samples a large number of tokens and runs statistical randomness/entropy tests on them to estimate how many bits of real unpredictability they contain.
3.1 How to run it
Section titled “3.1 How to run it”- Find a response that issues a token (e.g.
Set-Cookie: session=...after login, or a hiddencsrffield). - Right-click → Send to Sequencer.
- In Sequencer, select the token’s location (the cookie or the parameter).
- Start live capture — Sequencer repeatedly triggers the request and collects tokens (aim for a few thousand samples).
- Analyze now — Burp reports effective entropy in bits and per-character/ per-bit test results (FIPS-style tests: monobit, poker, runs, etc.).
3.2 Interpreting the result
Section titled “3.2 Interpreting the result”- High entropy (e.g. ~120+ bits for a session token) → effectively unpredictable; not a finding.
- Low entropy (e.g. tokens that are sequential, timestamp-based, or only 20–30 bits of real randomness) → predictable tokens, a real, sometimes high-severity bug (session prediction, reset-token guessing). Sequencer’s report is your evidence: “over 10,000 samples, effective entropy was ~18 bits, and the low bytes increment predictably.”
sequenceDiagram
participant B as Burp Sequencer
participant S as Server
loop thousands of times
B->>S: request that issues a token
S->>B: Set-Cookie: session=<token>
end
B->>B: run entropy/FIPS tests on all tokens
B->>You: effective entropy = N bits + charts
Reality check. Most modern frameworks issue strong random tokens, so Sequencer rarely fires — but when it does (homegrown token schemes, predictable reset codes), it’s a clean, well-evidenced, hard-to-argue finding. It’s also the right tool to disprove a randomness claim before you waste time trying to guess tokens.
Part 4: Decoder and the Inspector — Speaking Web Encodings
Section titled “Part 4: Decoder and the Inspector — Speaking Web Encodings”Web apps drown in encodings: URL-encoding, Base64, hex, HTML entities, gzip, and hashes. Decoder (and the newer Inspector panel in Repeater/Proxy) let you transform data quickly.
4.1 Decoder
Section titled “4.1 Decoder”Paste data, then Decode as / Encode as: URL, HTML, Base64, ASCII hex, octal, binary, gzip. Chain operations (Base64-decode, then URL-decode) to peel layered encodings. Hash produces MD5/SHA-1/SHA-256 etc. “Smart decode” guesses the encoding.
Common real uses:
- Decode a Base64 cookie to reveal its structure:
eyJ1c2VyIjoiYWRtaW4ifQ==→{"user":"admin"}— and if the app trusts that without a signature, you can re-encode a tampered value and swap it in (a real bug class). - Decode a JWT’s three Base64URL segments to read the header and claims (deep JWT attacks come later; Decoder is how you read one now).
- URL-decode a nasty-looking parameter to see the real payload underneath.
- Hash a value to compare against a leaked hash, or to build a payload the app expects hashed.
4.2 The Inspector
Section titled “4.2 The Inspector”In Repeater/Proxy, the Inspector side panel breaks a request into editable
components (query params, cookies, headers, body) and auto-decodes selected text,
showing you the plaintext of an encoded value and its length. It’s the fastest way
to edit one URL-encoded parameter without hand-fixing the encoding or
Content-Length.
4.3 Comparer (the fifth wheel, briefly)
Section titled “4.3 Comparer (the fifth wheel, briefly)”Comparer does a word- or byte-level diff of two items — two responses, two tokens, two requests. Send a “before” and “after” response to Comparer to see exactly what changed when you flipped a parameter. It pairs naturally with the Repeater baseline-vs-probe workflow when the difference is subtle.
Part 5: Hands-On Lab — From Baseline to Confirmed Bug
Section titled “Part 5: Hands-On Lab — From Baseline to Confirmed Bug”Use a legal target: PortSwigger Web Security Academy (ideal — it has dedicated Intruder/Sequencer labs) or OWASP Juice Shop locally. Keep everything scoped.
Step 1 — Repeater: confirm an injection point
Section titled “Step 1 — Repeater: confirm an injection point”- In Juice Shop, search for a product; find the request
GET /rest/products/search?q=applein HTTP history →Ctrl+R. - Baseline send. Note status/length.
- Change
q=appletoq=apple'and send. Watch for an error or length change. - Try
q=apple'))--variants, comparing each. Document the request/response pair that best demonstrates the parameter reaches a backend query.
Step 2 — Intruder: enumerate with Numbers (IDOR-style)
Section titled “Step 2 — Intruder: enumerate with Numbers (IDOR-style)”- Find an object-by-ID request (
GET /api/BasketItems/1or similar) →Ctrl+I. - Positions: clear §, mark the
1. Attack type: Sniper. - Payloads: Numbers, 1–50, step 1.
- Settings → Grep - Extract: pull an identifying field from the response.
- Resource pool: 1 concurrent, 200 ms delay (be gentle on localhost anyway).
- Start attack. Sort by status/length. Rows returning data for IDs that aren’t your account demonstrate access-control failure. Stop once proven.
Step 3 — Sequencer: measure a token
Section titled “Step 3 — Sequencer: measure a token”- Capture a token-issuing response (login
Set-Cookie, or a CSRF field). - Send to Sequencer → select the token location → Start live capture.
- Let it gather a couple thousand samples → Analyze. Record the effective entropy. Is this token safe or predictable? Write one sentence of conclusion with the number.
Step 4 — Decoder: peel an encoding
Section titled “Step 4 — Decoder: peel an encoding”- Grab an encoded value from the app (a Base64 cookie, an encoded parameter).
- In Decoder, decode it. If it’s structured (JSON/JWT), read the fields. Note whether tampering would be detected (is it signed?). Re-encode a harmless change and observe (in Repeater) whether the server accepts it.
Step 5 — Comparer: prove the difference
Section titled “Step 5 — Comparer: prove the difference”Take the baseline response and the “bug” response from Step 1 or 2, Send to Comparer, and view the word diff. Screenshot it — that clean diff is exactly the kind of evidence that goes into a report.
Deliverable: short notes containing (a) a Repeater request/response proving an injection or logic point, (b) an Intruder results screenshot with the outlier highlighted, (c) a Sequencer entropy figure with a one-line verdict, and (d) a decoded token with a note on whether it’s tamper-protected.
CTF connection. Intruder + Grep-Match is how you brute a challenge’s numeric PIN or enumerate hidden IDs; Decoder cracks the layered Base64/hex/ROT the challenge wraps the flag in; Sequencer occasionally proves a “guess the token” challenge is actually guessable. The exact tools, minus the reporting.
Part 6: Detection & Defense Angle
Section titled “Part 6: Detection & Defense Angle”- Intruder is the loudest thing you’ll do. A brute force or fuzz is a burst of hundreds/thousands of requests to one endpoint — trivially visible as an auth-failure spike, a 4xx/5xx flood, or a WAF signature match. Defenders respond with rate limiting, account lockout, CAPTCHA, and WAF rules. As a hunter, throttle and attach your identifying header so this reads as authorised testing, not an attack; as a defender, these signals are your early warning.
- Sequencer findings are a defender’s gift. If your tokens fail entropy tests,
fix the generator (use a CSPRNG, not
rand()/timestamps). Predictable session or reset tokens are among the more damaging web bugs precisely because they bypass authentication silently. - Decoder teaches the defensive lesson too: encoding is not encryption. A Base64 cookie is plaintext with a costume on. If your app trusts a client-supplied encoded value without a signature/MAC, an attacker re-encodes a tampered version and you’ll never know. Sign or encrypt anything the client shouldn’t be able to forge (this is why JWTs are signed).
Part 7: Common Mistakes and How to Avoid Them
Section titled “Part 7: Common Mistakes and How to Avoid Them”| Mistake | Why it hurts | The fix |
|---|---|---|
| Changing multiple things in Repeater at once | Can’t attribute the change | One variable at a time vs a baseline |
| Wrong Intruder attack type | All-pairs vs lockstep confusion | Cluster Bomb = every combo; Pitchfork = parallel |
| Unthrottled Intruder on a live target | DoS risk + rules violation + block | Resource pool: low concurrency + delay |
| Reading Intruder results by eye only | Miss subtle hits | Use Grep-Match / Grep-Extract columns |
| Expecting fast Intruder in Community | It’s deliberately throttled | Use ffuf for big brute forces (Ch. 5) |
| Treating Base64 as “encrypted” | It’s trivially reversible | Look for a signature; encoding ≠ security |
| Trusting one Sequencer sample set | Too few samples = noisy | Capture thousands before concluding |
| Harvesting real data during IDOR enum | Ethics/legal violation | Prove with a couple of IDs, then stop |
Part 8: Final Revision / Summary
Section titled “Part 8: Final Revision / Summary”This chapter turned Burp into a testing engine with four tools. Repeater is the surgical instrument: send a baseline, change one variable, compare the response, iterate — the loop that confirms most web bugs (injection points, IDOR, auth bypass, business logic). Intruder automates that loop across payload sets; choose the right attack type — Sniper (one payload, one position at a time), Battering Ram (same payload in all positions), Pitchfork (multiple sets in lockstep), Cluster Bomb (every combination) — supply payloads (lists, numbers, processing rules), and read results via status/length/timing plus Grep-Match/Extract, always throttled via the resource pool and mindful that Community is rate-limited (reach for ffuf for big jobs). Sequencer measures token entropy to prove predictability — a clean, well-evidenced finding when tokens are weak. Decoder and the Inspector peel URL/Base64/hex/gzip encodings and compute hashes, teaching the standing lesson that encoding is not encryption; Comparer diffs two items to surface subtle changes. Throughout, scope and throttling keep these powerful tools lawful and considerate, and an identifying header keeps your authorised testing distinguishable from an attack. Chapter 3 completes the series with the Scanner, BApp extensions, and Collaborator.
Part 9: Cheat Sheet / Quick Reference
Section titled “Part 9: Cheat Sheet / Quick Reference”Repeater
Ctrl+R send to Repeater Ctrl+Shift+R jump to RepeaterCtrl+Space send request right-click → Change request methodLoop: baseline → one change → compare → iterateRename tabs; use Inspector to edit params without breaking Content-LengthIntruder attack types
Sniper 1 set, one position at a time (fuzz a param, numeric IDOR)Battering Ram 1 set, same value in all positions (token in header+body)Pitchfork N sets in lockstep (leaked user:pass pairs)Cluster Bomb N sets, every combination (user list × pass list)Intruder payloads & reading results
Payload types : Simple list | Runtime file | Numbers(1..N) | Brute forcerProcessing : URL-encode | prefix/suffix | hash | match/replaceGrep - Match : flag responses containing XGrep - Extract: pull a value into its own columnOutlier = different status/length/timing = likely hitResource pool : low concurrency + delay (be gentle; Community is throttled)Sequencer
Send token-issuing response → select token → Start live capture (thousands)→ Analyze → effective entropy in bits. Low bits = predictable = bug.Decoder
Decode/Encode as: URL | HTML | Base64 | ASCII hex | gzip ; Hash: MD5/SHA*Chain to peel layers. Remember: Base64 = encoding, NOT encryption.Part 10: Practice Labs & Resources
Section titled “Part 10: Practice Labs & Resources”- PortSwigger Web Security Academy (
portswigger.net/web-security) — has purpose-built labs: “Authentication” (Intruder brute force), “Access control” (IDOR enumeration), and token/session labs that map directly onto Sequencer. The best possible practice for this chapter. - PortSwigger Burp docs — Intruder & Sequencer sections — authoritative reference for attack types, payload processing, and entropy analysis.
- OWASP Juice Shop — free-form practice for Repeater/Intruder/Decoder against a local target.
- TryHackMe: “Burp Suite: Repeater”, “Burp Suite: Intruder”, “Burp Suite: Other Modules” — guided rooms covering exactly these tools.
- SecLists (
Fuzzing/,Usernames/,Passwords/,Discovery/Web-Content/) — the payload lists that feed Intruder. - CyberChef (
gchq.github.io/CyberChef) — a browser “Decoder on steroids” for complex, chained encoding puzzles; complements Burp’s Decoder.
Practice questions:
- You have 200 usernames and 50 passwords and want to try every combination. Which Intruder attack type, and how many requests will it send?
- You captured 20 password-reset tokens and they look like
token=1700001, 1700002, 1700003.... Which Burp tool proves the problem, and what’s the finding? - In Repeater you change the
Cookieand theuser_idat once and the response changes. Why is this a flawed test, and how do you fix it? - A cookie is
eyJyb2xlIjoidXNlciJ9. Decode it. If the app has no signature on it, what attack does that enable and how would you demonstrate it non-destructively? - Why is a large Intruder Cluster Bomb in Community Edition slow, and what tool from a later chapter would you use instead for a big brute force?
Discussion
Questions, corrections, or something to add? Comment with your GitHub account.