1

背景

我正在尝试对 IIS 中托管的易受攻击的服务执行路径遍历攻击。

服务是这样的:

GET /api/download/{file-name}

底层代码是这样的:

return File.Read("some/directory/" + fileName);

如前所述,这项服务显然是易受攻击的。

红隼攻击

我可以在本地运行时执行路径遍历攻击dotnet run,我收集到使用 Kestrel Web 服务器。我的攻击载荷是..\..\secret.txt,它在日志中被编码并且可见:

Request starting HTTP/1.1 GET http://localhost/api/download/..%5C..%5Csecret.txt

IIS 攻击

当托管在 IIS 中时,我无法在同一个应用程序上重现这种攻击。似乎 IIS 通过解释 URI 以某种方式规范化了 URI ..\,这意味着它永远不会访问我的 API。换句话说,它试图达到以下端点:

GET http://localhost/secret.txt

我已经为字符序列尝试了各种不同的编码..\,但没有运气。

问题

如何解决此 IIS 行为以对托管在 IIS 中的这个易受攻击的应用程序执行路径遍历攻击?

4

2 回答 2

1

似乎有几件事阻止了我的路径遍历攻击。我能够通过 (1) 对有效负载进行双重编码和 (2) 删除或破坏 IIS 中的 RequestFilteringModule 和 UrlRoutingModule 模块来执行路径遍历攻击。如果这些模块中的任何一个存在且完全启用,我将无法重现攻击。

编码

首先,我必须\在我的攻击载荷中对字符进行编码。

当我简单地进行一次 URL 编码时,IIS(我假设)会标准化 URI,正如我之前观察到的:

  • 在浏览器中观察到的请求:http://localhost/api/download/..%5C..%5Csecret.txt
  • IIS 中的 URI 登录服务器:http://localhost/secret.txt

当我执行两次编码时,我的有效负载确实可以通过 IIS:

  • 在浏览器中观察到的请求:http://localhost/api/download/..%255c..%255csecret.txt
  • IIS 中的 URI 登录服务器:http://localhost/api/download/..%5C..%5Csecret.txt

请求过滤模块

RequestFilteringModule 模块以 404 响应响应我的攻击:

请求过滤模块用于拒绝包含双转义序列的请求。

我们可以通过删除模块或在IIS中设置allowDoubleEscaping标志来禁用此功能:web.config

<system.webServer>
  <security>
    <requestFiltering allowDoubleEscaping="true" />
  </security>
</system.webServer>

网址路由模块

UrlRoutingModule 模块以 400 响应响应我的攻击:

检测到来自客户端 (%) 的潜在危险 Request.Path 值。

我们可以通过删除模块或修改以下requestPathInvalidCharacters设置来禁用此功能web.config

<system.web>
  <httpRuntime requestPathInvalidCharacters="" />
</system.web>

结论

有问题的代码显然是易受攻击的,应该修复。也就是说,在 IIS 中使用 RequestFilteringModule 或 UrlRoutingModule 模块之一似乎确实有效地防止了我的路径遍历攻击,前提是这些模块是完全启用的。

于 2021-01-12T21:10:16.583 回答
0

这在 IIS 内核级别被阻止。

以下是相关文字:

不安全:

由于多种原因,字符可能不安全。空格字符是不安全的,因为当 URL 被转录或排版或经受文字处理程序的处理时,重要的空格可能会消失,并且可能会引入无关紧要的空格。字符“<”和“>”是不安全的,因为它们被用作自由文本中 URL 的分隔符;在某些系统中,引号 (""") 用于分隔 URL。字符 "#" 是不安全的,应始终进行编码,因为它在万维网和其他系统中用于将 URL 与片段/锚定分隔开可能跟随它的标识符。字符“%”是不安全的,因为它用于其他字符的编码。其他字符是不安全的,因为已知网关和其他传输代理有时会修改这些字符。这些字符是“{”、“}”、“|”、“\”、“^”、“~”、“[”、“]”和“`”。

所有不安全的字符必须始终在 URL 中进行编码。例如,即使在通常不处理片段或锚标识符的系统中,字符“#”也必须在 URL 中编码,因此如果将 URL 复制到另一个使用它们的系统中,则无需更改网址编码。

因此,IIS 在核心级别主动阻止了这种情况,这是一种主动安全措施,可以最大限度地减少其攻击面。

此链接中有一个类似的问题。

于 2021-01-12T02:38:46.137 回答