应用笔记 · 2025年11月26日

.Net Core web项目“检测到URL存在 http host 头攻击漏洞”的修复及验证

基于.Net 6.0的SSO认证小应用,交付后进行web安全扫描,提示“检测到URL存在 http host 头攻击漏洞”,验证过程:

Chrome浏览器安装ModHeader插件,启用插件后,在ModHeader中添加Host  abcdexxx.com,此时刷新目标网址,如果能正常显示或试图跳转至abcdexxx.com ,则证明漏洞存在。修复后应提示400 host invalid,无法正常访问。

ModHeader插件下载modheader_idgpnmonknjnojddfkpgkljpfnnfcklj

以下是修复过程:

✅ Host Header Attack 是什么?

攻击者通过伪造 Host: 请求头,使应用产生错误行为,例如:

  • 伪造生成带恶意域名的回调 URL

  • 绕过某些基于 Host 判断的逻辑

  • 触发开放重定向等漏洞

IIS 默认不会严格验证 Host,所以 ASP.NET Core 应用必须自己限制可信 Host。


🚀 ASP.NET Core 官方推荐做法:使用 Host Filtering Middleware

ASP.NET Core 自带 Microsoft.AspNetCore.HostFiltering 中间件,可以 限制允许访问的 Host 列表

1)在 appsettings.json 添加允许的 Host

{
"AllowedHosts": "www.yourdomain.com;yourdomain.com;localhost"
}

⚠️ 必须列出所有可能访问的 Host
例如:

  • 不带 www

  • 带 www

  • 内网 IP(如有需要)

  • HTTPS 端口如使用 5001 这种自定义端口要标明:yourdomain.com:5001


2)在 Program.cs / Startup.cs 启用 Host Filtering

.NET 6+(Program.cs)

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddControllers();

// 启用 Host Filtering
builder.Services.AddHostFiltering(options =>
{
// 自动从 AllowedHosts 加载
});

var app = builder.Build();

app.UseHostFiltering();

app.UseRouting();
app.UseAuthorization();
app.MapControllers();
app.Run();

若使用 Startup.cs

public void ConfigureServices(IServiceCollection services)
{
services.AddControllers();
services.AddHostFiltering();
}
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
app.UseHostFiltering();
app.UseRouting();
app.UseAuthorization();
app.UseEndpoints(endpoints =>
{
endpoints.MapControllers();
});
}


✋ 中间件会做什么?

当请求头中 Host: 不在 AllowedHosts 内:

  • ASP.NET Core 返回 400 Bad Request

  • 阻止进一步处理请求
    → 有效修补 Host Header Attack


🔒 IIS 额外加固(可选)

1)限制操作系统级别的 Host 绑定(强烈推荐)

在 IIS 网站绑定中:

例如:

Type Host Name Port
https www.yourdomain.com 443
https yourdomain.com 443

这样 IIS 只接受你允许的 Host。


🛡 额外防护:阻止 X-Forwarded-Host 注入(若使用反向代理)

如果你在前面使用 Nginx / Apache / Load Balancer
请开启 Host Forwarding Strict 模式:

app.UseForwardedHeaders(new ForwardedHeadersOptions
{
ForwardedHeaders = ForwardedHeaders.XForwardedHost,
AllowedHosts = { "yourdomain.com", "www.yourdomain.com" }
});

✔ 完整修补步骤总结