Les requêtes de l'en-tête HTTP_PROXY de la fonctionnalité IIS CGI peuvent être redirigées

Symptômes
En cas d'utilisation de la fonctionnalité IIS CGI (Common Gateway Interface) pour héberger un programme exécutable qui utilise une bibliothèque donnée pour rediriger les requêtes, les requêtes peuvent être redirigée de manière incorrecte en fonction de la présence d'un en-tête de requête « PROXY ». Plusieurs plateformes d'application web utilisent cette bibliothèque. Il s'agit notamment de PHP, Python et Go.
Cause
CGI est une interface qui permet à un serveur web d'héberger des applications exécutées en tant que processus exécutables. Lorsqu'un serveur web reçoit une requête, il démarre un nouveau processus pour traiter cette requête. Ce processus se ferme une fois la requête terminée. Pour que le processus puisse accéder aux données de la requête, les en-têtes de la requête sont inclus en tant que variables d'environnement dont le nom comporte le préfixe « HTTP_ ». Par conséquent, les processus CGI portant sur des requêtes qui contiennent un en-tête nommé « Proxy » comportent une variable d'environnement « HTTP_PROXY » dont la valeur correspond à l'en-tête de requête.

La bibliothèque et la ligne de commande cURL sont généralement utilisées pour permettre à différents types d'applications d'effectuer des requêtes destinées à différents types de serveurs, y compris des serveurs web. Cette bibliothèque peut être configurée à l'aide de paramètres de ligne de commande, mais elle peut également lire ses paramètres de configuration dans les variables d'environnement du processus hôte. « HTTP_PROXY » est l'un des nombreux paramètres de configuration utilisés par cURL. « HTTP_PROXY » est utilisé par cURL pour envoyer une requête HTTP via le proxy configuré.

Remarque Ce paramètre n'est pas lié à « HTTP_PROXY » en tant que représentation d'un en-tête de requête client.

Lorsque cURL est hébergé dans un processus CGI qui contient une variable d'environnement nommée « HTTP_PROXY », cURL utilise cette valeur pour envoyer les données demandées via le proxy HTTP dont la valeur est spécifiée dans la variable d'environnement. En effet, cURL s'attend à ce que « HTTP_PROXY » soit une directive de configuration, non pas un en-tête de requête client.
Contournement
Pour résoudre ce problème, n'utilisez pas CGI sur un serveur exécutant IIS. L'interface CGI est relativement obsolète et est remplacée par de nouvelles interfaces davantage axées sur les performances. En particulier, les plateformes PHP, Python et Go doivent être hébergées via FastCGI sur IIS. Ce problème ne se produit pas avec FastCGI, car il n'utilise pas de variables d'environnement pour les en-têtes de requête client. Toutefois, pour PHP, certaines applications peuvent utiliser la fonction PHP getenv() pour récupérer les variables d'environnement. Même lorsque PHP n'est pas hébergé dans un processus CGI, il réplique le comportement CGI en injectant des valeurs d'en-tête de requête dans l'ensemble de données disponibles pour sa fonction getenv(). En cas d'utilisation d'une application PHP qui récupère HTTP_PROXY de cette manière, les solutions d'atténuation suivantes consistant à effacer la valeur d'en-tête ou à rejeter les requêtes avec un en-tête PROXY sont efficaces.

Si vous devez utiliser CGI pour une raison ou l'autre, bloquez les requêtes contenant un en-tête de requête nommé « Proxy » ou effacez la valeur de l'en-tête.  En effet, « Proxy » n'est pas un nom d'en-tête de requête standard et les navigateurs ne l'envoient généralement pas.

Pour bloquer une requête contenant un en-tête Proxy (solution privilégiée), exécutez la ligne de commande suivante :
appcmd set config /section:requestfiltering /+requestlimits.headerLimits.[header='proxy',sizelimit='0']

Remarque Le fichier appcmd.exe n'est généralement pas situé dans le chemin ; il se trouve plutôt dans le répertoire %systemroot%\system32\inetsrv.

Pour effacer la valeur de l'en-tête, vous pouvez utiliser la règle de réécriture d'URL (URL Rewrite) suivante :
<system.webServer>    <rewrite>        <rules>            <rule name="Erase HTTP_PROXY" patternSyntax="Wildcard">                <match url="*.*" />                <serverVariables>                    <set name="HTTP_PROXY" value="" />                </serverVariables>                <action type="None" />            </rule>        </rules>    </rewrite></system.webServer>

Remarque Le module de réécriture d'URL est un composant téléchargeable pour IIS et n'est pas inclus dans l'installation IIS par défaut.
Propriétés

ID d'article : 3179800 - Dernière mise à jour : 08/02/2016 12:23:00 - Révision : 3.0

Windows 10, Windows 10 Version 1511, Windows Server 2012 R2 Datacenter, Windows Server 2012 R2 Standard, Windows Server 2012 R2 Essentials, Windows Server 2012 R2 Foundation, Windows 8.1 Enterprise, Windows 8.1 Pro, Windows 8.1, Windows RT 8.1, Windows Server 2012 Datacenter, Windows Server 2012 Standard, Windows Server 2012 Essentials, Windows Server 2012 Foundation, Windows Server 2008 R2 Service Pack 1, Windows 7 Service Pack 1, Windows Server 2008 Service Pack 2, Windows Vista Service Pack 2

  • atdownload kbbug kbexpertiseinter kbfix kbsecbulletin kbsecurity kbsecvulnerability KB3179800
Commentaires