为啥使用包含冒号的 URL 被视为“潜在危险请求”?

Posted

技术标签:

【中文标题】为啥使用包含冒号的 URL 被视为“潜在危险请求”?【英文标题】:Why is using a URL containing a colon considered as a "potentially dangerous request"?为什么使用包含冒号的 URL 被视为“潜在危险请求”? 【发布时间】:2011-03-21 12:34:27 【问题描述】:

有人(可能是机器人)向我的 ASP.NET 4.0 Web 表单应用程序(在 IIS 7.0 上运行)发送了一个带有以下 URL 的请求:

http://ipaddress-of-my-applications-domain/bla1.bla2.bla3.bla4.bla5:)

这导致了System.Web.HttpException。我收到了一封来自我已配置的 ASP.NET HealthMonitoring 的日志记录电子邮件,告诉我:

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

堆栈跟踪是:

System.Web.HttpRequest.ValidateInputIfRequiredByConfig()
System.Web.HttpApplication.PipelineStepManager.ValidateHelper(HttpContext context)

为什么 URL 中的冒号“有潜在危险”?使用这样的 URL 可以做哪些危险的事情?这里有我不知道的安全漏洞吗?

提前感谢您的解释!

编辑

我已经测试了查询字符串中的冒号(如http://mydomain.com?Test=9:))不会导致此异常。

【问题讨论】:

查看这个问题 - ***.com/questions/2053132/… - 我不认为它是重复的,但确实讨论了 URL 中的冒号 URL Encoding 上的此页面列出了保留字符表中的冒号,但没有解释它的用途。 感谢您的链接!但是这个问题似乎更多地讨论了冒号对于 URL 编码是否“安全”。我遇到的 ASP.NET 异常听起来更像是存在安全威胁。 我同意,但是该问题的答案中的任何链接有帮助吗? 我检查了一些,他们没有帮助。其他一些(RFC ......那些)我老实说现在跳过了 - 在查看了相当小的垂直滚动条之后。我希望这里有人能用几句话给出答案。 【参考方案1】:

在 NTFS 上,给定的文件路径可以有多个关联的数据流。除了主流,也称为$DATA,还有其他流,通常用于在下载的文件中存储元数据,如 Internet 区域标记。

Alternate Data Streams 使用冒号分隔符访问,例如。 file.dat:$DATAfile.dat 的另一种说法。 ADS 通过 web 的存在在过去给微软带来了一些安全问题(例如,返回 ASP 页面的源代码而不是执行它们),因此作为预防措施,他们阻止在路径部分使用冒号URL,因为路径部分通常映射到文件系统(尽管在您的情况下不是)。这不太可能从查询字符串中发生,因此不会在那里被阻止。

这远不是请求验证会产生的最糟糕的误报。它的抗注入特性要差得多。我个人总是会禁用它,因为它是一个愚蠢的破坏功能,永远不会真正使您的 webapp 安全;只有适当注意字符串转义(以及对您计划用作文件名的任何内容进行严格清理)才能做到这一点。

还有其他字符,即使您关闭请求验证,您也无法将路径部分放入用于路由目的。特别是斜杠(%2F%5C 和无效的超长 UTF-8 序列解析为相同的字节序列)和零字节。一般来说,最好对路径中的内容保持保守。

【讨论】:

这是 NT4 上的实际漏洞,例如securityfocus.com/bid/149/discuss 谢谢,很好的解释!因此,这种带有冒号的安全检查和风险是 MS-Windows 特有的。关于关闭 ASP.NET 请求验证的建议的注释:我已经逐页完成(对于应用程序中的许多页面)并手动进行了适当的检查和编码。但老实说:您的回答说服了我最好不要在全球范围内关闭它,因为您描述的安全风险对我来说似乎很复杂,而且我以前从未听说过。内置的请求验证还会检查哪些其他危险?如果我把它关掉,我就必须知道所有这些风险并提供我自己的措施。 如果您将值bla1.bla2.bla3.bla4.bla5:) 仅用作路由参数而不用作实际文件名,则不存在漏洞。 (在 Windows 上清理用户输入以用作文件名确实是一项艰巨的任务,涉及的不仅仅是这个问题。通常避免使用用户提供的文件名内容。)不要相信任何事情的请求验证,它不并且在一般情况下无法保护您免受漏洞的影响,并且阻止完全有效的输入。【参考方案2】:

我记不太清了,但 Internet Explorer 与操作系统相关联,它能够执行一些坏事,例如“con:sss”能够打开控制台并执行一些批处理命令等,冒号之前的任何内容都被视为协议和 windows 允许您覆盖/创建可以由您的 dll 打开和使用的新协议。任何对 com 和 url monikers 有更丰富经验的人都可以给你非常正确的答案。

【讨论】:

【参考方案3】:

这是由于 ASP.NET 的请求验证功能,它可以防止客户端攻击您的网站。该功能默认启用。

下面的链接解释得更好:http://www.asp.net/learn/whitepapers/request-validation

【讨论】:

为什么 URL 中的冒号是“注入攻击”?我知道请求验证功能,但到目前为止仅在提交包含 对不起,不是。我已经改写了。但是,它确实存在安全漏洞。【参考方案4】:

对于与此处的流程不一致,我提前道歉,但我看不出编码“:”应该如何防止注入攻击。

原始海报受到网络服务器软件的保护,不受“:”的影响,而不是受到 HTTP 协议的保护。

必须对 URL 进行解码才能对网站应用程序有用。那么,如果网站在使用 URL 之前无论如何都要对 URL 进行解码,那么编码“:”如何更安全?

【讨论】:

以上是关于为啥使用包含冒号的 URL 被视为“潜在危险请求”?的主要内容,如果未能解决你的问题,请参考以下文章

使用 Hibernate 查询:冒号被视为参数/转义冒号

为啥 http:///example.org(带有三斜杠)被 Firefox 和 webkit 视为有效 URL?

为啥 CORS 标头不被视为 XHR 调用的一部分?

为啥基于表单的身份验证不被视为 RESTful?

在 apache windows 上禁止访问包含冒号“:”的 url

为啥下面两个字符串之一被视为 JSON 数组而另一个被视为字符串? Python