O nome que foi executado: Server-Side Template Injection no Flask
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
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á emconfig. - 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_KEYapós um vazamento: toda sessão assinada com a chave antiga pode ser forjada.