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, (^^ゞ