요청 필터링 사용

작성자: IIS 팀

소개

보안 도구인 UrlScan은 관리자가 웹 서버에 더 엄격한 보안 정책을 적용할 수 있도록 이전 버전의 IIS(인터넷 정보 서비스)에 대한 추가 기능으로 제공되었습니다. IIS 7 이상 내에서 URLScan의 모든 핵심 기능이 요청 필터링이라는 모듈에 통합되었으며 숨겨진 세그먼트 기능이 추가되었습니다. 이 문서에서는 요청 필터링의 각 기능을 설명하고 사용자 환경에서 기능을 적용하는 방법에 대한 예제를 제공합니다.

IIS에는 URL 다시 쓰기를 위한 모듈도 포함되어 있습니다. 이러한 두 모듈 간에는 차이점이 있습니다. 요청 필터링은 보안 시나리오에 맞게 설계되고 최적화된 반면 URL 다시 쓰기는 광범위한 시나리오 집합에 적용할 수 있습니다(보안 시나리오는 이러한 하위 집합일 뿐입니다). 차이점에 대한 자세한 내용은 IIS 7.0 이상 요청 필터링 및 URL 다시 쓰기를 참조하세요.

Double-Encoded 요청 필터링

이 기능은 이중 인코딩된 요청에 의존하는 공격을 방지하고 공격자가 신중하게 만들어진 이중 인코딩 요청을 IIS에 제출하는 경우 적용됩니다. 이중 인코딩된 요청 필터를 사용하도록 설정하면 IIS는 URL을 두 번 정규화합니다. 첫 번째 정규화가 두 번째 정규화와 다르면 요청이 거부되고 기록된 오류 코드가 404.11입니다. 이중 인코딩된 요청 필터는 UrlScan의 VerifyNormalization 옵션이었습니다.

IIS가 두 배로 인코딩된 요청을 처리하도록 허용하지 않으려면 다음을 사용합니다.

<configuration>
 <system.webServer> 
  <security>
   <requestFiltering
                  allowDoubleEscaping="false">
   </requestFiltering> 
  </security>
 </system.webServer>
</configuration>

높은 비트 문자 필터링

이 기능은 ASCII가 아닌 문자를 포함하는 IIS에 대한 모든 요청을 허용하거나 거부하고 오류 코드 404.12를 기록합니다. UrlScan은 AllowHighBitCharacters와 동일합니다.

예를 들어 한 애플리케이션에 대해 높은 비트 문자를 허용하려고 하지만 전체 서버에는 허용하지 않을 것이라고 가정해 보겠습니다. ApplicationHost.config 파일에서 allowHighBitCharacters="false"를 설정합니다. 하지만 애플리케이션 루트 내에서 단일 애플리케이션이 ASCII가 아닌 문자를 수락할 수 있는 Web.config 파일을 만듭니다. Web.config 파일에서 다음을 사용합니다.

<configuration>
 <system.webServer>
  <security>
   <requestFiltering
                  allowHighBitCharacters="true"
            >
   </requestFiltering>
  </security>
 </system.webServer>
</configuration>

파일 확장자를 기반으로 필터링

이 기능은 IIS에서 제공하는 허용되는 파일 확장명 집합을 정의합니다. IIS가 파일 확장자를 기반으로 요청을 거부하면 기록된 오류 코드는 404.7입니다. AllowExtensions 및 DenyExtensions 옵션은 UrlScan과 동일합니다.

예를 들어 ASP 파일을 제외한 모든 형식의 파일을 허용하려는 경우를 가정해 보겠습니다. fileExtensions에 대한 allowUnlisted 옵션을 "true"로 설정한 다음 ASP를 명시적으로 거부하도록 파일 확장자 항목을 정의합니다.

<configuration>
 <system.webServer>
  <security>
   <requestFiltering>
    <fileExtensions allowUnlisted="true" >
     <add fileExtension=".asp" allowed="false"/>
    </fileExtensions>
   </requestFiltering>
  </security>
 </system.webServer>
</configuration>

요청 제한에 따라 필터링

이 필터는 UrlScan에서 이름이 같은 세 가지 기능을 결합합니다.

  • maxAllowedContentLength – 콘텐츠 크기에 대한 상한
  • URL 길이의 maxUrl-상한
  • maxQueryString -쿼리 문자열 길이 상한

IIS가 요청 제한에 따라 요청을 거부하면 기록된 오류 코드는 다음과 같습니다.

  • 콘텐츠가 너무 길면 413.1입니다.
  • URL이 너무 큰 경우 404.14입니다.
  • 쿼리 문자열이 너무 긴 경우 404.15입니다.

예를 들어 회사에서 소스 코드 액세스 권한이 없는 소프트웨어를 구매하는 것은 매우 일반적입니다. 시간이 지남에 따라 해당 코드에서 취약성을 발견할 수 있습니다. 영향을 받는 코드에 대한 업데이트를 가져오는 것은 쉽지 않은 경우가 많습니다. 문제는 URL 또는 쿼리 문자열이 너무 길거나 애플리케이션에 전송된 콘텐츠가 너무 많기 때문에 자주 발생합니다. 안전한 상한을 결정하면 애플리케이션 이진 파일을 패치할 필요 없이 아래 구성을 사용하여 제한을 적용할 수 있습니다.

<configuration>
 <system.webServer>
  <security>
   <requestFiltering>
    <requestLimits
       maxAllowedContentLength="30000000"
       maxUrl="260"
       maxQueryString="25" 
                  />
   </requestFiltering>
  </security>
 </system.webServer>
</configuration>

동사로 필터링

이 기능은 IIS가 요청의 일부로 수락하는 동사 목록을 정의합니다. IIS가 이 기능을 기반으로 요청을 거부하면 기록된 오류 코드는 404.6입니다. 이는 UrlScan의 UseAllowVerbs, AllowVerbs 및 DenyVerbs 옵션에 해당합니다.

예를 들어 동사 GET만 허용하려는 경우를 가정해 보겠습니다. 이를 설정하려면 먼저 allowUnlisted="false" 옵션을 설정하여 동사가 허용되지 않도록 구성을 잠가야 합니다. 다음으로 명시적으로 허용하려는 동사(이 경우 GET)를 나열합니다.

<configuration>
 <system.webServer>
  <security>
   <requestFiltering>
    <verbs
       allowUnlisted="false"
                  >
     <add verb="GET" allowed="true" />
    </verbs>
   </requestFiltering>
  </security>
 </system.webServer>
</configuration>

URL 시퀀스를 기준으로 필터링

이 기능은 IIS가 요청의 일부일 때 거부하는 시퀀스 목록을 정의합니다. IIS가 이 기능에 대한 요청을 거부하면 기록된 오류 코드는 404.5입니다. 이는 UrlScan의 DenyUrlSequences 기능에 해당합니다.

이것은 매우 강력한 기능입니다. 다음 코드를 사용하여 지정된 문자 시퀀스가 IIS에서 제공되지 않도록 방지할 수 있습니다.

<configuration>
 <system.webServer>
  <security>
   <requestFiltering>
    <denyUrlSequences>
     <add sequence=".."/>
    </denyUrlSequences>
   </requestFiltering>
  </security>
 </system.webServer>
</configuration>

이전 예제에서는 '..'입니다. 시퀀스가 거부되었습니다. 업무가 중단된 공급업체에서 애플리케이션을 구입했고 지정된 문자 시퀀스가 전송될 때 애플리케이션이 취약함을 발견했다고 가정해 보겠습니다. 이 기능을 사용하면 애플리케이션의 코드를 패치할 필요 없이 해당 URL 시퀀스를 거부 목록에 추가하기만 하면 해당 애플리케이션을 보호할 수 있습니다.

숨겨진 세그먼트 필터링

이 기능을 사용하면 "예약 가능한" 세그먼트를 정의할 수 있습니다. IIS가 이 기능을 기반으로 요청을 거부하면 기록된 오류 코드는 404.8입니다. 이 기능은 IIS 7 이상의 새로운 기능입니다. UrlScan의 일부가 아닙니다.

서버에 두 개의 URL이 있는 다음 예제를 생각해 보세요.

http://site.com/bin

http://site.com/binary

bin 디렉터리의 콘텐츠는 허용하지 않고 이진 디렉터리의 콘텐츠를 허용하려는 경우를 가정해 보겠습니다. URL 시퀀스를 사용하고 시퀀스 "bin"을 거부하는 경우 두 URL에 대한 액세스를 거부합니다. 아래 표시된 구성을 사용하여 bin에 대한 액세스를 거부할 수 있지만 이진 파일의 콘텐츠는 계속 제공됩니다.

<configuration>
 <system.webServer>
  <security>
   <requestFiltering>
    <hiddenSegments>
     <add segment="BIN"/>
    </hiddenSegments>
   </requestFiltering>
  </security>
 </system.webServer>
</configuration>

IIS 7 이상 오류 코드

이전 버전에서는 전역 수준에서 UrlScan을 사용하여 시스템에 적용하려는 보안 정책을 정의할 수 있습니다. IIS 7 이상을 사용하면 전역 수준뿐만 아니라 URL별로 이러한 정책을 구현할 수 있습니다. 따라서 새 리치 위임 모델이 제공하는 모든 이점을 활용할 수 있습니다.

다음 표는 IIS 로그 오류 코드에 대한 요약입니다.

오류 상태 코드
사이트를 찾을 수 없음 404.1
정책에 의해 거부됨 404.2
마임 맵에 의해 거부됨 404.3
처리기 없음 404.4
요청 필터링: URL 시퀀스가 거부됨 404.5
요청 필터링: 동사가 거부됨 404.6
요청 필터링: 파일 확장명은 거부되었습니다. 404.7
요청 필터링: 숨겨진 세그먼트에 의해 거부됨 404.8
숨겨진 파일 특성이 설정되었으므로 거부됨 404.9
요청 필터링: URL이 두 배로 이스케이프되었기 때문에 거부됨 404.11
요청 필터링: 높은 비트 문자로 인해 거부됨 404.12
요청 필터링: URL이 너무 길어서 거부됨 404.14
요청 필터링: 쿼리 문자열이 너무 길기 때문에 거부됨 404.15
요청 필터링: 콘텐츠 길이가 너무 커서 거부됨 413.1
요청 필터링: 요청 헤더가 너무 길어서 거부됨 431