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 ルート ディレクトリ ($_SERVER) までの各ディレクトリ内の INI ファイルもスキャンします。 [ '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 モードになっていることがわかりました (php.ini のみも含む)。 ただし、.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、WebShell を含む 01.gif、および通常の PHP ファイル echo.php が含まれています:
ここに画像の説明を入力してください
ここに画像の説明を入力してください
バックドアを確認するには echo.php にアクセスしてください:
画像の説明を入力してくださいここ
Nginx でも同様に:
ここに画像の説明を入力
ここに画像の説明を入力
それでは、このジェスチャはどのような状況で使用できるのかを考えてみましょう。 たとえば、特定の Web サイトで .php ファイルのアップロードが制限されている場合は、.user.ini をアップロードしてからイメージ ホースをアップロードし、それらを getshell に含めることができます。ただし、前提として、.user.ini を含むフォルダーに通常の php ファイルが存在する必要があり、そうでない場合は含めることはできません。 別の例として、バックドアを非表示にしたいだけの場合は、この方法が最も便利です。