我有几个可公开访问的 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...
:
设置默认访问权限Deny
,然后Action Type
Abort
这样就不会向客户端发送任何响应。您也可以选择发送 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 或任何其他错误)。
- 如果您不需要,请关闭此网站。