Pular para o conteúdo
Todos os conceitos

Escapar para a execução

A partir de um objeto comum, o atacante caminha pelo grafo de objetos até algo que executa.

O salto de SSTI para execução de código vem do fato de que, numa linguagem comum, todo objeto dá acesso a outros objetos. Partindo de um valor inocente no contexto, o atacante caminha por atributos (.algo) e índices (['algo']) até chegar a um objeto que execute comandos ou leia arquivos.

Em Jinja2, a trilha famosa parte de uma string vazia e sobe pela hierarquia de classes até funções do sistema. A forma é sempre a mesma: um grafo de objetos em que uma referência leva a outra, e em algum ponto há algo perigoso alcançável.

No exemplo (motor de brinquedo), o contexto só expõe page, mas page.owner leva ao ambiente, .host ao objeto que executa, e .run('...') roda o comando (aqui, de mentira, só consultando uma tabela). O conserto é um motor em modo sandbox, que corta justamente essas referências.

carga do atacante {{ page.owner.host.run('cat flag.txt') }} page objeto inocente .owner o sandbox cortaria esta referencia env ambiente do motor .host host executa (de brinquedo) .run(...) arquivo da flag flag.txt
Partindo de page, a cadeia page.owner.host.run leva ao objeto que executa e lê o arquivo da flag; o sandbox cortaria a referência owner.

Aparece nestes desafios