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. 診断手順
入力できる場所を見つける
- 名前、メッセージ、URLパラメータなど
ペイロードを入力
- 例:
{{7*7}}
など
- 例:
表示画面で評価結果が表示されるか確認
- 期待:
{{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}} などでシステム情報が出る |
テンプレートに内部オブジェクトがある |
id や whoami などのOSコマンドの出力が得られる |
任意コード実行可能(RCE) |
📌 見つけやすいヒント
- 表示された値が変に「計算結果」や「オブジェクト情報」っぽい
- テンプレート構文のまま表示されない
"template"
,"render"
,"format"
などのキーワードを含むバックエンド構造
補足: SSTIは他の攻撃(例:RCE、SSRF、情報漏洩など)の足がかりとしても極めて危険です。 特にJinja2環境では、Pythonのオブジェクトツリーをたどって容易にRCEに至るため、診断時には慎重かつ厳重な取り扱いが必要です。
Best regards, (^^ゞ