如何解决如何对该托管在 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 举报,一经查实,本站将立刻删除。