.user.ini ファイルで構成される PHP バックドア
http://drops.wooyun.org/tips/3424
0x00 背景
多くの学生がこれを軽蔑の目で見て、これはすでに:
.htaccess ファイルで構成された PHP バックドア
次に、新しいものを作成しましょう: .user.ini。 .htaccess よりも広く使用されており、nginx/apache/IIS に関係なく、fastcgi で実行されている php であればこの方法を使用できます。すべての nginx サーバーは fpm/fastcgi を使用し、すべての IIS php5.3 以降は fastcgi/cgi を使用し、Win 環境の Apache も fcgi を使用します。制限のある .htaccess とは異なり、非常に幅広いと言えます。
0x01 .user.ini
では、.user.ini とは何でしょうか?
これは php.ini で始まる必要があります。 php.ini は PHP のデフォルト設定ファイルであり、多くの PHP 設定が含まれています。これらの設定は、PHP_INI_SYSTEM、PHP_INI_PERDIR、PHP_INI_ALL、PHP_INI_USER のいくつかのタイプに分かれています。 ここで参照できます: http://php.net/manual/zh/ini.list.php これらのモードの違いは何ですか?公式の説明を見てください:
ここに画像の説明を入力してください
PHP_INI_USER モードの構成項目は、ini_set() 関数またはレジストリで設定できると記載されていますを選択し、.user.ini に設定します。 ここで .user.ini と記載されていますが、これはどのような設定ファイルなのでしょうか?公式ドキュメントでは次のように説明されています:
メインの php.ini に加えて、PHP は、実行された PHP ファイルが配置されているディレクトリから Web ルートまでの各ディレクトリ内の INI ファイルもスキャンします。ディレクトリ ($_SERVER['DOCUMENT_ROOT'] で指定)。実行中の PHP ファイルが Web ルート ディレクトリの外にある場合、そのディレクトリのみがスキャンされます。
.user.ini スタイルの INI ファイルでは、PHP_INI_PERDIR および PHP_INI_USER モードの INI 設定のみが認識されます。
ここで、.user.ini は実際にはユーザーが「カスタマイズ」できる php.ini であることが非常に明確です。カスタマイズできる設定は、「PHP_INI_PERDIR、PHP_INI_USER」モードの設定です。 (上記の表に記載されていない PHP_INI_PERDIR も .user.ini で設定できます)
実際には、PHP_INI_SYSTEM 以外のモード (PHP_INI_ALL を含む) も .user.ini を通じて設定できます。
また、php.ini とは異なり、.user.ini は動的にロードできる ini ファイルです。つまり、.user.ini を変更した後、サーバー ミドルウェアを再起動する必要はありません。再ロードされるまで、user_ini.cache_ttl で設定された時間 (デフォルトは 300 秒) を待つだけで済みます。
その後、php.ini の設定項目を確認しましたが、残念ながら、 disable_functions と extension_dir 、enable_dl を含む、わずかに機密性の高い設定項目がすべて PHP_INI_SYSTEM モードになっていることがわかりました。 、など。 ただし、.user.ini ファイルを使用すると、「バックドア」を簡単に構築できます。
Php 構成項目には 2 つの興味深い項目があります (下の図の 1 番目と 4 番目):
ここに画像の説明を入力
auto_append_file、auto_prepend_file、クリックして表示意味を確認してください:
ここに画像の説明を入力します
ファイルを指定し、ファイルの前に require() 関数を呼び出すのと同様に、実行するファイルの前にそのファイルを自動的に含めます。 Auto_append_file も似ていますが、ファイルの後に含まれます。 使用方法は非常に簡単で、.user.ini に直接記述するだけです。
auto_prepend_file=01.gif
01.gif はインクルードされるファイルです。
したがって、.user.ini を使用すると、すべての PHP ファイルに特定のファイルを「自動的に」簡単に含めることができます。このファイルは、通常の PHP ファイルまたは文を含む Web シェルにすることができます。
テストしてください。IIS6.0 Fastcgi PHP5.3 と nginx fpm php5.3 でそれぞれテストしました。 このディレクトリには、.user.ini、Web シェルを含む 01.gif、および通常の PHP ファイル echo.php が含まれています:
ここに画像の説明を入力してください
ここに画像の説明を入力してください
echo にアクセスしてください.php を使用してバックドアを確認します:
ここに画像の説明を入力
Nginx でも同様:
ここに画像の説明を入力
ここに画像の説明を入力
それでは、不器用に考えてみますが、この姿勢はどのような状況で使用できるのでしょうか? たとえば、特定の Web サイトで .php ファイルのアップロードが制限されている場合は、.user.ini をアップロードしてからイメージ ホースをアップロードし、それらを getshell に含めることができます。ただし、前提として、.user.ini を含むフォルダーに通常の php ファイルが存在する必要があり、そうでない場合は含めることはできません。 別の例として、バックドアを非表示にしたいだけの場合は、この方法が最も便利です。
0x02 参照:
http://php.net/manual/zh/ini.list.php
http://php.net/manual/zh/configuration.changes.modes 。 php
http://php.net/manual/zh/configuration.file.per-user.php
http://php.net/manual/zh/configuration.changes.php