web-dev-qa-db-fra.com

empêcher IIS d'exécuter des scripts dans un répertoire spécifique

J'ai une application Web php qui permet le téléchargement de fichiers dans un répertoire spécifique.

Je souhaite empêcher l'exécution de tout fichier téléchargé dans ce répertoire, qu'il s'agisse d'ASP, de PHP ou de tout autre support pouvant être pris en charge par IIS. Je bloque déjà le téléchargement de fichiers asp et php au niveau de la couche application, mais comme mesure de défense en profondeur contre une possible erreur dans ce code de validation, j'aimerais ajouter une configuration à IIS pour empêcher exécution de ces fichiers.

Y at-il un moyen de faire cela dans IIS?

4
greggles

Tout d’abord - cela dépend vraiment de la configuration de votre serveur - si de telles modifications sont autorisées au niveau du répertoire (la section n’est pas verrouillée au niveau parent/serveur).

Afin de désactiver l'exécution d'une extension de fichier spécifique, vous devez connaître le nom du gestionnaire qui en est responsable. Sur chaque système, ce nom peut être différent, en particulier pour PHP, puisqu'il ne s'agit pas d'un gestionnaire standard (créé par l'utilisateur avec des droits d'administrateur). Par exemple (web.config qui doit être placé dans un tel dossier):

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

Ce qui précède supprimera le gestionnaire nommé "PHP 5" responsable de la gestion des fichiers * .php sur mon PC. Avec * .asp, cela devrait être plus facile, car il porte le nom standard, mais il peut facilement être changé si nécessaire.

Une autre approche - supprime TOUS les gestionnaires. Dans ce cas, vous n'avez pas besoin de connaître les noms des gestionnaires. Cela a un inconvénient sérieux - vous ne pourrez pas servir quoi que ce soit à partir de ce dossier et de ses sous-dossiers, même des fichiers statiques.

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

Pour contourner cet inconvénient, vous pouvez créer une règle de réécriture d'URL et transférer toutes les demandes relatives à ces fichiers vers votre script spécial qui les servira (le script aura accès à ces fichiers, aucun problème ici). L'inconvénient - cela peut être assez complexe (dépend du nombre de types de fichiers qu'il va gérer) + produira un peu de surcharge de traitement inutile (quelle taille - dépend de votre script, comment vous allez le coder).

La 3ème approche semble être plus optimale (dépend vraiment de vos autres exigences) - nous allons supprimer TOUS les gestionnaires et ajouter celui qui restitue les fichiers statiques .. donc images/html/css/js etc. devrait toujours fonctionner si demandé à partir de ce dossier:

<?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>

Si vous avez encore besoin que d’autres gestionnaires standard soient disponibles dans ce dossier, vous devrez les rajouter de la même manière.

8
LazyOne

Un moyen simple et efficace d'empêcher l'exécution de certaines extensions de fichier dans un dossier spécifique consiste à utiliser la fonction "Filtrage de demandes" de IIS pour empêcher leur accès.

Accédez au dossier situé dans IIS et dans l'onglet "Extensions de nom de fichier" de la fonctionnalité "Demande de filtrage", ajoutez des règles "Refuser l'extension de fichier" pour les extensions de fichier que vous souhaitez verrouiller.

Cela générera ces sections dans le fichier web.config pour ce dossier:

<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>

Dans cet exemple, nous bloquons l'accès aux fichiers .php, .asp et .aspx. Ainsi, si quelqu'un tente d'accéder à un fichier avec cette extension dans votre dossier, il recevra un code d'état 404 (comme si le fichier n'existait pas).

Ce serait un bon moyen d’empêcher une exécution simple et rapide.

3
jalarcon

En supposant que vous souhaitiez que les fichiers téléchargés soient servis en tant que contenu statique (sinon, vous pouvez simplement enregistrer les téléchargements en dehors du dossier racine de votre application):

Dans votre racine web.config (qui ne peut pas être écrasée par les utilisateurs), utilisez ceci (comme suggéré par Javier G., mais avec allowOverride=false):

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

Ou ceci (comme suggéré par LazyOne, mais avec 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>

Si vous n'utilisez pas allowOverride=false, n'importe qui peut télécharger un fichier web.config dans votre dossier ouvert et redéfinir la configuration de vos gestionnaires afin de pouvoir exécuter à nouveau des scripts . Voir ce lien pour un exemple d'exploitation.

2
drizin

Juste pour ajouter à la solution affichée pour d’autres qui pourraient être confrontés au même problème: Aucun de ceux-ci n’a fonctionné pour moi jusqu’à ce que j’ai réalisé que les gestionnaires étaient verrouillés au plus haut niveau. Je ne suis pas un administrateur de serveur ou même proche, donc cela m'a pris un peu de temps. Jusqu'à ce que le fichier applicationHost.config soit modifié pour permettre les remplacements, y compris même une section vide <handler> d'un niveau inférieur web.config le fichier était suffisant pour tout casser. ce niveau bas. Fonctionne bien maintenant, cependant.

1
user38245

Ajoutez ce Web.config à votre répertoire de téléchargement (ou mieux encore, au Web.config parent à l’intérieur d’un tag path = "what")

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

Ceci indique à IIS que les gestionnaires (tels que PHP) peuvent uniquement lire, et ne pas s'exécuter, affichant ainsi un code 404 pour les scripts exécutables.

1
Javier G.