CtrlK
BlogDocsLog inGet started
Tessl Logo
SkillPublic

exploit-ssti

Server-Side Template Injection (SSTI) — RCE through template engines. Covers Jinja2 (Python/Flask), Twig (PHP/Symfony), Freemarker (Java), ERB (Ruby), Razor (.NET). Includes engine fingerprinting, MRO chain construction, and filter bypass.

Quality

82%

Does it follow best practices?

Run evals on this skill

Adds up to 20 points to the overall score

View guide
SecuritybySnyk

Critical

Do not install without reviewing

SKILL.md
Quality
Evals
Security

Quality

Content

85%Weight 40%Scale 1-5

Reviews the quality of instructions and guidance provided to agents. Good implementation is clear, handles edge cases, and produces reliable results.

An outstandingly actionable exploit playbook: executable commands, explicit decision rules, calibration steps, and bounded-retry pivot rules make the workflows unambiguous to follow. The weaknesses are minor duplication of payloads across sections and the absence of any progressive-disclosure split despite substantial length.

Suggestions

Split per-engine payload catalogs into references/ files (e.g. references/django.md, references/twig-sandbox.md) loaded only after fingerprinting identifies the engine, keeping SKILL.md to detection, fingerprinting, and decision rules.

Deduplicate the Jinja2 globals payloads: the 'Common RCE payloads' comment block in the Jinja2 section repeats payloads that reappear under 'Alternative globals-based RCE' — keep one canonical location.

State the top-level sequence explicitly at the top (fingerprint → confirm engine → apply engine section → follow blind/sandbox variants only if reflection is absent), so the section-level triggers hang off one master workflow.

DimensionReasoningScore

Conciseness

Nearly every token is an executable payload, a terse decision rule, or genuinely non-obvious expert knowledge (e.g. the Django messages.storages.0.signer.key mechanism), with no explanation of concepts Claude already knows. Minor duplication keeps it below 5: Jinja2 globals payloads appear both as comments in the Jinja2 section and again in full under 'Alternative globals-based RCE', and the 'Common RCE payloads' comment blocks repeat later content.

4 / 5

Actionability

Fully copy-paste-ready curl commands throughout — polyglot detection probes, per-engine RCE payloads, an executable subclass-enumeration script with concrete index guidance, a complete boolean-extraction bash loop with calibration, and a fingerprinting table with expected outputs. Not level 4: the examples comprehensively cover the common cases with specific commands and observable results (49, 7777777, 200/500).

5 / 5

Workflow Clarity

Explicit validation and feedback loops throughout: numbered decision flows for blind SSTI and the 5xx oracle (calibrate → extract → pivot), the 'attempt login FIRST' fast-path ordering, the multi-surface store→probe-every-surface sequence, and 3-strike pivot rules that bound dead-end iteration. Calibration before the batch oracle loop is an explicit checkpoint, matching the level 5 anchor.

5 / 5

Progressive Disclosure

A single 317-line self-contained file, well-organized by engine with clear headers — but the under-50-lines self-containment exception does not apply at this length, and engine-specific payload catalogs (especially the ~70-line Django deep-dive and sandbox-bypass payload lists) are inline content that belongs in references/ files loaded only for the detected engine. Structure itself is good, so this sits at the 'content that should be separate is inline' anchor rather than the minimal-structure level 2.

3 / 5

Total

17

/

20

Passed

Description

75%Weight 40%Scale 1-5

Based on the skill's description, can an agent find and select it at the right time? Clear, specific descriptions lead to better discovery.

A highly specific, well-scoped description that names concrete capabilities across five template engines with strong distinctiveness. Its one structural weakness is that trigger guidance ('Use when...') lives in metadata.when_to_use rather than the description field itself, capping completeness at 3.

Suggestions

Append a 'Use when...' clause to the description itself (e.g. 'Use when a challenge involves template injection, {{7*7}}-style probes, or flask/django/twig template rendering'), since the current when-guidance is confined to metadata.when_to_use.

Fold a few of the most natural trigger phrases from metadata.when_to_use — 'flask template', 'django template', '{{7*7}}', 'thymeleaf', 'smarty' — into the description to reach synonym-level keyword coverage.

Mention detection capability explicitly (e.g. 'detects and fingerprints the engine') so the description front-loads the entry-point action of the skill.

DimensionReasoningScore

Specificity

"RCE through template engines. Covers Jinja2 (Python/Flask), Twig (PHP/Symfony), Freemarker (Java), ERB (Ruby), Razor (.NET). Includes engine fingerprinting, MRO chain construction, and filter bypass" lists multiple specific concrete actions with comprehensive per-engine coverage — no meaningful gaps for the stated domain.

5 / 5

Completeness

The 'what' is explicit and detailed, but the description field contains no 'Use when...' clause or equivalent trigger guidance — the when-guidance lives in metadata.when_to_use, outside the evaluated description. Per the rubric guideline this caps completeness at 3, matching the anchor 'Has a clear what but when is missing'.

3 / 5

Trigger Term Quality

Good natural keyword coverage within the description ("Server-Side Template Injection (SSTI)", "template engines", "Jinja2", "Twig", "Freemarker", "ERB", "Razor", "MRO chain"), but common variations a user would say — "flask template", "{{7*7}}", "thymeleaf", "smarty" — are absent from the description field itself (they appear only in metadata.when_to_use), so it falls short of the synonym-inclusive level 5 anchor.

4 / 5

Distinctiveness Conflict Risk

SSTI with named engines and distinctive triggers ({{7*7}} math probes, MRO chains, filter bypass) occupies a clear niche with minimal conflict risk against sibling web-exploitation skills. Not level 4, since the triggers are highly distinctive rather than merely 'mostly distinct'.

5 / 5

Total

17

/

20

Passed

Validation

87%

Checks the skill against the spec for correct structure and formatting. All validation checks must pass before discovery and implementation can be scored.

Validation — 14 / 16 Passed

Validation for skill structure

CriteriaDescriptionResult

metadata_version

'metadata.version' is missing

Warning

relative_links

Relative link issues: 5 missing, 1 deeper-than-1-level

Warning

Total

14

/

16

Passed

Repository

PurpleAILAB/Decepticon

Path

packages/decepticon/decepticon/skills/standard/exploit/web/ssti/SKILL.md

Reviewed

Table of Contents

Is this your skill?

If you maintain this skill, you can claim it as your own. Once claimed, you can manage eval scenarios, bundle related skills, attach documentation or rules, and ensure cross-agent compatibility.