
Dast Scanning
- 100 installs
- 44 repo stars
- Updated May 22, 2026
- bagelhole/devops-security-agent-skills
DAST Scanning is a Claude skill for dynamic application security testing of running apps and APIs using OWASP ZAP, Burp Suite, and Nikto.
About
DAST Scanning is a skill for dynamic application security testing against running applications. It covers OWASP ZAP baseline, full, and API scans, the ZAP automation framework, Burp Suite REST-API automation, and CI integration. A developer uses it to find runtime vulnerabilities and test authentication and API security on deployed apps.
- Run OWASP ZAP baseline, full, and API scans against running apps
- Automate DAST in GitHub Actions and GitLab CI
- Drive Burp Suite scans via its REST API
Dast Scanning by the numbers
- 100 all-time installs (skills.sh)
- Ranked #1,005 of 2,203 Security skills by installs in the Skillselion catalog
- Data as of Jul 28, 2026 (Skillselion catalog sync)
dast-scanning capabilities & compatibility
- Capabilities
- container scanning · dependency scanning · security audit
- Works with
- docker · github · gitlab
- Use cases
- security audit · testing · ci cd
What dast-scanning says it does
Test running applications for security vulnerabilities through dynamic analysis.
- Finding runtime vulnerabilities - Testing authentication flows - Validating API security
npx skills add https://github.com/bagelhole/devops-security-agent-skills --skill dast-scanningAdd your badge
Show developers this skill is listed on Skillselion. Paste this into your README.
| Installs | 100 |
|---|---|
| repo stars | ★ 44 |
| Last updated | May 22, 2026 |
| Repository | bagelhole/devops-security-agent-skills ↗ |
What it does
Run an OWASP ZAP scan against a running web app or API and wire it into CI to catch runtime vulnerabilities.
Who is it for?
Developers testing deployed web apps and APIs for runtime vulnerabilities and broken authentication.
Skip if: Static code analysis or scanning dependencies and container images (see dependency-scanning and container-scanning).
When should I use this skill?
Testing deployed applications, running automated security scans, or validating API security.
What you get
Automated ZAP or Burp scans of a running target with reports and a CI job that runs them on a schedule.
- ZAP baseline/full/API scan commands
- ZAP automation framework config
- CI DAST jobs and Burp REST client
By the numbers
- Tool-overview table of 5 DAST tools (ZAP, Burp Suite, Nikto, Nuclei, Arachni)
Files
DAST Scanning
Test running applications for security vulnerabilities through dynamic analysis.
When to Use This Skill
Use this skill when:
- Testing deployed applications
- Performing automated security scans
- Finding runtime vulnerabilities
- Testing authentication flows
- Validating API security
Prerequisites
- Running application instance
- Network access to target
- Testing authorization
- Understanding of web security
Tool Overview
| Tool | Type | Best For |
|---|---|---|
| OWASP ZAP | OSS | Automated scanning, CI |
| Burp Suite | Commercial | Manual testing, advanced |
| Nikto | OSS | Web server scanning |
| Nuclei | OSS | Template-based scanning |
| Arachni | OSS | Comprehensive scanning |
OWASP ZAP
Docker Setup
# Run ZAP in daemon mode
docker run -d --name zap \
-p 8080:8080 \
-v $(pwd)/reports:/zap/reports \
ghcr.io/zaproxy/zaproxy:stable \
zap.sh -daemon -host 0.0.0.0 -port 8080 \
-config api.addrs.addr.name=.* \
-config api.addrs.addr.regex=trueBaseline Scan
# Quick baseline scan
docker run --rm -v $(pwd):/zap/wrk \
ghcr.io/zaproxy/zaproxy:stable \
zap-baseline.py -t https://target.example.com \
-r baseline-report.html
# With authentication
docker run --rm -v $(pwd):/zap/wrk \
ghcr.io/zaproxy/zaproxy:stable \
zap-baseline.py -t https://target.example.com \
-r report.html \
--auth-login-url https://target.example.com/login \
--auth-username user \
--auth-password passFull Scan
# Comprehensive scan
docker run --rm -v $(pwd):/zap/wrk \
ghcr.io/zaproxy/zaproxy:stable \
zap-full-scan.py -t https://target.example.com \
-r full-report.html \
-J full-report.jsonAPI Scan
# OpenAPI specification scan
docker run --rm -v $(pwd):/zap/wrk \
ghcr.io/zaproxy/zaproxy:stable \
zap-api-scan.py -t https://target.example.com/openapi.json \
-f openapi \
-r api-report.htmlZAP Automation Framework
# zap-automation.yaml
env:
contexts:
- name: "Default Context"
urls:
- "https://target.example.com"
includePaths:
- "https://target.example.com/.*"
excludePaths:
- "https://target.example.com/logout.*"
authentication:
method: "form"
parameters:
loginUrl: "https://target.example.com/login"
loginRequestData: "username={%username%}&password={%password%}"
verification:
method: "response"
loggedInRegex: "\\QWelcome\\E"
users:
- name: "testuser"
credentials:
username: "test@example.com"
password: "password123"
jobs:
- type: spider
parameters:
context: "Default Context"
user: "testuser"
maxDuration: 10
- type: spiderAjax
parameters:
context: "Default Context"
user: "testuser"
maxDuration: 10
- type: passiveScan-wait
parameters:
maxDuration: 5
- type: activeScan
parameters:
context: "Default Context"
user: "testuser"
policy: "Default Policy"
- type: report
parameters:
template: "traditional-html"
reportDir: "/zap/reports"
reportFile: "zap-report"# Run automation
docker run --rm -v $(pwd):/zap/wrk \
ghcr.io/zaproxy/zaproxy:stable \
zap.sh -cmd -autorun /zap/wrk/zap-automation.yamlCI/CD Integration
GitHub Actions
name: DAST Scan
on:
workflow_dispatch:
schedule:
- cron: '0 2 * * *'
jobs:
dast:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Start Application
run: |
docker-compose up -d
sleep 30 # Wait for app to be ready
- name: OWASP ZAP Scan
uses: zaproxy/action-full-scan@v0.8.0
with:
target: 'http://localhost:8080'
rules_file_name: '.zap/rules.tsv'
cmd_options: '-a'
- name: Upload Report
uses: actions/upload-artifact@v4
if: always()
with:
name: zap-report
path: report_html.htmlGitLab CI
dast:
stage: security
image: ghcr.io/zaproxy/zaproxy:stable
variables:
TARGET_URL: $DAST_TARGET_URL
script:
- mkdir -p /zap/wrk/reports
- zap-baseline.py -t $TARGET_URL -r /zap/wrk/reports/zap-report.html -I
artifacts:
paths:
- reports/
expire_in: 1 week
rules:
- if: $CI_COMMIT_BRANCH == "main"Burp Suite Automation
REST API Usage
import requests
class BurpScanner:
def __init__(self, api_url, api_key):
self.api_url = api_url
self.headers = {'Authorization': api_key}
def create_scan(self, target_url):
"""Create and start a new scan."""
payload = {
'scan_configurations': [
{'name': 'Crawl and Audit - Balanced'}
],
'scope': {
'include': [{'rule': target_url}]
},
'urls': [target_url]
}
response = requests.post(
f'{self.api_url}/v0.1/scan',
json=payload,
headers=self.headers
)
return response.headers.get('Location')
def get_scan_status(self, scan_id):
"""Get scan status."""
response = requests.get(
f'{self.api_url}/v0.1/scan/{scan_id}',
headers=self.headers
)
return response.json()
def get_issues(self, scan_id):
"""Get scan issues."""
response = requests.get(
f'{self.api_url}/v0.1/scan/{scan_id}/issues',
headers=self.headers
)
return response.json()
# Usage
scanner = BurpScanner('http://burp:1337', 'api-key')
scan_id = scanner.create_scan('https://target.example.com')
while True:
status = scanner.get_scan_status(scan_id)
if status['scan_status'] == 'succeeded':
break
time.sleep(30)
issues = scanner.get_issues(scan_id)Nikto
Basic Scanning
# Install
apt-get install nikto
# Basic scan
nikto -h https://target.example.com
# With specific options
nikto -h https://target.example.com \
-ssl \
-Tuning 123bde \
-output nikto-report.html \
-Format html
# Scan specific ports
nikto -h target.example.com -p 80,443,8080Common DAST Findings
OWASP Top 10
owasp_findings:
A01_Broken_Access_Control:
- IDOR vulnerabilities
- Missing function-level access control
- Privilege escalation
A02_Cryptographic_Failures:
- Sensitive data in URLs
- Missing HTTPS
- Weak ciphers
A03_Injection:
- SQL injection
- Command injection
- XSS
A05_Security_Misconfiguration:
- Default credentials
- Verbose error messages
- Missing security headers
A07_Auth_Failures:
- Weak passwords accepted
- Session fixation
- Missing MFASecurity Headers Check
# Check security headers
curl -I https://target.example.com | grep -i "x-\|content-security\|strict"
# Expected headers:
# X-Content-Type-Options: nosniff
# X-Frame-Options: DENY
# X-XSS-Protection: 1; mode=block
# Content-Security-Policy: default-src 'self'
# Strict-Transport-Security: max-age=31536000Custom Test Cases
# Test authentication
tests:
- name: "Authentication Bypass"
steps:
- Access protected resource without auth
- Verify 401/403 response
- Access with valid auth
- Verify 200 response
- name: "Session Management"
steps:
- Login and capture session token
- Logout
- Attempt to use old session
- Verify session invalidated
- name: "Input Validation"
steps:
- Submit XSS payload in all inputs
- Submit SQL injection in all inputs
- Verify proper sanitizationCommon Issues
Issue: False Positives
Problem: Scanner reports non-vulnerabilities Solution: Configure scan policy, review findings manually
Issue: Missing Authentication
Problem: Cannot scan authenticated areas Solution: Configure authentication context, use session tokens
Issue: Incomplete Coverage
Problem: Scanner misses endpoints Solution: Import API specs, improve spidering, use authenticated scanning
Best Practices
- Test in staging environment first
- Configure proper authentication
- Import API specifications for complete coverage
- Review findings before reporting
- Combine with manual testing
- Run regular scans (weekly minimum)
- Track findings over time
- Coordinate with development team
Related Skills
- sast-scanning - Static analysis
- penetration-testing - Manual testing
- waf-setup - WAF configuration
DAST Tools Reference
Tool Comparison
| Tool | Type | License | Best For |
|---|---|---|---|
| OWASP ZAP | Proxy/Scanner | Apache 2.0 | General DAST |
| Nuclei | Template-based | MIT | Vulnerability checks |
| Nikto | Web scanner | GPL | Quick scans |
| Burp Suite | Proxy/Scanner | Commercial | Manual testing |
OWASP ZAP
CLI Scanning
# Quick scan
docker run -t owasp/zap2docker-stable zap-baseline.py -t https://target.com
# Full scan
docker run -t owasp/zap2docker-stable zap-full-scan.py -t https://target.com
# API scan
docker run -t owasp/zap2docker-stable zap-api-scan.py \
-t https://target.com/openapi.json -f openapiAutomation Framework
# zap-config.yaml
env:
contexts:
- name: "Default Context"
urls: ["https://target.com"]
authentication:
method: "form"
parameters:
loginUrl: "https://target.com/login"
loginRequestData: "user={%username%}&pass={%password%}"
jobs:
- type: spider
parameters:
maxDuration: 5
- type: activeScan
parameters:
maxScanDurationInMins: 60
- type: report
parameters:
template: "traditional-html"
reportFile: "zap-report.html"Nuclei
# Install
go install github.com/projectdiscovery/nuclei/v3/cmd/nuclei@latest
# Scan with all templates
nuclei -u https://target.com
# Specific templates
nuclei -u https://target.com -t cves/
nuclei -u https://target.com -t exposures/
# Critical and high only
nuclei -u https://target.com -severity critical,high
# Output
nuclei -u https://target.com -json -o results.jsonCustom Template
id: custom-check
info:
name: Custom Security Check
severity: high
requests:
- method: GET
path:
- "{{BaseURL}}/admin"
matchers:
- type: status
status:
- 200CI Integration
# GitHub Actions
- name: OWASP ZAP Scan
uses: zaproxy/action-baseline@v0.9.0
with:
target: 'https://target.com'
rules_file_name: '.zap/rules.tsv'Best Practices
1. Run in staging, not production 2. Use authentication for full coverage 3. Exclude logout/destructive endpoints 4. Set reasonable timeouts 5. Review and triage findings
Related skills
FAQ
What is the difference between a ZAP baseline and full scan?
The baseline scan is a quick passive scan (zap-baseline.py), while the full scan (zap-full-scan.py) actively crawls and attacks the target for deeper coverage.
Can I DAST-scan an API from its OpenAPI spec?
Yes, use zap-api-scan.py with -f openapi pointing at the OpenAPI JSON to scan API endpoints.