SSTI
Server-Side Template Injection(サーバーサイドテンプレートインジェクション)。ユーザー入力がデータではなくコードとしてテンプレートエンジンに渡され、しばしばそのままRCEに至る。
典型例はJinja2の render_template_string("Hello " + name) である。name = {{ 7*7 }} を送ると、応答は「Hello 49」になる。さらに {{ config.__class__.__init__.__globals__['os'].popen('id').read() }} まで進めば、シェルを奪われる。Twig、Freemarker、Velocity、Smarty、Handlebars、ERBにも同種の手口がある。
対策は、テンプレート(静的ファイル)とデータ(パラメータ)を分離し、ユーザーの文字列を決してテンプレートとして描画しないことである。テンプレートエンジンのサンドボックスも助けにはなるが、過去に何度も破られてきた。PortSwiggerのラボ演習が、権限昇格の流れを学ぶのに適している。