Shikata Ga Nai

Private? There is no such things.

SSTI(Server-Side Template Injection)診断マニュアル

Hello there, ('ω')ノ

🎯 1. SSTIとは?

SSTI(サーバサイドテンプレートインジェクション)は、テンプレートエンジン(例:Jinja2, Twig, Velocity など)がユーザ入力をサーバ側でテンプレート構文として評価してしまうことで、 任意のコード実行や情報漏洩が可能になる脆弱性です。

サーバが {{ user }} のような構文をレンダリングしているとき、 ユーザ入力が {{ 7*7 }}49 などに評価されるなら脆弱性が疑われます。


🧭 2. チェック対象となる機能・画面

機能 対象入力欄 備考
📝 入力フォーム 名前、コメント、タグなど 表示ページで評価されているか
🔍 検索機能 検索語がそのまま出力される場合
📄 プロファイルやレポート ユーザ名、住所などをテンプレートで整形している場合
🔁 URLパラメータ ?user=... などが直接反映される

🧪 3. テスト用ペイロード(テンプレート共通)

✅ 一般的なSSTI検出ペイロード

テンプレート構文 内容
{{7*7}} Jinja2, Twig, Nunjucks など
<%= 7 * 7 %> ERB, EJS など
${7*7} Velocity, Freemarker
#{7*7} Thymeleaf(Spring)
<% out.println(7*7); %> JSP/Java

🧪 4. 診断手順

  1. 入力できる場所を見つける

    • 名前、メッセージ、URLパラメータなど
  2. ペイロードを入力

    • 例:{{7*7}} など
  3. 表示画面で評価結果が表示されるか確認

    • 期待:{{7*7}}49
    • そのまま {{7*7}} と表示された場合は評価されていない

🧠 5. 各テンプレートエンジンごとの挙動と特徴

エンジン 拡張子 特徴
Jinja2(Python) .html, .jinja {{7*7}}, config.__class__ でRCE
Velocity(Java) .vm ${7*7}49
Twig(PHP) .twig Jinja風、{{7*7}}
Freemarker(Java) .ftl ${7*7}${request}などの参照で情報取得
Smarty(PHP) .tpl {php} タグでコード実行も可能

🧨 6. 任意コード実行(RCE)例(Jinja2)

{{ self._TemplateReference__context.cycler.__init__.__globals__.os.popen('id').read() }}

→ 実行結果としてサーバのユーザ情報(uid=xxx)が表示されたら 完全なSSTI

※ 本番環境では os などが制限されている場合あり


🔐 7. 防御が適切かの確認ポイント

対策 内容
テンプレートにユーザ入力を直接埋め込んでいない render_template(..., user_input=input) のような使い方は避けるべき
出力時にテンプレート構文を**無害化(エスケープ)**しているか
テンプレート構文が表示されたまま(評価されない)なら比較的安全
テンプレートライブラリにセーフモードがあるか? Twigのautoescape, JinjaのSandboxedEnvironmentなど

🧰 8. 診断補助ツール

ツール 用途
Burp Suite(Repeater) ペイロードの変化を簡単に確認可能
tplmap 自動でSSTI検出 + コマンド実行テストができる(Python製)
セキュリティ用ブラウザ拡張 コンテキストを変えて再テストに便利

✅ 9. 診断成功のサイン

観察結果 解釈
{{7*7}}49 テンプレート構文が評価されている
{{config}} などでシステム情報が出る テンプレートに内部オブジェクトがある
idwhoami などのOSコマンドの出力が得られる 任意コード実行可能(RCE)

📌 見つけやすいヒント

  • 表示された値が変に「計算結果」や「オブジェクト情報」っぽい
  • テンプレート構文のまま表示されない
  • "template", "render", "format" などのキーワードを含むバックエンド構造

補足: SSTIは他の攻撃(例:RCE、SSRF、情報漏洩など)の足がかりとしても極めて危険です。 特にJinja2環境では、Pythonのオブジェクトツリーをたどって容易にRCEに至るため、診断時には慎重かつ厳重な取り扱いが必要です。

Best regards, (^^ゞ