O nome que foi executado: Server-Side Template Injection no Flask

Segurança Web & API Nível 3/4 ~4 min 29 de outubro de 2026

O desafio

Os cartões da Peachtree executam seu nome. Envie código de template, como {{7*7}}. Faça o cartão mostrar a SECRET_KEY.

O que você vai aprender

  • Detectar server-side template injection com uma sonda aritmética
  • Distinguir o Jinja2 de outros engines pela saída
  • Ler o objeto config do Flask de dentro de um template
  • Explicar por que uma SECRET_KEY vazada significa sessões forjadas
  • Renderizar a entrada do usuário como dado, nunca como código de template

Habilidades testadas

Teste webInjeção em templateManipulação de requisição

Pré-requisitos

  • O que é uma query string
  • O que um template web faz

Como funciona

Um template engine transforma um template mais variáveis em HTML. A server-side template injection acontece quando a entrada do usuário passa a fazer parte do template em vez de ser uma variável: o engine então avalia tudo o que o usuário escreveu.

Aqui o app faz TEMPLATE.replace("NAME", name) e renderiza o resultado. {{7*7}} retorna 49, então a entrada é código. O app usa o ambiente com sandbox do Jinja, que recusa atributos que começam com underscore, então as cadeias de execução de código terminam em um SecurityError. Mas um sandbox só limita o que uma expressão pode fazer, não o que o template recebeu: no Flask, todo template alcança config, que guarda a SECRET_KEY, a chave que assina os cookies de sessão.

Erros comuns

  • Digitar espaços. Um espaço cru quebra a linha da requisição, e o gunicorn responde 400 Invalid HTTP Version. Escreva {{config}} ou codifique os espaços como %20.
  • Perseguir a execução de código. O sandbox bloqueia __class__ e companhia; esses payloads só geram a página 500 genérica. O segredo já está em config.
  • Parar no 49. A sonda aritmética só prova o bug; o segredo está em config.
  • Responder com a URL do banco de dados. A chave pedida é a SECRET_KEY.

Como se proteger

  • Nunca concatene a entrada do usuário em uma string de template. Mantenha os templates fixos e passe os dados como variáveis: render_template_string(TEMPLATE, name=name).
  • Use um ambiente com sandbox (jinja2.sandbox.SandboxedEnvironment) se os usuários precisarem escrever templates.
  • Rotacione a SECRET_KEY após um vazamento: toda sessão assinada com a chave antiga pode ser forjada.

Solução completa

Membros Pro e Max desbloqueiam o passo a passo completo.

Assinar Pro

Estatísticas da comunidade

165 resoluções
85% taxa de sucesso
Malekith Primeiro sangue

Hacks de hoje relacionados

35.000+ Hackers Labs reais Grátis
Comece Grátis ou resolva o hack de hoje, sem conta