Cybersecurity

Burp Suite Pro DevSecOps Integration — รวม DAST เข้ากับ CI/CD Pipeline

burp suite pro devsecops integration
Burp Suite Pro DevSecOps Integration | SiamCafe Blog
2026-05-09· อ. บอม — SiamCafe.net· 1,623 คำ

Burp Suite Pro คืออะไรและใช้ใน DevSecOps อย่างไร

Burp Suite Pro เป็น web application security testing platform จาก PortSwigger ที่ใช้กันแพร่หลายในวงการ penetration testing และ security assessment มี features หลักคือ Proxy สำหรับ intercept HTTP/HTTPS traffic, Scanner สำหรับ automated vulnerability scanning, Intruder สำหรับ fuzzing และ brute force, Repeater สำหรับ manual request manipulation และ Sequencer สำหรับ token analysis

ใน DevSecOps workflow Burp Suite Pro ถูกใช้เป็น DAST (Dynamic Application Security Testing) tool ที่ทดสอบ running applications หา vulnerabilities เช่น SQL Injection, XSS, CSRF, Authentication bypass และ Business logic flaws Burp Suite Pro มี REST API และ CI/CD integrations ที่ทำให้ automate การ scan ได้

ข้อดีของ Burp Suite เมื่อเทียบกับ DAST tools อื่นคือ ความแม่นยำสูง (low false positives), สามารถ crawl JavaScript-heavy SPAs ได้ดี, มี extensions ecosystem ใหญ่ (BApp Store), รองรับ authentication ที่ซับซ้อน และมี community ขนาดใหญ่

การรวม Burp Suite เข้ากับ DevSecOps pipeline ทำให้ทุก deployment ถูกตรวจสอบ security อัตโนมัติ พบ vulnerabilities เร็วขึ้น และลดภาระของ security team ที่ไม่ต้อง scan manually ทุกครั้ง

ตั้งค่า Burp Suite Pro สำหรับ Automated Scanning

ตั้งค่า Burp Suite Pro สำหรับ headless scanning และ API access

# ติดตั้ง Burp Suite Pro (headless mode)
# ดาวน์โหลดจาก https://portswigger.net/burp/releases

# รัน Burp Suite ใน headless mode
java -jar burpsuite_pro.jar \
  --project-file=project.burp \
  --config-file=scan-config.json \
  --unpause-spider-and-scanner

# scan-config.json — Configuration สำหรับ automated scanning
# {
#   "scanner": {
#     "active_scanning_optimization": {
#       "scan_speed": "fast",
#       "scan_accuracy": "normal"
#     },
#     "active_scanning_areas": {
#       "sql_injection": true,
#       "xss_reflected": true,
#       "xss_stored": true,
#       "command_injection": true,
#       "path_traversal": true,
#       "file_upload": true,
#       "xxe": true,
#       "ssrf": true,
#       "open_redirect": true,
#       "header_injection": true
#     },
#     "crawl_limits": {
#       "max_crawl_depth": 10,
#       "max_unique_locations": 5000,
#       "max_crawl_time": 3600
#     }
#   },
#   "project_options": {
#     "connections": {
#       "upstream_proxy": {
#         "use_upstream_proxy": false
#       },
#       "timeouts": {
#         "normal": 120,
#         "open_ended": 180
#       }
#     }
#   }
# }

# Burp Suite REST API (Enterprise/Pro)
# เปิด API: User Options -> Misc -> REST API
# Default port: 1337

# ตรวจสอบ API
curl -s http://localhost:1337/v0.1/ \
  -H "Authorization: Bearer YOUR_API_KEY"

# สร้าง scan ใหม่
curl -X POST http://localhost:1337/v0.1/scan \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "urls": ["https://staging.example.com"],
    "scan_configurations": [
      {"name": "Crawl and Audit - Fast"}
    ]
  }'

# ตรวจสอบ status
curl -s http://localhost:1337/v0.1/scan/TASK_ID \
  -H "Authorization: Bearer YOUR_API_KEY"

# ดึง issues
curl -s http://localhost:1337/v0.1/scan/TASK_ID/issues \
  -H "Authorization: Bearer YOUR_API_KEY"

รวม Burp Suite เข้ากับ CI/CD Pipeline

GitHub Actions workflow สำหรับ automated DAST scanning

# .github/workflows/dast-burp.yml
name: DAST Security Scan with Burp Suite

on:
  push:
    branches: [main]
  pull_request:
    branches: [main]
  schedule:
    - cron: '0 2 * * 1'  # ทุกวันจันทร์ตี 2

jobs:
  deploy-staging:
    runs-on: ubuntu-latest
    outputs:
      staging_url: }
    steps:
      - uses: actions/checkout@v4
      - name: Deploy to staging
        id: deploy
        run: |
          # Deploy app to staging environment
          docker compose -f docker-compose.staging.yml up -d
          echo "url=http://staging.internal:8080" >> $GITHUB_OUTPUT
          sleep 30  # รอ app พร้อม

  burp-scan:
    needs: deploy-staging
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      
      - name: Setup Python
        uses: actions/setup-python@v5
        with:
          python-version: '3.11'
      
      - name: Install dependencies
        run: pip install requests jinja2
      
      - name: Start Burp Suite scan
        env:
          BURP_API_URL: }
          BURP_API_KEY: }
          TARGET_URL: }
        run: |
          python3 scripts/burp_ci_scan.py \
            --api-url "$BURP_API_URL" \
            --api-key "$BURP_API_KEY" \
            --target "$TARGET_URL" \
            --config "Crawl and Audit - Fast" \
            --timeout 3600 \
            --fail-on high, critical \
            --output burp-results.json
      
      - name: Generate HTML Report
        if: always()
        run: python3 scripts/burp_report.py burp-results.json burp-report.html
      
      - name: Upload Report
        if: always()
        uses: actions/upload-artifact@v4
        with:
          name: burp-security-report
          path: |
            burp-results.json
            burp-report.html
      
      - name: Comment PR with results
        if: github.event_name == 'pull_request' && always()
        uses: actions/github-script@v7
        with:
          script: |
            const fs = require('fs');
            const results = JSON.parse(fs.readFileSync('burp-results.json', 'utf8'));
            const critical = results.issues.filter(i => i.severity === 'high').length;
            const medium = results.issues.filter(i => i.severity === 'medium').length;
            const low = results.issues.filter(i => i.severity === 'low').length;
            
            const body = `## DAST Security Scan Results
            | Severity | Count |
            |----------|-------|
            | Critical/High |  |
            | Medium |  |
            | Low |  |
            
            
            `;
            
            github.rest.issues.createComment({
              issue_number: context.issue.number,
              owner: context.repo.owner,
              repo: context.repo.repo,
              body: body
            });

# Jenkins Pipeline Alternative
# pipeline {
#   agent any
#   stages {
#     stage('DAST Scan') {
#       steps {
#         sh '''
#           python3 scripts/burp_ci_scan.py \
#             --target  \
#             --fail-on high
#         '''
#       }
#     }
#   }
# }

สร้าง Custom Extensions ด้วย Python

สร้าง Burp Suite extension สำหรับ custom security checks

#!/usr/bin/env python3
# burp_ci_scan.py — Burp Suite CI/CD Integration Script
import requests
import json
import time
import sys
import argparse

class BurpCIScanner:
    def __init__(self, api_url, api_key):
        self.api_url = api_url.rstrip("/")
        self.api_key = api_key
        self.headers = {
            "Authorization": f"Bearer {api_key}",
            "Content-Type": "application/json",
        }
    
    def create_scan(self, target_url, config_name="Crawl and Audit - Fast"):
        payload = {
            "urls": [target_url],
            "scan_configurations": [{"name": config_name}],
        }
        
        resp = requests.post(
            f"{self.api_url}/v0.1/scan",
            headers=self.headers,
            json=payload,
        )
        
        if resp.status_code == 201:
            task_id = resp.headers.get("Location", "").split("/")[-1]
            print(f"Scan created: task_id={task_id}")
            return task_id
        else:
            raise Exception(f"Failed to create scan: {resp.status_code} {resp.text}")
    
    def wait_for_scan(self, task_id, timeout=3600, poll_interval=30):
        start = time.time()
        
        while time.time() - start < timeout:
            resp = requests.get(
                f"{self.api_url}/v0.1/scan/{task_id}",
                headers=self.headers,
            )
            
            if resp.status_code != 200:
                raise Exception(f"Failed to get scan status: {resp.status_code}")
            
            data = resp.json()
            status = data.get("scan_status", "unknown")
            
            metrics = data.get("scan_metrics", {})
            crawl_count = metrics.get("crawl_requests_made", 0)
            audit_count = metrics.get("audit_requests_made", 0)
            
            print(f"Status: {status} | Crawled: {crawl_count} | Audited: {audit_count}")
            
            if status in ("succeeded", "failed", "paused"):
                return data
            
            time.sleep(poll_interval)
        
        raise TimeoutError(f"Scan did not complete within {timeout}s")
    
    def get_issues(self, task_id):
        resp = requests.get(
            f"{self.api_url}/v0.1/scan/{task_id}/issues",
            headers=self.headers,
        )
        
        if resp.status_code != 200:
            return []
        
        return resp.json().get("issues", [])
    
    def run_scan(self, target_url, config_name, timeout, fail_severities, output_file):
        task_id = self.create_scan(target_url, config_name)
        result = self.wait_for_scan(task_id, timeout)
        issues = self.get_issues(task_id)
        
        report = {
            "target": target_url,
            "scan_status": result.get("scan_status"),
            "scan_metrics": result.get("scan_metrics", {}),
            "issues": issues,
            "summary": self._summarize(issues),
        }
        
        with open(output_file, "w") as f:
            json.dump(report, f, indent=2)
        
        print(f"\nScan complete: {len(issues)} issues found")
        print(f"  High: {report['summary']['high']}")
        print(f"  Medium: {report['summary']['medium']}")
        print(f"  Low: {report['summary']['low']}")
        print(f"  Info: {report['summary']['info']}")
        
        # Check fail conditions
        for sev in fail_severities:
            if report["summary"].get(sev, 0) > 0:
                print(f"\nFAILED: {report['summary'][sev]} {sev} severity issues found")
                return False
        
        print("\nPASSED: No blocking issues found")
        return True
    
    def _summarize(self, issues):
        summary = {"high": 0, "medium": 0, "low": 0, "info": 0}
        for issue in issues:
            sev = issue.get("severity", "info").lower()
            summary[sev] = summary.get(sev, 0) + 1
        return summary

if __name__ == "__main__":
    parser = argparse.ArgumentParser(description="Burp Suite CI Scanner")
    parser.add_argument("--api-url", required=True)
    parser.add_argument("--api-key", required=True)
    parser.add_argument("--target", required=True)
    parser.add_argument("--config", default="Crawl and Audit - Fast")
    parser.add_argument("--timeout", type=int, default=3600)
    parser.add_argument("--fail-on", default="high, critical")
    parser.add_argument("--output", default="burp-results.json")
    args = parser.parse_args()
    
    scanner = BurpCIScanner(args.api_url, args.api_key)
    fail_sevs = [s.strip() for s in args.fail_on.split(",")]
    
    success = scanner.run_scan(args.target, args.config, args.timeout, fail_sevs, args.output)
    sys.exit(0 if success else 1)

วิเคราะห์ผลลัพธ์และ Vulnerability Management

จัดการ vulnerabilities ที่พบจาก Burp Suite scanning

#!/usr/bin/env python3
# burp_report.py — Generate HTML Report from Burp Results
import json
import sys
from datetime import datetime

def generate_report(results_file, output_file):
    with open(results_file) as f:
        data = json.load(f)
    
    issues = data.get("issues", [])
    summary = data.get("summary", {})
    
    # จัดกลุ่ม issues ตาม severity
    grouped = {"high": [], "medium": [], "low": [], "info": []}
    for issue in issues:
        sev = issue.get("severity", "info").lower()
        grouped.setdefault(sev, []).append(issue)
    
    # สร้าง HTML report
    html = f"""

Burp Suite Pro DevSecOps Integration — รวม DAST | SiamCafe


Target: {data.get('target', 'N/A')}

Date: {datetime.now().strftime('%Y-%m-%d %H:%M')}

Status: {data.get('scan_status', 'N/A')}

Medium

Low

Info

Issues Detail

""" for sev in ["high", "medium", "low", "info"]: for issue in grouped.get(sev, []): html += f"""\n""" html += """
SeverityIssue TypeURLConfidence
{sev.upper()} {issue.get('type_index', issue.get('name', 'N/A'))} {issue.get('origin', '')}{issue.get('path', '')} {issue.get('confidence', 'N/A')}

Remediation Priority

  1. Fix all HIGH severity issues immediately
  2. Address MEDIUM issues within current sprint
  3. Plan LOW issues for next sprint
  4. Review INFO items for false positives
""" with open(output_file, "w") as f: f.write(html) print(f"Report generated: {output_file}") if __name__ == "__main__": generate_report(sys.argv[1], sys.argv[2])

Burp Suite API Automation Scripts

Scripts สำหรับ automate งาน security testing ที่ทำบ่อย

#!/bin/bash
# burp_automation.sh — Burp Suite Automation Toolkit
set -euo pipefail

BURP_API="http://localhost:1337"
API_KEY=""

# Function: สร้างและรอ scan จบ
run_scan() {
    local target="$1"
    local config=""
    
    echo "Starting scan: $target"
    
    # สร้าง scan
    task_id=$(curl -s -X POST "$BURP_API/v0.1/scan" \
        -H "Authorization: Bearer $API_KEY" \
        -H "Content-Type: application/json" \
        -d "{\"urls\":[\"$target\"],\"scan_configurations\":[{\"name\":\"$config\"}]}" \
        -o /dev/null -D - | grep -i location | awk -F'/' '{print $NF}' | tr -d '\r')
    
    echo "Task ID: $task_id"
    
    # รอจนจบ
    while true; do
        status=$(curl -s "$BURP_API/v0.1/scan/$task_id" \
            -H "Authorization: Bearer $API_KEY" | \
            python3 -c "import json, sys; print(json.load(sys.stdin).get('scan_status',''))")
        
        echo "Status: $status"
        
        if [ "$status" = "succeeded" ] || [ "$status" = "failed" ]; then
            break
        fi
        sleep 30
    done
    
    # ดึง results
    curl -s "$BURP_API/v0.1/scan/$task_id/issues" \
        -H "Authorization: Bearer $API_KEY" > "scan_.json"
    
    echo "Results saved: scan_.json"
}

# Function: Scan หลาย targets
batch_scan() {
    local targets_file="$1"
    
    while IFS= read -r url; do
        [ -z "$url" ] && continue
        echo "=== Scanning: $url ==="
        run_scan "$url" "Crawl and Audit - Lightweight"
        echo ""
    done < "$targets_file"
}

# Function: Compare scan results
diff_scans() {
    local old_scan="$1"
    local new_scan="$2"
    
    python3 - "$old_scan" "$new_scan" << 'PYEOF'
import json, sys

with open(sys.argv[1]) as f:
    old = set(json.dumps(i, sort_keys=True) for i in json.load(f).get("issues", []))
with open(sys.argv[2]) as f:
    new = set(json.dumps(i, sort_keys=True) for i in json.load(f).get("issues", []))

added = new - old
removed = old - new

print(f"New issues: {len(added)}")
print(f"Resolved: {len(removed)}")

for item in added:
    issue = json.loads(item)
    print(f"  [NEW] [{issue.get('severity','')}] {issue.get('name','')}")
PYEOF
}

# Usage
case "" in
    scan)   run_scan "$2" "" ;;
    batch)  batch_scan "$2" ;;
    diff)   diff_scans "$2" "$3" ;;
    *)      echo "Usage: $0 {scan|batch|diff} [args]" ;;
esac

FAQ คำถามที่พบบ่อย

Q: Burp Suite Community Edition ใช้ใน CI/CD ได้ไหม?

A: Community Edition มีข้อจำกัดที่สำคัญคือไม่มี REST API และไม่มี automated scanning features ที่ CI/CD ต้องการ ถ้าต้องการ DAST ฟรีสำหรับ CI/CD แนะนำใช้ OWASP ZAP ที่เป็น open source และมี CI/CD integrations ดีกว่า หรือใช้ Nuclei สำหรับ template-based scanning

Q: Burp Suite scan ใช้เวลานานแค่ไหน?

A: ขึ้นอยู่กับขนาดของ application และ configuration โดยเฉลี่ย Fast scan ใช้ 15-30 นาทีสำหรับ application ขนาดเล็ก (100 pages) Normal scan ใช้ 1-4 ชั่วโมง Thorough scan อาจใช้ 8-24 ชั่วโมง สำหรับ CI/CD แนะนำใช้ Fast scan เพื่อไม่ให้ pipeline ช้า แล้วรัน Thorough scan แยกตอนกลางคืน

Q: จะลด false positives ได้อย่างไร?

A: ใช้ scan configurations ที่เหมาะสมกับ technology stack เช่นถ้าเป็น React app ไม่ต้อง scan สำหรับ server-side template injection ตั้ง scope ให้ชัดเจนไม่ scan URLs ที่ไม่เกี่ยวข้อง สร้าง custom rules เพื่อ exclude known patterns และ review results เพื่อสร้าง baseline ที่ filter issues ซ้ำออก

Q: DAST กับ SAST ใช้อันเดียวพอไหม?

A: ไม่พอ SAST และ DAST ตรวจพบ vulnerabilities คนละประเภท SAST วิเคราะห์ source code หา issues เช่น hard-coded credentials, insecure functions DAST ทดสอบ running application หา issues เช่น misconfigurations, authentication bypass, runtime injection ควรใช้ทั้งสองเพื่อ coverage ที่ดีที่สุด เสริมด้วย SCA สำหรับ dependency vulnerabilities

📖 บทความที่เกี่ยวข้อง

Burp Suite Pro API Integration เชื่อมต่อระบบอ่านบทความ → Burp Suite Pro Automation Scriptอ่านบทความ → Burp Suite Pro Observability Stackอ่านบทความ → Burp Suite Pro Interview Preparationอ่านบทความ →

📚 ดูบทความทั้งหมด →