繁体   English   中英

如何安全地获取正在运行的ASP.NET站点的域名

[英]How do I securely get the domain name of the running ASP.NET site

我在HTTP事务中遇到了欺骗Host值的一些问题。 为了关闭与这些类型的攻击相关的安全漏洞,我需要安全地检测正在运行的ASP.NET站点的域。 不幸的是, 我发现的所有引用都建议您使用Request.ServerVariables["HTTP_HOST"]Request.Url.Host 通过提交无效的HTTP数据包,我能够设置无效的主机值,并观察它们在两个函数调用中引起的行为。 我看到的行为是不同的取决于我使用的.NET环境的类型。

在IIS 6中,无论我是直接在MVC Controller操作中访问请求,还是在需要我通过HttpContext.Current.Request访问值的位置,注入的值总是显示出来。

在Visual Studio 2012 ASP.Net开发服务器中,我只看到我们通过NuGet包部署到项目的库代码中的注入值。 在NuGet包中,我必须使用HttpContext.Current因为代码在Web应用程序范围之外运行。 当我保持在Web应用程序命名空间的范围内时,即使我必须调用HttpContext.Current ,它也会提供正确的非默认值。

对于所有这些测试,我一直在使用ASP.NET 4.0。 ASP.NET 4.5和IIS 8中是否更改了此行为? 有没有办法安全地获取域名? 也可以对PHP进行相同的攻击 ,但Apache有一种方法可以防止这些类型的攻击 IIS?

我遇到问题的代码示例:

string siteName1 = HttpContext.Current.Request.ServerVariables["HTTP_HOST"];
string siteName2 = HttpContext.Current.Request.Url.Host;

无效HTTP数据包的示例:

GET:  https://sampledomain.com/Items/Index
Host: fakedomain
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:19.0) Gecko/20100101 Firefox/19.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Connection: keep-alive
Cache-Control: max-age=0

我已经使用Firefox扩展Live HTTP标头进行了测试,这使我能够快速记录并重放我对Web服务器的请求。

在IIS中,您可以设置站点的绑定,以便它只获取与特定主机头值匹配的请求。

这样,如果有人试图欺骗主机标头值,您的网站甚至不会看到请求。

不完全是您的问题的答案,但可能是您的问题的解决方案。

目前还不清楚“安全”是什么意思,但主机标题的整个要点是允许浏览器指定它打算与之交谈的主机。

RFC 2616Request-URIHost头有几点要说:

为了允许在将来的HTTP版本中的所有请求中转换为absoluteURI ,所有HTTP / 1.1服务器必须接受请求中的absoluteURI表单,即使HTTP / 1.1客户端只会在对代理的请求中生成它们。

...

Request-URI的最常见形式是用于标识源服务器或网关上的资源。 在这种情况下,URI的绝对路径必须作为Request-URI传输(参见第3.2.1节, abs_path ),并且URI(权限)的网络位置必须在Host头字段中传输。

...

  1. 如果Request-URIabsoluteURI ,则主机是Request-URI 必须忽略请求中的任何Host头字段值。

...

Host字段值必须表示原始URL给出的源服务器或网关的命名权限。 这允许源服务器或网关区分内部不明确的URL,例如单个IP地址上的多个主机名的服务器的根“/”URL。

...

客户端必须在所有HTTP / 1.1请求消息中包含Host头字段。 如果请求的URI不包含所请求服务的Internet主机名,则必须为Host头字段指定一个空值。

...

客户端和服务器支持Host请求标头的要求,如果HTTP / 1.1请求中缺少Host请求标头(第14.23节),并且接受绝对URI(第5.1.2节),则报告错误是最重要的本规范定义的更改。

...

  • 客户端和服务器都必须支持Host请求标头。
  • 发送HTTP / 1.1请求的客户端必须发送Host头。
  • 如果HTTP / 1.1请求不包含Host请求标头,服务器必须报告400(错误请求)错误。
  • 服务器必须接受绝对URI。

总之,符合HTTP的客户端无法发送请求

GET https://example.com/ HTTP/1.1
Host: fakedomain.invalid

到原始服务器,一个HTTP / 1.1服务器被要求接受它,使用example.com作为主机,和“忽略”的Host首部。 Request.Url.Host绝对应该是example.com ; 如果不是,它是IIS中的一个错误。 我不太确定Request.ServerVariables["HTTP_HOST"] ,但是对“忽略”主机头的合理解释是将其重写为example.com

(顺便提一下,我刚刚测试过的另外两个服务器也没有遵循规范:Apache 2.4.3假设对absoluteURI的请求必须是一个代理并且在此基础上拒绝它,而lighttpd 1.4.28允许GET http://example.com/ HTTP/1.1没有Host标头的情况下GET http://example.com/ HTTP/1.1 。)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM