IIS CGI HTTP_PROXY 헤더 요청이 리디렉션될 수 있음

현상
IIS CGI(Common Gateway Interface) 기능을 사용하여 실행 프로그램을 호스팅할 때 해당 실행 프로그램이 요청을 리디렉션하는 특정 라이브러리를 사용하면 "PROXY" 요청 헤더의 존재 여부에 따라 요청이 잘못 리디렉션될 수 있습니다. 일부 웹 응용 프로그램 플랫폼은 이 라이브러리를 사용하는 것으로 알려져 있습니다. 일부 예로는 PHP, Python, Go 등이 있습니다.
원인
CGI는 실행 프로세스 형식으로 실행되는 응용 프로그램을 웹 서버가 호스팅할 수 있도록 허용하는 인터페이스입니다. 웹 서버가 요청을 수신하면 서버는 수신한 단일 요청을 처리하기 위해 새로운 프로세스를 시작합니다. 요청이 완료되면 프로세스는 종료됩니다. 프로세스에 요청 데이터에 대한 액세스 권한을 부여하기 위해 요청 헤더가 이름 앞에 "HTTP_"가 추가된 환경 변수로 포함됩니다. 따라서 이름이 "Proxy"인 헤더를 포함하는 요청에 대한 CGI 프로세스에는 요청 헤더와 동일한 값을 가진 "HTTP_PROXY" 환경 변수가 있습니다.

cURL 명령줄 및 라이브러리는 다양한 종류의 응용 프로그램이 웹 서버를 포함한 다양한 종류의 서버로 요청을 보낼 수 있도록 지원하는 데 주로 사용됩니다. 이 라이브러리는 명령줄 매개 변수를 사용하여 구성할 수 있으며, 호스트 프로세스 환경 변수에서 구성 매개 변수를 읽어올 수 있습니다. "HTTP_PROXY"는 cURL에 사용되는 여러 구성 매개 변수 중 하나입니다. "HTTP_PROXY"는 cURL이 구성된 프록시를 통해 HTTP 요청을 보낼 때 사용됩니다.

참고 이는 클라이언트 요청 헤더 표현인 "HTTP_PROXY"와 무관합니다.

cURL이 CGI 프로세스 내에 호스팅되는 경우 CGI 프로세스에 "HTTP_PROXY"라는 환경 변수가 포함되면 cURL은 환경 변수 값을 사용하여 HTTP 프록시를 통해 요청된 데이터를 보냅니다. 이때 HTTP 프록시의 값도 환경 변수에 지정되어 있습니다. cURL이 클라이언트 요청 헤더가 아닌 구성 지시문으로 "HTTP_PROXY"를 예상하기 때문에 이 문제가 발생합니다.
해결 과정
이 문제를 해결하려면 IIS를 실행하는 서버에서 CGI를 사용하지 마십시오. CGI는 거의 사용되지 않는 인터페이스로, 더 좋은 성능의 최신 인터페이스로 대체되었습니다. 구체적으로, PHP, Python 및 Go는 IIS의 FastCGI를 통해 호스팅되어야 합니다. FastCGI는 클라이언트 요청 헤더에 환경 변수를 사용하지 않으므로 이러한 문제를 유발하지 않습니다. 반면 PHP의 경우 일부 응용 프로그램이 PHP의 getenv() 함수를 사용하여 환경 변수를 검색할 수도 있습니다. PHP가 CGI 프로세스 내에 호스팅되지 않은 경우라도 PHP는 getenv() 함수에 사용할 수 있는 데이터 집합에 요청 헤더 값을 삽입하여 CGI 동작을 되풀이합니다. 이러한 방식으로 HTTP_PROXY를 검색하는 PHP 응용 프로그램을 사용하는 경우 헤더 값을 지우거나 PROXY 헤더가 있는 요청을 거부하는 다음과 같은 완화 방법이 효과적입니다.

어떠한 이유로 인해 CGI를 사용해야 한다면 "Proxy"라는 요청 헤더가 포함된 요청을 차단하거나 헤더의 값을 지우십시오.  "Proxy"는 표준 요청 헤더 이름이 아니어서 일반적으로 브라우저가 해당 요청을 보내지 않기 때문입니다.

Proxy 헤더를 포함하는 요청을 차단하려면 다음 명령줄을 실행하십시오(권장 해결 방법).
appcmd set config /section:requestfiltering /+requestlimits.headerLimits.[header='proxy',sizelimit='0']

참고 appcmd.exe는 주로 경로에 없으며 %systemroot%\system32\inetsrv 디렉터리에서 찾을 수 있습니다.

헤더 값을 지우려면 다음 URL Rewrite 규칙을 사용하면 됩니다.
<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>

참고 URL Rewrite는 다운로드할 수 있는 IIS 추가 기능이며, 기본 IIS 설치에는 포함되어 있지 않습니다.
속성

문서 ID: 3179800 - 마지막 검토: 08/02/2016 13:44:00 - 수정: 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
피드백