有人(可能是机器人)向我的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可以做些什么危险的事情?我在这里有任何安全漏洞我不知道吗?
感谢提前解释!
修改
我已经测试过查询字符串中的冒号(如http://mydomain.com?Test=9:)
)不会导致此异常。
答案 0 :(得分:20)
在NTFS上,给定的文件路径可以有多个关联的数据流。除了主流(也称为$DATA
)之外,还可以有其他流,通常用于存储下载文件中的Internet区域标记等元数据。
Alternate Data Streams,例如。 file.dat:$DATA
是另一种说file.dat
的方式。 ADS通过网络的存在导致了微软过去的一些安全问题(例如,返回ASP页面的源代码而不是执行它们),所以作为预防措施,他们阻止在路径部分使用冒号。 URL,因为路径部分经常映射到文件系统(虽然不是你的情况)。这不太可能从查询字符串中发生,因此不会在那里被阻止。
这远远不是最严重的误报率请求验证将产生的。它的抗注射功能更糟糕。我个人总是会禁用它,因为它是一个愚蠢的破坏功能,永远不会让你的webapp安全;只有适当注意字符串转义(以及你计划用作文件名的任何东西的重度消毒)才能做到这一点。
还有其他字符,即使您关闭请求验证,也无法将路径部分放入路由部分。特别是,斜杠(%2F
,%5C
和字节序列,它们将解析相同的UTF-8序列无效)和零字节。最好保守一般的路径。
答案 1 :(得分:1)
我完全不记得,但Internet Explorer与操作系统联系在一起,它能够执行一些不好的事情,比如“con:sss”能够打开控制台并执行一些批处理命令等,冒号之前的任何事情都被认为是协议和Windows允许您覆盖/创建可由您的dll打开和使用的新协议。任何对com和url monikers有更多经验的人都可以给你非常正确的答案。
答案 2 :(得分:0)
这是由于ASP.NET的请求验证功能,它可以防止客户端攻击您的网站。默认情况下启用该功能。
以下链接更好地解释了:http://www.asp.net/learn/whitepapers/request-validation
答案 3 :(得分:0)
我为与此处的流程不一致而提前表示歉意,但我看不到编码“:”如何防止注入攻击。
原始海报通过Web服务器软件(而不是HTTP协议)保护不受“:”保护。
必须对URL进行解码才能对网站应用程序有用。那么,如果网站打算在使用URL之前对其进行解码,那么如何更安全地编码“:”呢?