web-dev-qa-db-ja.com

IISが特定のディレクトリでスクリプトを実行しないようにします

特定のディレクトリへのファイルのアップロードを許可するphp webアプリケーションがあります。

ASP、PHP、またはIISでサポートされているその他のファイルであっても、そのディレクトリにアップロードされたファイルの実行を防止したいと思います。私はすでにアプリケーション層でaspファイルとphpファイルのアップロードをブロックしていますが、その検証コードで発生する可能性のあるエラーに対する徹底した防御策として、IISに構成を追加してこれらのファイルの実行。

IISでそれを行う方法はありますか?

4
greggles

まず第一に、これは実際にサーバーの構成に依存します-そのような変更がディレクトリレベルで実行できる場合(セクションは親/サーバーレベルでロックされません)。

特定のファイル拡張子の実行を無効にするには、ハンドラ名を知る必要がありますこれが原因です。各システムでは、この名前は標準のハンドラー(管理者権限を持つユーザーが作成)ではないため、特にPHPの場合は異なる場合があります。例(そのようなフォルダーに配置する必要があるweb.config):

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <system.webServer>
        <handlers>
            <remove name="PHP 5" />
        </handlers>
    </system.webServer>
</configuration>

上記により、私のPCで* .phpファイルを処理する「PHP 5」という名前のハンドラーが削除されます。 * .aspハンドラーを使用すると、標準名が付けられるため、これは簡単ですが、必要に応じて簡単に変更できます。

別のアプローチ-すべてのハンドラーをすべて削除する。この場合、ハンドラー名を知る必要はありません。これには重大な欠点が1つあります-このフォルダーとサブフォルダー、静的ファイルでさえもanythingを提供できません。

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <system.webServer>
        <handlers>
            <clear />
        </handlers>
    </system.webServer>
</configuration>

この欠点を回避するには、URL書き換えルールを作成し、そのようなファイルへのすべてのリクエストを、実際にそれらのファイルを処理する特別なスクリプトに転送します(スクリプトはこれらのファイルにアクセスできるため、ここでは問題ありません)。マイナス面-それは非常に複雑になる可能性があります(処理するファイルタイプの数に依存します)+不要な処理オーバーヘッドを少し生成します(大きさ-スクリプト、それをどのようにコーディングするかに依存します)。

3番目のアプローチはより最適なようです(他の要件に本当に依存します)-私たちはすべてのハンドラーを削除し、静的ファイルを提供するハンドラーを追加します .. so images/html/css/jsなどそのようなフォルダから要求された場合でも動作するはずです:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <system.webServer>
        <handlers>
            <clear />
            <add name="StaticFile" path="*" verb="*" modules="StaticFileModule,DefaultDocumentModule,DirectoryListingModule" resourceType="Either" requireAccess="Read" />
        </handlers>
    </system.webServer>
</configuration>

このフォルダで他の標準ハンドラを使用できるようにする必要がある場合は、同様の方法でそれらを追加し直す必要があります。

8
LazyOne

特定のフォルダーで特定のファイル拡張子が実行されるのを防ぐための良い簡単な方法の1つは、IISの「要求フィルター」機能を使用して、それらに完全にアクセスできないようにすることです。

IISのフォルダーに移動し、「要求フィルター」機能の「ファイル名拡張子」タブで、ロックするファイル拡張子の「ファイル拡張子を拒否」ルールを追加します。

そのフォルダーのweb.configファイルに次のセクションが生成されます。

<system.webServer>
    <security>
        <requestFiltering>
            <fileExtensions>
                <add fileExtension=".aspx" allowed="false" />
                <add fileExtension=".php" allowed="false" />
                <add fileExtension=".asp" allowed="false" />
            </fileExtensions>
        </requestFiltering>
    </security>
</system.webServer>

この例では、.php、.asp、および.aspxファイルへのアクセスをブロックします。そのため、誰かがフォルダ内のこの拡張子を持つファイルにアクセスしようとすると、404ステータスコードを取得します(ファイルが存在しないかのように)。

これは、迅速かつ簡単な方法で実行を防ぐ良い方法です。

3
jalarcon

アップロードされたファイルを静的コンテンツとして提供したい場合(または、アプリケーションのルートフォルダーの外部にアップロードを保存することもできます):

ルートのweb.config(ユーザーが上書きすることはできません)内で、これを使用します(Javier G.が提案したが、allowOverride=falseを使用):

  <location path="upload" allowOverride="false">
    <system.webServer>
      <handlers accessPolicy="Read" />
    </system.webServer>
  </location>

または、これ(LazyOneが示唆するが、allowOverride=falseを使用):

  <location path="upload" allowOverride="false">
    <system.webServer>
      <handlers accessPolicy="Read">
        <clear />
        <add name="StaticFile" path="*" verb="*" modules="StaticFileModule,DefaultDocumentModule,DirectoryListingModule" resourceType="Either" requireAccess="Read" />
      </handlers>
    </system.webServer>
  </location>

allowOverride=falseを使用しない場合、誰でも開いているフォルダーにweb.configをアップロードし、ハンドラーの構成をオーバーライドして、スクリプトを再度実行できるようにすることができます。エクスプロイトの例については、 このリンク をご覧ください。

2
drizin

同じ問題に直面している可能性がある他の人のために投稿されたソリューションに追加するだけです:ハンドラがトップレベルでロックされていることが判明するまで、それらのどれも私のために働きませんでした。私はサーバー管理者でもないし、それに近いものでもないので、少し時間がかかりました。 applicationHost.configファイルが編集されて、下位レベルの空の<handler>セクションを含むオーバーライドを許可するまでweb.configファイルはすべてを破壊するのに十分でしたそのレベルダウン。しかし、今ではうまくいきます。

1
user38245

このWeb.configをアップロードディレクトリに追加します(または、さらに良いことに、場所path = "whatever"タグ内の親Web.configに追加します)。

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
  <system.webServer>
    <handlers accessPolicy="Read"/>
  </system.webServer>
</configuration>

これはIISに、ハンドラー(PHPなど)は読み取りのみで実行はできないため、実行可能スクリプトの404を表示することを伝えます。

1
Javier G.