4

我想example.com/page/../other-page在我的 IIS 网站中禁用目录遍历(甚至是真实页面)。我已经尝试使用自定义响应进行请求过滤和 URL 重写。

denyUrlSequences请求过滤部分的 Microsoft 文档实际上..用作示例

以下示例Web.config文件将拒绝访问三个 URL 序列。第一个序列防止目录遍历,[...]

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

……但它不起作用;在拒绝规则运行之前example.com/page/../other-page已经成为。您可以通过为和访问example.com/other-page设置拒绝规则来证明这一点。规范化的路径被规则阻止,但它不会在原始状态下匹配。page/subexample.com/page/./sub-page

我已经在 IIS v7.5 和 v10 上对此进行了测试,我想它也存在于每个中间版本中。

  1. 什么是规范化?(可能是这个图书馆?)
  2. 它什么时候发生在请求生命周期中?
  3. 如何在不打开一些安全漏洞的情况下成功阻止以下序列?.., ./, 和//

Internet 搜索只想告诉我旧版本 IIS 中的一个大约 2000 年的漏洞,或者如何启用带有点的 MVC 路由。

调试说明:如果您用于curl测试此行为,请确保添加该--path-as-is选项,因此它不会在客户端进行规范化。一些浏览器似乎也在进行客户端规范化。
使用说明:我名义上是试图关闭,example.com/clubs-baby-seals/../about-us以免有人将链接的成功加载作为对封印虐待的认可。

4

2 回答 2

1

可能是任何人在改变它,从浏览器到最终的 HTTP.sys 或 IIS。重要的一点是用户是否有权访问他们最终获得的资源。如果用户已经可以访问,那么就没有安全漏洞,因为他们也可以在浏览器中输入标准化的最终地址。使用 '..' 点并不会显示任何额外的信息,而不是他们已经拥有的信息。

另一方面,如果您真的想知道谁更改了路径,我会亲自进行一些网络跟踪以及 FREB 日志记录,以查看每个阶段会发生什么。我不知道答案很容易。

于 2019-05-24T18:27:39.947 回答
0

虽然我不知道 (1) 和 (2) 的具体答案,但事实证明 (3) 原始预规范化 URI 路径在UNENCODED_URL服务器变量中可用。这使得可以针对它运行 URL 重写规则:

<rule name="Block directory traversal attempts" stopProcessing="true">
    <match url="(.*)" />
    <conditions logicalGrouping="MatchAny" trackAllCaptures="false">
        <add input="{UNENCODED_URL}" pattern="\.\." />
        <add input="{UNENCODED_URL}" pattern="\./" />
        <add input="{UNENCODED_URL}" pattern="//" />
    </conditions>
    <action type="CustomResponse" statusCode="404"
            statusReason="Not Found" statusDescription="Page not found" />
</rule>
于 2019-05-31T14:54:04.183 回答