Reason about SSRF, IDOR, mass assignment, injection vectors, file upload abuse, prototype pollution, and ReDoS from code and docs evidence.
Scanned 9/2/2026
Install to Claude Code
npx -y skills add Eliyce/paqad-ai --skill input-validation-review --agent claude-codeInstalls into .claude/skills of the current project.
Are you the author of Input Validation Review?
Add the live security badge to your README — it updates automatically with every re-scan.
[](https://www.skillsdirectory.com/skills/eliyce-input-validation-review)More formats (shields.io, HTML) on the badges page.
---
name: input-validation-review
description: Reason about SSRF, IDOR, mass assignment, injection vectors, file upload abuse, prototype pollution, and ReDoS from code and docs evidence.
model_tier: reasoning
triggers:
- workflow:
- pentest
cacheable: false
cache_key_inputs:
- docs/modules/**
- tests/**
output_format: markdown
input_schema:
module_doc_paths:
type: path[]
required: true
description: Module docs describing endpoints, data flows, and external integrations.
test_paths:
type: path[]
required: false
description: Tests that may prove input validation and abuse-path coverage.
---
## What It Does
Reviews all code paths where user-supplied input reaches security-sensitive operations — outbound HTTP calls, database lookups, ORM constructors, shell commands, template renderers, deserializers, file operations, and regex evaluations — and produces findings for each category that lacks proof of safe handling.
## Use This When
Use this when module docs or route inventories describe endpoints that accept URLs, resource IDs, request body fields, file uploads, or any user-controlled parameter that flows into a downstream system call.
## Inputs
- Read the module docs to identify data flow surfaces.
- Read `references/input-attack-patterns.md` before scanning for each category.
- Read tests and code evidence that could confirm or refute safe handling.
## Procedure
1. **SSRF scan**: Find all code paths that accept a URL, IP, or hostname and make an outbound request. Check for an explicit allowlist or blocked private-range validation (127.x, 10.x, 169.254.x, 172.16–31.x, `::1`, fd00::/8, AWS metadata `169.254.169.254`).
2. **IDOR scan**: Find resource lookups keyed by a user-controlled ID. Verify an authorization check exists **between** ID resolution and data return — not just at the route level.
3. **Mass assignment scan**: Find ORM fill calls, model constructors, or serializers that accept the full request body. Verify an explicit allowlist (`$fillable`, `attr_accessible`, `schema.pick()`) or blocklist exists.
4. **Injection vectors**: Identify:
- Raw SQL construction or string interpolation in queries
- Shell exec with user input (`exec`, `system`, `passthru`, `child_process.exec`, `subprocess.run(shell=True)`)
- Template rendering with unsanitized data (`{!! !!}`, `|raw`, `dangerouslySetInnerHTML`, `render_template_string`)
- Deserialization of untrusted data (`unserialize()`, `pickle.loads()`, `yaml.load()` without `Loader=SafeLoader`)
- LDAP injection in directory lookups
- XPath injection in XML processing
5. **File upload abuse**: Check MIME type validation, file extension allowlist, path traversal in the filename, storage isolation from the web root, and max-file-size enforcement.
6. **Prototype pollution (JS/Node)**: Find deep merges of user input into objects without property filtering — `lodash.merge`, `Object.assign`, `_.defaults` from untrusted source with `__proto__` or `constructor.prototype` keys.
7. **ReDoS**: Find user input fed into regex patterns that could cause catastrophic backtracking. Look for patterns of the form `(a+)+`, `(a|a)+`, or `.*.*` applied to unbounded input.
## Output Contract
- Match `assets/output.template.md`: severity, WSTG id (from `assets/wstg-mapping.txt`), category, Evidence: `file:line`, Reproduction (endpoint + parameter + expected vs observed), Required action.
- Output must pass `scripts/lint-findings.sh` (exit 0).
## Escalate / Stop Conditions
- Ask when module docs describe external integrations but do not name the parameters or protocol used.
- Warn when deserialization of complex objects (PHP `unserialize`, Python `pickle`) is found without a safe alternative.
- Do not flag a finding purely because a URL parameter exists — only when there is no evidence of safe handling.
## Resources
- `references/input-attack-patterns.md`
- `scripts/scan-injection-smells.sh` — pre-investigation grep for known sinks
- `scripts/lint-findings.sh` — enforces WSTG id + Evidence:file:line per finding
- `assets/output.template.md`
- `assets/wstg-mapping.txt`
Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.
No comments yet. Be the first to comment!