我遇到了一些在 HTTP 事务中欺骗 Host 值的问题。为了关闭与这些类型的攻击相关的安全漏洞,我需要安全地检测正在运行的 ASP.NET 站点的域。不幸的是,我找到的所有参考资料都建议您使用Request.ServerVariables["HTTP_HOST"]
or Request.Url.Host
。通过提交无效的 HTTP 数据包,我能够设置无效的主机值并观察它们在两个函数调用中导致的行为。我看到的行为因我使用的 .NET 环境类型而异。
在 IIS 6 中,无论我是直接在 MVC 控制器操作中访问请求,还是在需要我通过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 服务器的请求。