TDCTF Academy Logo TDCTF ACADEMY

OWASP ZAP: Web Application Security Scanner

Pengertian OWASP ZAP

OWASP ZAP (Zed Attack Proxy) adalah open-source web application security scanner yang dikelola oleh OWASP Foundation. ZAP adalah alternatif gratis dari Burp Suite Professional dengan fitur yang sangat mumpuni untuk web penetration testing dan security automation.

ZAP sangat populer di kalangan bug bounty hunters, security engineer, dan DevSecOps karena:

  • Gratis dan open-source - tidak ada batasan fitur seperti Burp Community
  • API lengkap - bisa diintegrasikan ke pipeline CI/CD
  • Automated scanning - spider + active scan tanpa konfigurasi manual
  • HUD (Heads-Up Display) - alat keamanan langsung di browser
  • Aktif dikembangkan - rilis rutin dengan deteksi kerentanan terbaru

Arsitektur ZAP

User Browser <--> ZAP Proxy (Local) <--> Target Web Server
|
[Spider / Active Scan / Fuzzer]
|
[API / CLI / Automation Framework]

ZAP beroperasi sebagai man-in-the-middle proxy - semua traffic HTTP/HTTPS dari browser atau tool otomatis melewati ZAP untuk diinspeksi, dimodifikasi, dan dipindai.

Mode Operasi ZAP

ZAP memiliki empat mode operasi yang mengontrol seberapa agresif intervensi ZAP terhadap request/response:

Safe Mode

# Safe Mode - hanya melakukan passive scanning
# Tidak ada request yang dimodifikasi atau dikirim ulang
# Aman untuk browsing produksi - tidak ada risiko merusak data

# Cara set dari command line:
zap-cli mode safe

Pada Safe Mode, ZAP hanya mengamati traffic dan melakukan passive scanning (menganalisis header, cookie, dan respons tanpa mengirim request baru). Cocok untuk reconnaissance pasif di lingkungan produksi.

Protected Mode

# Protected Mode - seperti Safe, tapi bisa scan target dalam scope
# Target di luar scope tetap aman (hanya passive scan)
# Berguna saat testing di staging sambil browsing produksi

# Aktifkan dari menu: Mode > Protected
# Atau CLI:
zap-cli mode protected

Hanya target yang sudah ditambahkan ke scope yang bisa di-scan aktif. Request ke domain di luar scope hanya dipassive-scan. Mode ideal untuk bug bounty di mana Anda ingin scan target spesifik tanpa risiko menjangkau domain lain.

Standard Mode

# Standard Mode - semua bisa di-scan dan dimodifikasi
# Semua tool aktif: spider, active scanner, fuzzer

# Mode default saat pertama install:
zap-cli mode standard

# Verifikasi mode saat ini:
zap-cli mode
# Output: Standard

Tidak ada batasan - semua request bisa dimodifikasi, di-replay, dan di-scan. Mode yang paling sering digunakan untuk dedicated penetration testing.

Attack Mode

# Attack Mode - automatic active scan pada semua endpoint
# Setiap request baru di-spider dan di-active-scan secara otomatis
# Paling agresif - hanya untuk target yang sudah di-approve

zap-cli mode attack

# Warning: mode ini sangat bising dan bisa membanjiri target
# dengan ribuan request dalam waktu singkat

Automated Scanning: Spider + Active Scan

Spider (Crawling Otomatis)

Spider adalah web crawler yang menjelajahi aplikasi web untuk menemukan semua halaman, endpoint, parameter, dan formulir.

# Traditional Spider - berbasis HTML parsing
# Menemukan link dari tag <a>, <form>, <script>, dll.
zap-cli spider https://target.com

# Traditional Spider dengan opsi lanjutan:
zap-cli spider https://target.com --context "MyApp" --subtree-only --max-children 100

# Output:
# Spider telah memproses 150 halaman
# Menemukan 234 URL unik
# 12 parameter terdeteksi

AJAX Spider

AJAX Spider menggunakan browser headless (Selenium/Chrome) untuk merender JavaScript. Sangat penting untuk Single Page Applications (SPA) dan aplikasi yang banyak menggunakan JavaScript.

# AJAX Spider - untuk aplikasi SPA (React, Angular, Vue)
# Melakukan click otomatis pada semua elemen interaktif
zap-cli ajax-spider https://target.com

# Dengan konfigurasi:
zap-cli ajax-spider https://target.com --click-default-eles --wait 1000 --max-duration 5

# Opsi:
# --click-default-eles: klik tombol, link, input secara default
# --wait: waktu tunggu antar aksi (ms)
# --max-duration: durasi maksimal crawl (menit)

Perbedaan Spider vs AJAX Spider:

Aspek Traditional Spider AJAX Spider
Metode HTML parsing Browser headless
JavaScript Tidak render Render penuh
Kecepatan Sangat cepat Lambat
Coverage 40-60% 80-95%
Cocok untuk Static HTML SPA / JS-heavy

Active Scan

Setelah spider selesai mengumpulkan endpoint, Active Scan mengirim payload berbahaya ke setiap parameter untuk mendeteksi kerentanan.

# Active Scan - default dengan semua policy
zap-cli active-scan https://target.com

# Active Scan spesifik:
zap-cli active-scan https://target.com --recursive --context "MyApp"

# Scan dengan policy kustom (hanya SQL Injection + XSS):
zap-cli active-scan https://target.com --policy "SQL Injection,XSS"

# Output:
# [+] SQL Injection terdeteksi di /api/user?id=1
# [+] XSS Reflected terdeteksi di /search?q=
# [*] Path Traversal terdeteksi di /download?file=
# ... 15 vulnerabilities ditemukan

Policy Scanning

Anda bisa mengatur scan policy untuk mengontrol jenis kerentanan apa yang diuji:

# List semua policy yang tersedia:
zap-cli policies

# Contoh output:
# SQL Injection (High)
# XSS (High)
# Path Traversal (Medium)
# Command Injection (High)
# CRLF Injection (Low)
# Source Code Disclosure (Medium)

# Aktifkan policy tertentu:
zap-cli enable-policies "SQL Injection,XSS,Path Traversal"

# Threshold alert:
zap-cli enable-policies --threshold HIGH "SQL Injection"
# Threshold: OFF, LOW, MEDIUM, HIGH - kapan alert ditampilkan
# Strength: DEFAULT, LOW, MEDIUM, HIGH, INSANE - berapa banyak payload yang dikirim

HUD - Heads Up Display

HUD adalah inovasi ZAP yang menampilkan alat keamanan langsung di dalam browser sebagai overlay:

# Aktifkan HUD dari CLI:
zap-cli hud on

# Buka HUD di browser:
# http://vuln.cybersecurity.or.id/?hud=true

# Nonaktifkan HUD:
zap-cli hud off

Fitur HUD

HUD menyediakan panel di sisi kiri dan kanan browser dengan tool berikut:

# Panel Kiri:
# - Break: pause request/response untuk modifikasi
# - Show/History: lihat history request lengkap
# - Show/Alerts: daftar alert keamanan real-time
# - Show/Resend: kirim ulang request yang dimodifikasi

# Panel Kanan:
# - Attack: aktifkan active scan pada halaman saat ini
# - Spider: crawl halaman saat ini
# - Fuzz: fuzzing parameter
# - Suggest: saran keamanan untuk elemen halaman

HUD sangat berguna untuk:

  • Bug bounty hunting cepat - scan sambil browsing
  • Teaching/Demo - visual interaktif untuk siswa
  • Quick triage - lihat alert langsung saat aplikasi digunakan

Passive vs Active Scanning

Passive Scanning

Passive scan tidak mengirim request baru - hanya menganalisis request/respons yang sudah ada:

# Passive scanning dijalankan OTOMATIS - tidak perlu perintah terpisah
# Menganalisis:
# - Header keamanan: X-Frame-Options, CSP, HSTS
# - Cookie attribute: HttpOnly, Secure, SameSite
# - Informasi sensitif dalam response: credit card, SSN, password
# - Version disclosure: server banner, framework version
# - Content type misconfiguration

# Contoh temuan passive scan:
# [WARN] Server: Apache/2.4.49 - version ter-expose
# [WARN] Cookie tanpa HttpOnly flag
# [WARN] X-Frame-Options header tidak ditemukan
# [INFO] Content-Type header tidak sesuai

Active Scanning

Active scan mengirim request berbahaya ke target:

# Resiko:
# - Dapat merusak data (insert/update/delete)
# - Dapat mengubah state aplikasi
# - Bandwidth tinggi - ribuan request per menit
# - IP bisa di-ban oleh WAF

# Jalankan active scan hanya pada target yang disetujui:
zap-cli active-scan https://staging.target.com

Fuzzing

Fuzzing adalah teknik mengirim variasi payload ke parameter untuk menemukan edge case keamanan:

# Fuzzing dasar dari CLI (menggunakan API):
curl "http://vuln.cybersecurity.or.id/JSON/fuzzer/action/fuzz/" \
-d "url=https://target.com/search" \
-d "target=query" \
-d "fuzzers=sql-injection.txt,xss-payloads.txt"

# Cara lebih mudah - gunakan HUD:
# 1. Buka halaman target dengan HUD
# 2. Klik kanan pada input field
# 3. Pilih Fuzz > Open Fuzzer Dialog
# 4. Pilih file wordlist
# 5. Klik Start Fuzzing

Fuzzer Categories (Default ZAP)

# File wordlist bawaan ZAP:
$ZAP_HOME/fuzzers/
├── dirbuster/ # Directory brute force
├── fuzzdb/ # SQL injection, XSS, path traversal
├── jbrofuzz/ # Payload generik
├── src/ # Custom wordlist
└── xss/ # XSS khusus

# Contoh wordlist populer:
# sql-injection.txt: ' OR '1'='1, '; DROP TABLE users;--
# xss-payloads.txt: <script>alert(1)</script>, <img src=x onerror=alert(1)>
# lfi-payloads.txt: ../../../etc/passwd, ....//....//etc/passwd

ZAP API - Otomatisasi dan CI/CD

ZAP memiliki REST API yang sangat lengkap - inilah fitur yang membedakannya dari Burp Suite Community:

# API diakses via:
# HTTP API: http://vuln.cybersecurity.or.id/
# Format: JSON, XML, HTML

# Daftar endpoint API utama:
# /JSON/core/ - operasi inti (sessions, mode, alert)
# /JSON/spider/ - traditional spider
# /JSON/ascan/ - active scan
# /JSON/ajaxSpider/ - AJAX spider
# /JSON/fuzzer/ - fuzzing
# /JSON/report/ - generate report

# Contoh: lihat semua alert
curl -s "http://vuln.cybersecurity.or.id/JSON/core/view/alerts/" | jq '.alerts[] | {alert: .alert, risk: .risk, url: .url}'

# Contoh: generate HTML report
curl -s "http://vuln.cybersecurity.or.id/JSON/report/action/generate/" \
-d "title=Security%20Report" \
-d "template=traditional-html" \
-d "sites=https://target.com" \
-d "reportDir=/tmp/report"

zap-api-scan.py

ZAP menyediakan skrip Python resmi untuk integrasi CI/CD:

# Install dependensi:
pip install python-owasp-zap-v2.4

# Unduh skrip dari repo resmi:
wget https://raw.githubusercontent.com/zaproxy/zap-api-scan/main/zap-api-scan.py

# Scan OpenAPI/Swagger endpoint:
python zap-api-scan.py \
-t https://target.com/api/swagger.json \
-f openapi \
-c zap-api-scan.conf \
-r api-report.html

# Scan GraphQL endpoint:
python zap-api-scan.py \
-t https://target.com/graphql \
-f graphql \
-r graphql-report.html

CI/CD Integration (GitHub Actions)

name: OWASP ZAP Scan

on:
push:
branches: [main]
pull_request:
branches: [main]

jobs:
zap-scan:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4

- name: Start ZAP Container
run: |
docker run -d --name zap \
-p 8080:8080 \
-i ghcr.io/zaproxy/zaproxy:stable \
zap.sh -daemon -host 0.0.0.0 -port 8080 \
-config api.key=test-key

- name: Wait for ZAP
run: sleep 10

- name: Spider Scan
run: |
docker exec zap zap-cli spider https://staging.example.com
docker exec zap zap-cli ajax-spider https://staging.example.com

- name: Active Scan
run: |
docker exec zap zap-cli active-scan https://staging.example.com

- name: Generate Report
run: |
docker exec zap zap-cli report -o /zap/report.html -f html
docker cp zap:/zap/report.html ./zap-report.html

- name: Upload Report
uses: actions/upload-artifact@v4
with:
name: zap-scan-report
path: zap-report.html

CI/CD GitLab Pipeline

zap-security-scan:
stage: security
image: ghcr.io/zaproxy/zaproxy:stable
script:
- zap.sh -daemon -host 0.0.0.0 -port 8080 -config api.key=zap-api-key &
- sleep 15
- zap-cli status -t 120
- zap-cli open-url https://staging.gitlab.com
- zap-cli spider https://staging.gitlab.com
- zap-cli active-scan https://staging.gitlab.com
- zap-cli report -o zap-report.html -f html
artifacts:
paths:
- zap-report.html

CI/CD Jenkins Pipeline

pipeline {
agent any
stages {
stage('OWASP ZAP Scan') {
steps {
sh '''
docker run -d --name zap -p 8080:8080 \\
ghcr.io/zaproxy/zaproxy:stable \\
zap.sh -daemon -host 0.0.0.0 -port 8080
sleep 15
docker exec zap zap-cli spider https://staging.example.com
docker exec zap zap-cli active-scan https://staging.example.com
docker exec zap zap-cli report -o /zap/report.html -f html
docker cp zap:/zap/report.html ./zap-report.html
docker stop zap && docker rm zap
'''
}
}
}
}

Autentikasi di ZAP

ZAP bisa menangani autentikasi untuk memindai area yang membutuhkan login:

Form-Based Authentication

# Setup dari GUI:
# 1. Tools > Options > Contexts > Add Context
# 2. Tab Authentication: pilih "Form-Based Authentication"
# 3. Set login URL: https://target.com/login
# 4. Set parameter: username=admin&password=XXX
# 5. Tab Users: tambah user dengan kredensial

# Atau via API:
curl "http://vuln.cybersecurity.or.id/JSON/authentication/action/setAuthenticationMethod/" \
-d "contextName=MyApp" \
-d "authMethodName=formBasedAuthentication" \
-d "authMethodConfigParams=loginUrl=https://target.com/login&loginRequestData=username%3D%7B%25username%25%7D%26password%3D%7B%25password%25%7D"

Script-Based Authentication

Untuk autentikasi kompleks (OAuth, multi-step, CAPTCHA):

# scripts/auth/oauth.py - OAuth2 authentication
from org.zaproxy.zap.extension.script import ScriptVars

def authenticate(helper, params_dict):
client_id = params_dict.get("client_id")
client_secret = params_dict.get("client_secret")

# Eksekusi OAuth2 flow
response = helper.sendRequest(
"POST",
"https://auth.target.com/oauth/token",
"grant_type=client_credentials&client_id=" + client_id + "&client_secret=" + client_secret
)

# Simpan token untuk sesi berikutnya
ScriptVars.setVar("access_token", response.json_body["access_token"])
return response

Bearer Token via Header

# Set authorization header via CLI:
zap-cli session add-header "Authorization: Bearer eyJhbGciOiJIUzI1NiIs..."

# Atau global header:
zap-cli session add-header "X-API-Key: 12345-abcde"

Reporting

ZAP mendukung berbagai format report:

# HTML Report (format tradisional)
zap-cli report -o /tmp/zap-report.html -f html

# Markdown Report
zap-cli report -o /tmp/zap-report.md -f markdown

# XML Report
zap-cli report -o /tmp/zap-report.xml -f xml

# JSON Report (machine-readable)
zap-cli report -o /tmp/zap-report.json -f json

# Custom Template Report:
# Gunakan template dari: $ZAP_HOME/reports/
zap-cli report -o /tmp/custom-report.html -f html -t your-custom-template

Filter Alert Berdasarkan Tingkat Keparahan

# Lihat alert berdasarkan risk level:
zap-cli alerts --risk High
zap-cli alerts --risk Medium
zap-cli alerts --risk Low

# Tampilkan jumlah total per risk:
zap-cli alerts --summary

# Output:
# High: 3 alerts
# Medium: 12 alerts
# Low: 45 alerts
# Informational: 23 alerts

ZAP vs Burp Suite: Perbandingan

Fitur OWASP ZAP Burp Suite Community Burp Suite Pro
Harga Gratis Gratis $399/tahun
Active Scanner Ya (lengkap) Tidak Ya
API Otomatisasi REST API lengkap Terbatas Ya
HUD (Browser Overlay) Ya Tidak Tidak
AJAX Spider Ya Tidak Ya
Fuzzing Ya Ya Ya
Extender/Plugin Marketplace kecil BApp Store besar BApp Store besar
CI/CD Integration Sempurna Terbatas Ya
Performance Sedang Ringan Optimal
Learning Curve Mudah Mudah Menengah

Kapan pilih ZAP:

  • Anggaran terbatas - ZAP gratis dengan fitur mendekati Burp Pro
  • Kebutuhan CI/CD dan API otomatisasi
  • Tim DevSecOps yang ingin integrasi pipeline
  • Bug bounty dengan HUD untuk scanning cepat

Kapan pilih Burp Suite:

  • Butuh ekstensi komunitas yang luas (BApp Store)
  • Pentest profesional yang butuh tool lengkap
  • Target kinerja tinggi untuk scanning skala besar
  • WebSocket testing lanjutan

Contoh Penggunaan Nyata

1. Quick Scan Target

# Skenario: scan cepat website e-commerce staging
# Langkah 1: Jalankan ZAP daemon
zap.sh -daemon -port 8080

# Langkah 2: Crawl dengan spider
zap-cli spider https://staging.shop.com
sleep 30 # Tunggu spider selesai

# Langkah 3: AJAX spider untuk fitur JS
zap-cli ajax-spider https://staging.shop.com
sleep 60

# Langkah 4: Active scan
zap-cli active-scan https://staging.shop.com

# Langkah 5: Generate report
zap-cli report -o /tmp/shop-scan.html -f html

# Langkah 6: Matikan ZAP
zap-cli shutdown

2. Authenticated Scan

# Skenario: scan dashboard admin
zap.sh -daemon -port 8080
sleep 5

# Login via form
curl -c /tmp/cookies.txt -X POST \
-d "username=admin&password=admin123&csrf_token=abc" \
https://admin.target.com/login

# Set cookie di ZAP
zap-cli session add-header "Cookie: session=\$(grep session /tmp/cookies.txt | awk '{print \$NF}')"

# Scan dengan session aktif
zap-cli spider https://admin.target.com/dashboard
zap-cli active-scan https://admin.target.com/dashboard
zap-cli report -o /tmp/admin-scan.html -f html

3. API Security Scan

# Skenario: scan REST API dengan OpenAPI spec
docker pull ghcr.io/zaproxy/zaproxy:stable

docker run -v \$(pwd):/zap/wrk:rw \
-t ghcr.io/zaproxy/zaproxy:stable \
zap-api-scan.py \
-t /zap/wrk/openapi.yaml \
-f openapi \
-c /zap/wrk/zap-api.conf \
-r /zap/wrk/api-report.html

echo "Report: api-report.html"

4. CI/CD Pipeline (Docker-Based)

#!/bin/bash
# Continuous security scan pipeline

TARGET="https://staging.company.com"
REPORT_DIR="./security-reports"
mkdir -p \$REPORT_DIR

echo "[*] Starting ZAP..."
docker run -d --name zap-scan \
-p 8080:8080 \
ghcr.io/zaproxy/zaproxy:stable \
zap.sh -daemon -port 8080

echo "[*] Waiting for ZAP to initialize..."
sleep 15

echo "[*] Running spider..."
curl "http://vuln.cybersecurity.or.id/JSON/spider/action/scan/" -d "url=\$TARGET" > /dev/null

echo "[*] Running active scan..."
curl "http://vuln.cybersecurity.or.id/JSON/ascan/action/scan/" -d "url=\$TARGET" > /dev/null

sleep 30
echo "[*] Generating report..."
curl "http://vuln.cybersecurity.or.id/JSON/report/action/generate/" \
-d "title=Security%20Report&template=traditional-html&sites=\$TARGET&reportDir=/zap/wrk" \
> /dev/null

docker cp zap-scan:/zap/wrk/report.html \$REPORT_DIR/zap-report.html
docker stop zap-scan && docker rm zap-scan

echo "[+] Report: \$REPORT_DIR/zap-report.html"

5. Context-Based Multi-Site Scan

# Skenario: scan sistem microservice dengan 3 subdomain
zap.sh -daemon -port 8080
sleep 10

# Buat context mencakup semua subdomain
curl "http://vuln.cybersecurity.or.id/JSON/context/action/newContext/" \
-d "contextName=Microservices"

# Include semua subdomain dalam context
curl "http://vuln.cybersecurity.or.id/JSON/context/action/includeInContext/" \
-d "contextName=Microservices" \
-d "regex=https://(api|app|admin)\\\\.target\\\\.com/.*"

# Set authentication
curl "http://vuln.cybersecurity.or.id/JSON/authentication/action/setAuthenticationMethod/" \
-d "contextName=Microservices&authMethodName=formBasedAuthentication" \
-d "authMethodConfigParams=loginUrl=https://app.target.com/login&loginRequestData=email%3D%7B%25username%25%7D%26password%3D%7B%25password%25%7D"

# Scan semua subdomain
for sub in api app admin; do
zap-cli spider https://\$sub.target.com
sleep 10
done

Tips dan Best Practices

  1. Update Ruleset - ZAP secara berkala merilis aturan deteksi baru.

    # Update semua add-on (termasuk scan rules)
    zap-cli session add-on-update-all
  2. Gunakan Context - Group target terkait dalam satu context untuk memudahkan autentikasi dan scope.

  3. Threshold Tepat - Startup dengan threshold HIGH untuk mengurangi false positive, lalu turunkan ke MEDIUM.

  4. Strength Optimal - Gunakan strength MEDIUM untuk keseimbangan coverage dan kecepatan. INSANE untuk target kecil.

  5. Session Management - Simpan session untuk melanjutkan scan nanti:

    zap-cli session save /tmp/my-session.session
    zap-cli session load /tmp/my-session.session
  6. Eksklusi Noise - Eksklusikan URL yang menghasilkan noise (logout, 404) dari active scan:

    # Dari GUI: Right-click > Exclude from
    # Atau API:
    curl "http://vuln.cybersecurity.or.id/JSON/context/action/excludeFromContext/"

Kesimpulan

OWASP ZAP adalah web application security scanner open-source yang sangat mumpuni - setara dengan Burp Suite Professional dalam banyak aspek. Keunggulan utamanya terletak pada API yang lengkap untuk otomatisasi, HUD yang inovatif, dan model gratis tanpa batasan.

Dengan menguasai mode operasi (Safe/Protected/Standard/Attack), teknik scanning (Spider + Active Scan), autentikasi, API, dan CI/CD integration, ZAP menjadi senjata utama dalam toolkit keamanan web - baik untuk bug bounty hunter, penetration tester, maupun DevSecOps engineer.

PADA HALAMAN INI