Asp.Net Web API 如何拦截404页面显示的URL注入恶意文本
漏洞根因
该隐患属于反射型文本注入:ASP.NET Web API默认渲染的404错误页面,会将攻击者在URL路径中插入的任意文本未经转义、无过滤地嵌入到错误页面HTML中。攻击者可构造带钓鱼诱导文案的恶意URL,让用户打开链接后,在官方域名下的404页面直接看到钓鱼提示,实现诱导点击、钓鱼攻击。
修复方案
所有修复逻辑的核心是从根源切断“请求URL中的任意文本被输出到错误页面”的链路,无需依赖基于GUID的错误消息机制即可完全消除风险,可根据Web API的运行框架选择对应实现。
.NET Core / .NET 5+ 框架下的Web API修复
- 生产环境强制关闭默认开发者异常页:在
Program.cs配置管道时,仅在开发环境启用UseDeveloperExceptionPage(),生产环境移除该中间件——该中间件会直接将完整请求路径、查询参数无过滤地展示在错误页面,是漏洞的核心触发源。 - 自定义统一404兜底逻辑,完全替换默认错误响应:在请求管道最前端(所有路由映射逻辑之前)添加全局中间件,对所有未匹配路由返回404状态码的请求,统一返回固定内容的响应,全程不读取、不拼接请求路径中的动态文本。
示例代码:app.Use(async (context, next) => { await next(); // 拦截所有返回404的请求 if (context.Response.StatusCode == StatusCodes.Status404) { context.Response.ContentType = "text/html; charset=utf-8"; // 响应内容完全写死,不包含任何请求动态字段 await context.Response.WriteAsync(""" <html> <body> <h1>404 资源不存在</h1> <p>请返回首页重新访问目标资源</p> </body> </html> """); } }); app.MapControllers(); // 保留原有路由映射逻辑 - 新增路由白名单校验:对所有API接口的路由路径做格式约束,仅允许字母、数字、短横线等合法URL字符出现在路径段中,凡是路径包含HTML特殊字符、不符合路由规范的请求,直接在路由匹配阶段拦截返回400错误,不进入后续错误页渲染流程。
.NET Framework 经典Web API(System.Web.Http)修复
- 替换系统默认错误页配置:在
Web.config中配置自定义错误规则,禁用系统默认的包含请求URL的404页面,所有404请求统一跳转到自定义的错误处理页面。
配置示例:<system.web> <customErrors mode="On" defaultRedirect="~/Error/404" redirectMode="ResponseRewrite"> <error statusCode="404" redirect="~/Error/404" /> </customErrors> </system.web> <system.webServer> <httpErrors errorMode="Custom" existingResponse="Replace"> <remove statusCode="404" /> <error statusCode="404" path="/Error/404" responseMode="ExecuteURL" /> </httpErrors> </system.webServer> - 实现独立的404错误处理Action:错误页的响应内容完全固定,禁止将当前请求的路径、查询字符串等动态内容拼接到响应HTML中,从根源上避免攻击者注入的文本被渲染到页面上。
- 新增全局请求校验:通过Web API全局消息处理器,对传入的请求URL做格式校验,凡是路径中包含
<、>、引号等HTML特殊字符的请求,直接返回400状态码拒绝处理,不进入后续流程。
效果验证
修复完成后,构造包含任意文本、甚至HTML标签的恶意URL发起请求,检查返回的404页面:确认页面内容完全固定,不存在任何与你构造的请求路径相关的展示内容,即代表漏洞已完全修复。
内容的提问来源于stack exchange,提问作者Sushant Rawat
相关产品推荐
相关产品推荐

