ASP.NET WebForms 4.x跨服务器URL型XSS注入差异问题排查
以下是你可能遗漏的关键配置项,针对Windows Server 2019与2012的差异:
强制启用ASP.NET请求验证
Windows Server 2019的.NET Framework默认请求验证范围可能更窄,需在web.config明确配置全局验证:<system.web> <httpRuntime requestValidationMode="4.5" /> <pages validateRequest="true" /> </system.web>requestValidationMode="4.5"会让验证覆盖所有HTTP请求(包括URL路径),而非仅页面POST请求。若需对个别页面关闭验证,用[ValidateInput(false)]特性单独处理,不要全局禁用。检查IIS UrlScan模块
Windows Server 2012默认可能预装并启用了UrlScan模块,它会自动拦截含恶意脚本的URL。2019服务器大概率未默认安装:- 打开IIS管理器,查看服务器节点的「模块」列表,确认是否存在UrlScan
- 若缺失,安装IIS的UrlScan组件,然后修改
%WINDIR%\System32\inetsrv\urlscan\UrlScan.ini:- 设置
AllowHighBitCharacters=0 - 确保
EnableScanRules=1,开启恶意字符拦截规则
- 设置
强化页面级防护配置
检查web.config里的页面和视图状态防护设置,确保启用完整验证:<system.web> <pages viewStateEncryptionMode="Always" enableEventValidation="true" validateRequest="true" /> <machineKey validation="SHA256" validationKey="AutoGenerate,IsolateApps" /> </system.web>enableEventValidation="true"可防范伪造请求,视图状态加密避免恶意篡改。同时确认所有页面的<%@ Page %>指令未单独设置ValidateRequest="false"。配置IIS请求筛选规则
通过IIS请求筛选直接拦截URL中的XSS特征字符串:
在web.config添加如下配置:<system.webServer> <security> <requestFiltering> <filteringRules> <filteringRule name="XSS拦截规则" scanUrl="true" scanQueryString="true"> <appliesTo> <add fileExtension="*" /> </appliesTo> <denyStrings> <add string="onerror=" /> <add string="alert(" /> </denyStrings> </filteringRule> </filteringRules> </requestFiltering> </security> </system.webServer>也可直接在IIS管理器的「请求筛选」面板可视化添加规则。
对齐.NET Framework版本
确认Windows Server 2019上安装的.NET Framework小版本与2012完全一致(比如同为4.7.2或4.8),不同小版本的请求验证逻辑可能存在细微差异,版本统一能消除这类差异。
内容的提问来源于stack exchange,提问作者Martin Robins

