Skip to main content
skill CX Codex

performing-web-application-vulnerability-triage: Claude Code skill

Triages SAST and DAST scanner findings, filters false positives, and calculates OWASP risk scores. It helps teams prioritize fixes and cut alert fatigue.

Install into Claude Code · Skills CLI (Vercel) All methods and platforms ↓
npx skills add mukul975/Anthropic-Cybersecurity-Skills --skill performing-web-application-vulnerability-triage -a claude-code
Open on GitHub

What performing-web-application-vulnerability-triage does

This skill organizes the triage of findings from DAST tools such as Burp Suite or OWASP ZAP and SAST engines like Semgrep or SonarQube. It runs a three-step workflow: mapping CWE identifiers to OWASP Top 10 categories, filtering false positives, and calculating final risk scores. Routine informational flags like missing Content-Security-Policy headers get dismissed quickly, while injection findings are routed for manual code review.

Risk scoring relies on the OWASP Risk Rating Methodology, which multiplies likelihood by technical and business impact on a 0 to 9 scale. Likelihood considers threat actor skill, exploit ease, and WAF presence. Impact measures confidentiality loss, payment processing exposure, and privacy violations.

The workflow breaks without proper inputs: it strictly requires Python 3.9+ with requests and beautifulsoup4, actual scanner export files, and manual verification tools like Burp Suite Professional or ZAP.

What it helps with

  • Filter out informational alerts and false positives from scanner reports
  • Map discovered CWE entries to OWASP Top 10 categories
  • Calculate OWASP vulnerability risk ratings based on likelihood and impact
  • Prioritize security remediation tasks before handing them to developers

Example prompts for the agent

  • Analyze this Burp Suite report and filter out false positives
  • Calculate the OWASP risk rating for the CWE-89 finding from Semgrep
  • Categorize our ZAP scan findings according to OWASP Top 10

How to install performing-web-application-vulnerability-triage

1Skills CLI (Vercel)

npx skills add mukul975/Anthropic-Cybersecurity-Skills --skill performing-web-application-vulnerability-triage -a claude-code

2Manually: put the files in place

~/.claude/skills/performing-web-application-vulnerability-triage/SKILL.md

Copy the whole skill folder; for one project use .claude/skills/performing-web-application-vulnerability-triage/

Step by step, with commands for each platform: How to install skills in Claude Code: five ways

Questions about performing-web-application-vulnerability-triage

How do I install performing-web-application-vulnerability-triage in Claude Code?

Run npx skills add mukul975/Anthropic-Cybersecurity-Skills --skill performing-web-application-vulnerability-triage -a claude-code. The file will be placed at ~/.claude/skills/performing-web-application-vulnerability-triage/SKILL.md.

What does performing-web-application-vulnerability-triage do?

It automates the initial triage of application security scans. The skill maps CWEs to OWASP categories, filters scanner false positives, and assigns risk scores using OWASP metrics.

What prerequisites are needed to run the triage process?

You need export files from SAST or DAST scanners, Python 3.9+ with requests and beautifulsoup4, and Burp Suite or OWASP ZAP for manual verification.

Source text

SKILL.md · Apache-2.0
---
name: performing-web-application-vulnerability-triage
description: Triages web application vulnerability findings from DAST/SAST scanners
  such as Burp Suite and ZAP, using the OWASP Risk Rating Methodology to confirm
  true positives, dismiss false positives, and prioritize remediation. Use when
  reviewing scanner output to reduce alert fatigue and rank vulnerabilities for
  development teams to fix.
domain: cybersecurity
subdomain: vulnerability-management
tags:
- web-application
- vulnerability-triage
- owasp
- dast
- sast
- burp-suite
- zap
- false-positive
- risk-rating
version: '1.0'
author: mahipal
license: Apache-2.0
nist_csf:
- ID.RA-01
- ID.RA-02
- ID.IM-02
- ID.RA-06
mitre_attack:
- T1190
- T1203
- T1068
---

# Performing Web Application Vulnerability Triage

## Overview

Web application vulnerability triage is the process of reviewing findings from DAST (Dynamic Application Security Testing) and SAST (Static Application Security Testing) tools to validate true positives, dismiss false positives, assign risk ratings using the OWASP Risk Rating Methodology, and prioritize remediation. Effective triage reduces alert fatigue and focuses development teams on the vulnerabilities that matter most.


## When to Use

- When conducting security assessments that involve performing web application vulnerability triage
- When following incident response procedures for related security events
- When performing scheduled security testing or auditing activities
- When validating security controls through hands-on testing

## Prerequisites

- DAST scan results (OWASP ZAP, Burp Suite, Acunetix)
- SAST scan results (Semgrep, SonarQube, Checkmarx, Snyk Code)
- Python 3.9+ with `requests`, `beautifulsoup4`
- Burp Suite Professional or OWASP ZAP for manual validation
- DefectDojo or similar for finding management

## OWASP Risk Rating Methodology

### Risk Calculation
```
Risk = Likelihood x Impact
```

### Likelihood Factors (0-9 scale)
| Factor Group | Factor | Description |
|-------------|--------|------------|
| Threat Agent | Skill Level | How technically skilled is the attacker? |
| Threat Agent | Motive | How motivated is the attacker? |
| Threat Agent | Opportunity | What resources/access are needed? |
| Threat Agent | Size | How large is the potential threat agent group? |
| Vulnerability | Ease of Discovery | How easy is it to find the vulnerability? |
| Vulnerability | Ease of Exploit | How easy is it to exploit? |
| Vulnerability | Awareness | How well known is the vulnerability? |
| Vulnerability | Intrusion Detection | How likely is exploitation to be detected? |

### Impact Factors (0-9 scale)
| Factor Group | Factor | Description |
|-------------|--------|------------|
| Technical | Confidentiality | How much data could be disclosed? |
| Technical | Integrity | How much data could be corrupted? |
| Technical | Availability | How much service could be lost? |
| Technical | Accountability | Can actions be traced to attacker? |
| Business | Financial Damage | Revenue loss, regulatory fines |
| Business | Reputation Damage | Brand trust erosion |
| Business | Non-compliance | Regulatory violation exposure |
| Business | Privacy Violation | PII/PHI exposure volume |

### Risk Matrix
| | Low Impact (0-3) | Medium Impact (3-6) | High Impact (6-9) |
|---|---|---|---|
| **High Likelihood (6-9)** | Medium | High | Critical |
| **Medium Likelihood (3-6)** | Low | Medium | High |
| **Low Likelihood (0-3)** | Note | Low | Medium |

## Triage Process

### Step 1: Categorize by OWASP Top 10

```python
OWASP_TOP_10_2021 = {
    "A01": "Broken Access Control",
    "A02": "Cryptographic Failures",
    "A03": "Injection",
    "A04": "Insecure Design",
    "A05": "Security Misconfiguration",
    "A06": "Vulnerable and Outdated Components",
    "A07": "Identification and Authentication Failures",
    "A08": "Software and Data Integrity Failures",
    "A09": "Security Logging and Monitoring Failures",
    "A10": "Server-Side Request Forgery",
}

CWE_TO_OWASP = {
    "CWE-79": "A03",   # XSS -> Injection
    "CWE-89": "A03",   # SQL Injection
    "CWE-78": "A03",   # OS Command Injection
    "CWE-352": "A01",  # CSRF -> Access Control
    "CWE-22": "A01",   # Path Traversal
    "CWE-200": "A02",  # Information Exposure
    "CWE-327": "A02",  # Weak Cryptography
    "CWE-287": "A07",  # Authentication Issues
    "CWE-918": "A10",  # SSRF
    "CWE-502": "A08",  # Deserialization
    "CWE-611": "A05",  # XXE -> Misconfiguration
}
```

### Step 2: Validate True vs False Positives

```python
def triage_finding(finding):
    """Classify finding as true_positive, false_positive, or needs_review."""
    fp_indicators = [
        "Content-Security-Policy header not set",  # Often informational
        "X-Content-Type-Options header missing",    # Low severity header
        "Cookie without SameSite attribute",        # Context dependent
    ]

    for indicator in fp_indicators:
        if indicator.lower() in finding.get("title", "").lower():
            if finding.get("severity", "").lower() in ("info", "low"):
                return "false_positive", "Common informational finding"

    # Check for confirmed exploitation evidence
    if finding.get("evidence") and finding.get("confidence", "").lower() == "certain":
        return "true_positive", "Scanner confirmed exploitation"

    # SAST findings need manual code review
    if finding.get("source") == "sast":
        if finding.get("cwe") in ["CWE-89", "CWE-78", "CWE-79"]:
            return "needs_review", "Injection finding requires manual code review"

    return "needs_review", "Requires manual validation"
```

### Step 3: Risk Score Calculation

```python
def calculate_risk_score(finding, app_context):
    """Calculate OWASP risk rating for a web application finding."""
    # Likelihood factors
    likelihood = {
        "skill_level": 6 if finding["cwe"] in ["CWE-89", "CWE-79"] else 4,
        "motive": 7,  # Financial gain
        "opportunity": 7 if finding.get("authenticated") == False else 4,
        "size": 9 if finding.get("internet_facing") else 4,
        "ease_of_discovery": 8 if finding.get("scanner_detected") else 5,
        "ease_of_exploit": 7 if finding.get("exploit_available") else 4,
        "awareness": 6,
        "intrusion_detection": 3 if app_context.get("waf_enabled") else 8,
    }

    # Impact factors
    impact = {
        "confidentiality": 9 if "data_exposure" in finding.get("tags", []) else 5,
        "integrity": 9 if finding["cwe"] in ["CWE-89", "CWE-78"] else 4,
        "availability": 7 if "dos" in finding.get("tags", []) else 2,
        "accountability": 3 if app_context.get("logging_enabled") else 7,
        "financial": 7 if app_context.get("processes_payments") else 3,
        "reputation": 6 if app_context.get("customer_facing") else 2,
        "compliance": 8 if app_context.get("pci_scope") else 3,
        "privacy": 9 if app_context.get("handles_pii") else 2,
    }

    likelihood_score = sum(likelihood.values()) / len(likelihood)
    impact_score = sum(impact.values()) / len(impact)
    risk_score = likelihood_score * impact_score

    if risk_score >= 42:
        risk_level = "Critical"
    elif risk_score >= 24:
        risk_level = "High"
    elif risk_score >= 12:
        risk_level = "Medium"
    elif risk_score >= 3:
        risk_level = "Low"
    else:
        risk_level = "Note"

    return {
        "likelihood_score": round(likelihood_score, 1),
        "impact_score": round(impact_score, 1),
        "risk_score": round(risk_score, 1),
        "risk_level": risk_level,
    }
```

### Step 4: Generate Triage Report

```bash
# Process DAST/SAST results through triage pipeline
python3 scripts/process.py \
  --input zap_results.json \
  --format zap \
  --app-context app_config.json \
  --output triage_report.json
```

## Manual Validation Techniques

### SQL Injection Validation
```
# Test parameter with single quote
GET /search?q=test' HTTP/1.1

# Test with boolean-based payload
GET /search?q=test' AND 1=1-- HTTP/1.1
GET /search?q=test' AND 1=2-- HTTP/1.1

# Time-based verification
GET /search?q=test'; WAITFOR DELAY '0:0:5'-- HTTP/1.1
```

### XSS Validation
```
# Reflected XSS test
GET /search?q=<script>alert(document.domain)</script> HTTP/1.1

# Check if output is encoded
GET /search?q="><img src=x onerror=alert(1)> HTTP/1.1

# DOM-based XSS
GET /page#<img src=x onerror=alert(1)> HTTP/1.1
```

## References

- [OWASP Risk Rating Methodology](https://owasp.org/www-community/OWASP_Risk_Rating_Methodology)
- [OWASP Top 10 2021](https://owasp.org/www-project-top-ten/)
- [OWASP Testing Guide v4.2](https://owasp.org/www-project-web-security-testing-guide/)
- [CWE/SANS Top 25](https://cwe.mitre.org/top25/)

© mahipal · Apache-2.0 · mukul975/Anthropic-Cybersecurity-Skills

Similar skills

All skills for Security →

From the same set90

analyzing-ios-app-security-with-objection A skill for runtime iOS app testing with Objection and Frida: dump the keychain, bypass SSL pinning, check jailbreak detection. CX Codex +1 436installs implementing-secret-scanning-with-gitleaks This skill helps configure Gitleaks to find secrets in Git repositories and stop them from entering history. Use it for local hooks and CI/CD checks. CX Codex +1 439installs testing-for-json-web-token-vulnerabilities Guides coding agents through auditing JWT implementations for none-algorithm bypass, RS256-to-HS256 confusion, kid injection, and weak secrets. CX Codex +1 431installs analyzing-network-traffic-for-incidents A skill that works through packet captures and flow data during an incident: C2 channels, lateral movement, data exfiltration. CX Codex +1 430installs analyzing-cobaltstrike-malleable-c2-profiles Parses Cobalt Strike Malleable C2 profiles and extracts network indicators for detection rules. Use it when examining a profile or validating Beacon traffic. CX Codex +1 426installs analyzing-network-traffic-of-malware Walks through a malware PCAP to find C2 protocols, exfiltration channels and payload downloads. Useful for sandbox runs and live incident response. CX Codex +1 413installs analyzing-malicious-url-with-urlscan This skill walks through scanning suspicious and phishing URLs with URLScan.io and pulling the screenshot, DOM, redirect chain and IOCs out of the report. CX Codex +1 411installs analyzing-web-server-logs-for-intrusion This skill parses Apache and Nginx logs, flags attack patterns, and builds a findings report. Use it for incident analysis or monitoring checks. CX Codex +1 408installs

Project sponsors

Companies that keep this analytics open
Gold sponsor

Impressions, clicks and code copies — open statistics. We keep the numbers public for the same reason NeBlask itself is public. Become a sponsor