Windows服务器上,IIS的安全防护是运维工作的核心,其中请求过滤与URL重写是抵御SQL注入、跨站脚本等攻击的两道关键防线。许多安全事件并非源于高深漏洞,而是基础过滤与重写规则配置不当。本文将直接深入,详解如何通过IIS的“请求筛选”功能和“URL重写”模块,构建主动防御体系,有效拦截恶意注入与非法访问。

理解IIS请求筛选:第一道主动防御门

IIS自带的“请求筛选”模块是一个常被低估的武器。它工作在请求处理的初期,能够基于URL、HTTP动词、查询字符串、请求头等多个维度进行拦截。对于防注入,关键在于对“查询字符串”和“请求头”中的可疑字符进行过滤。默认配置较为宽松,你需要主动强化规则。打开IIS管理器,选中站点或服务器节点,双击“请求筛选”图标,切换到“查询字符串”选项卡。在这里,你可以添加拒绝规则,例如,拒绝包含单引号(‘)、分号(;)、连字符(--)等SQL注入常见字符的请求。但需谨慎,避免误杀正常请求,例如某些内容可能合法包含单引号。

自定义拒绝规则:精准拦截恶意字符串

更精准的做法是定义特定的恶意字符串模式。例如,在“拒绝字符串序列”中,你可以添加“xp_”、“exec”、“script”、“alert(”等典型的SQL关键字或XSS攻击载荷片段。同时,务必在“HTTP请求头”选项卡中设置合理的“最大允许内容长度”,以防止缓冲区溢出攻击。一个关键的实践是,不要仅依赖默认的“.NET请求验证”,它主要防XSS,对SQL注入的防护不足。请求筛选作为前置关卡,能大幅减轻后端应用的处理压力,将大量明显的攻击流量直接拒之门外,并记录在IIS日志中供分析。

URL重写模块:动态请求的规则引擎

如果说请求筛选是静态过滤器,那么“URL重写”模块就是功能强大的规则引擎。它不仅能实现友好的URL,更是安全防护的利器。通过分析入站请求的URL、查询参数、请求头等信息,可以编写规则来重写、重定向或直接中止可疑请求。其核心优势在于支持正则表达式,能定义极其复杂的匹配模式。例如,你可以编写一条规则,当检测到URL或查询字符串中出现“union select”、“sleep(”、“<script>”等模式时,直接返回403禁止访问或404错误,甚至将其重定向到一个监控页面。

构建防注入重写规则:实战示例

以下是使用URL重写模块创建一条简单防SQL注入规则的示例。在IIS中安装URL重写模块后,选中站点,进入URL重写功能,点击“添加规则”,选择“空白规则”。

名称:BlockCommonSQLInjection
匹配URL:
    请求URL:与模式匹配
    使用:正则表达式
    模式:(?i)(\b(union|select|insert|update|delete|drop|exec|xp_|declare|sleep|benchmark)\b|(\-\-)|(\/\*))
条件:
    添加 -> 条件输入:{QUERY_STRING}
        检查输入字符串是否:与模式匹配
        模式:同上方的正则表达式模式
        使用:正则表达式
    逻辑分组:全部匹配
操作:
    操作类型:中止请求

这条规则做了两件事:

1. 检查请求的URL路径本身是否包含常见的SQL关键字或注释符(不区分大小写,(?i)表示忽略大小写);

2. 同时检查查询字符串(QUERY_STRING)是否包含相同模式。只要任一条件满足,规则就会触发“中止请求”,立即断开连接。这比返回一个错误页面更具威慑力,且消耗服务器资源更少。你需要根据自己应用的实际SQL语句特点,调整这个正则表达式,避免误判。

防御纵深:结合请求筛选与URL重写

最稳固的策略是分层防御。将IIS请求筛选作为第一层粗粒度过滤,拦截最明显的攻击特征和超长请求。然后,利用URL重写模块进行第二层更精细、更智能的检测,使用复杂的正则表达式匹配变种的、编码过的攻击字符串。例如,攻击者可能对“<script>”进行URL编码,重写模块的正则表达式可以设计为能匹配部分编码形式。此外,重写规则还可以基于频率、IP地址(结合条件)进行限制,实现简单的防爬虫和CC攻击功能。

日志记录与监控:让攻击无所遁形

防御的另一个重要环节是可见性。确保IIS日志(默认位于%SystemDrive%\inetpub\logs\LogFiles)已启用并定期分析。在URL重写规则中,除了“中止请求”,你也可以选择“重定向”到一个虚拟的日志记录页面(该页面只需记录请求细节后返回404),或者使用“自定义响应”返回特定状态码。更重要的是,在重写规则的“操作”中,可以“在重写映射中记录匹配的URL”,将触发规则的恶意请求详细信息记录到专门的日志文件,便于后续进行安全事件分析和攻击溯源。

高级策略:文件扩展名过滤与请求限制

除了内容过滤,还需关注请求本身的结构。在IIS请求筛选中,应严格限制允许的HTTP动词。对于大多数Web应用,通常只需允许GET、HEAD、POST。在“HTTP谓词”选项卡中,拒绝PUT、DELETE、TRACE等不必要的动词。同时,在“文件扩展名”选项卡中,根据应用需要,明确设置允许或拒绝访问特定扩展名(如 .config, .bak, .old),防止敏感文件泄露。对于上传功能,务必在请求筛选中限制允许上传的文件扩展名(如仅允许.jpg, .png),并在“URL重写”中编写规则,禁止直接执行上传目录下的脚本文件(通过匹配路径和脚本扩展名如.asp, .aspx, .php, .jsp)。

持续维护:规则更新与测试

安全规则不是一劳永逸的。攻击技术不断演变,你的正则表达式模式库和拒绝字符串列表也需要定期更新。订阅安全社区和CVE公告,了解最新的注入技术和绕过方法。在将任何新规则应用到生产环境前,必须在测试环境中进行充分验证,确保不会导致正常业务功能异常。可以利用IIS的“分布式配置”功能,将重写规则存储在web.config文件中,便于版本控制和分发。一个良好的习惯是为每一条安全规则添加清晰的注释,说明其目的和创建时间。

总之,Windows服务器IIS的安全运维需要主动、多层次的策略。充分利用内置的“请求筛选”和可扩展的“URL重写”模块,从请求的入口处构建过滤网,能显著提升服务器的主动防御能力,将大部分自动化脚本攻击和常见的手工注入尝试扼杀在萌芽状态。记住,这些措施应与应用程序代码层面的参数化查询、输出编码等安全实践相结合,形成从网络层到应用层的完整防御纵深。