微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何对该托管在 IIS 中的服务执行路径遍历攻击?

如何解决如何对该托管在 IIS 中的服务执行路径遍历攻击?

背景

我正在尝试对 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,这意味着它永远不会命中我的 API。换句话说,它尝试命中以下端点:

GET http://localhost/secret.txt

我为 ..\ 字符序列尝试了各种不同的编码,但没有成功。

问题

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

解决方法

似乎有几件事阻止了我的路径遍历攻击。我能够通过 (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 响应响应我的攻击:

请求过滤模块配置为拒绝包含双转义序列的请求。

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

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

UrlRoutingModule

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

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

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

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

结论

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

,

这在 IIS 内核级别被阻止。

以下是相关文字:

不安全:

由于多种原因,字符可能不安全。空格符 不安全,因为重要的空间可能会消失且无关紧要 转录或排版 URL 时可能会引入空格或 受到文字处理程序的处理。那些角色 "" 是不安全的,因为它们被用作周围的分隔符 自由文本中的 URL;引号 (""") 用于分隔 URL 一些系统。字符“#”是不安全的,应该总是被编码 因为它在万维网和其他系统中用于分隔 来自可能跟随它的片段/锚标识符的 URL。这 字符“%”是不安全的,因为它用于其他 人物。其他字符是不安全的,因为网关和其他 众所周知,传输代理有时会修改这些字符。这些 字符为“{”、“}”、“|”、“\”、“^”、“~”、“[”、“]”和“`”。

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

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

这个link中有一个类似的问题。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。