在 IIS 中隐式允许来自有效主机名的请求

在 IIS 中隐式允许来自有效主机名的请求

我有几个可公开访问的 IIS 服务器和站点(个人和公司),这些主机有自己的域/子域,并且所有对这些 https 站点的合法访问都是通过域进行的。

几乎所有来自机器人/rooted服务器的HTTP应用程序漏洞扫描都是通过IP对服务器进行的,没有有效的主机名,如果有主机名,它是默认的反向DNS主机,而不是站点的实际域。

IIS 中是否有办法隐式地仅允许具有正确主机名的请求?站点根应用程序仅与主机名绑定,但 IIS 仍接受请求并以 404 响应。最好的办法是使请求超时,就像站点没有打开 HTTP 一样。

我当然明白这并不能保证任何安全,扫描仪仍然可以通过多种方式找出正确的主机名,但它仍然可以过滤掉 90% 的虚拟扫描。

防火墙中的 IPS 可能可以做一些事情,但在某些情况下我没有那么奢侈。 IIS 中有办法吗?将 http 请求重定向到 oblivion?(这可能只会将错误更改为代理网关 http 错误?)

答案1

我不认为有一个全局设置可以禁止任何具有“有效”主机名的请求,但你可以尝试以下操作

在您的 IIS 服务器上创建一个新的后备站点,而所有其他站点都需要主机名,该站点绑定到所有未分配的 IP 地址而没有任何主机名。

因此,任何没有绑定主机名的 http 请求最终都会到达这个只有简单静态 html 页面的站点。

对于此站点,编辑IP Address and Domain Restrictions,不要添加新条目,只需转到Edit Feature Settings...

IIS IP 限制

设置默认访问权限Deny,然后Action TypeAbort

这样就不会向客户端发送任何响应。您也可以选择发送 401、403 或 404,但如果您希望没有响应,请使用Abort

可能还有其他方法可以实现这一点,但是这个方法应该效果很好。

答案2

您可以创建一个IHttpModule来检查这一点。

注册模块

<system.webServer>
   <modules runAllManagedModulesForAllRequests="true">
      <add name="MyModuleToBlockRequestsWithoutSNI" type="NoSniBlockerModule" />
   </modules>
</system.webServer>

在初始化期间挂接事件

public class NoSniBlockerModule: IHttpModule
{
   public void Init(HttpApplication httpApplication)
   {
      // Register event handlers
      httpApplication.BeginRequest += OnApplicationBeginRequest;
   }
}

检查 SNI

private void OnApplicationBeginRequest(object sender, EventArgs e)
{
   var request = HttpContext.Current.Request;

   if (!SniPresentInRequestHeader(request))
   {
      // return the standard 400 Bad Request
      context.Response.StatusCode = 400;
      context.Response.StatusDescription = "You're missing the SNI wtf";
      context.Response.End();
      return;
   }
  

答案3

IIS 的设计要求将传入的 HTTP 请求分派到包含匹配绑定的站点。更多详细信息请参阅以下帖子:。因此在 IIS 中没有办法隐式地只允许具有正确主机名的请求,而是明确地允许。

如果“IIS 仍然接受请求,但响应 404”,则意味着此服务器上的某个站点仍然符合这些请求,您应该首先找到该站点,然后从以下选项中进行选择:

  • 通过修改其绑定来禁止此站点处理此类请求。
  • 使用 URL Rewrite 模块中止此类请求或返回自定义错误(404 或任何其他错误)。
  • 如果您不需要,请关闭此网站。

相关内容