跨站请求伪造CSRF漏洞的修复参考方法(IIS篇)

目录

URL Rewrite简述

具体步骤

模块安装

入站规则制定

设置白名单

根据Referer设置合法请求

根据Referer拦截非法请求

总结

快速导入规则


通过URL Rewrite设置Referer进行防止跨站请求伪造漏洞

URL Rewrite简述

URL Rewrite是微软针对IIS推出的一种对URL进行重写的扩展模块,目前支持用于IIS7及以上版本。该模块使IIS管理员能够创建强大的自定义规则,语法支持正则规则以及通配符规则过滤。它能够根据HTTP头和IIS服务器变量重写URL,可以避免一些参数名、ID等信息完全暴露在用户面前,从而提高安全性;同时可以根据URL段或请求元数据控制对网站内容的访问。本质上URL Rewrite是一个加强版的过滤器,据此我们可以根据HTTP请求的header信息进行防盗链应用。

具体步骤

模块安装

目前最新版本为URL Rewrite2.0;可以从微软网站下载:

https://www.iis.net/downloads/microsoft/url-rewrite

【安装要求】:

使用名为“Administrator”的实际帐户登录到服务器,以管理员身份运行。

   安装后,IIS栏增加一个URL重写功能:

 

入站规则制定

模块目前过滤http请求信息支持以下几个方面:

1.请求地址URL

2.用户代理HTTP_USER_AGENT

3.IP地址REMOTE_ADDR

4.查询字符串QUERY_STRING

5.引用站点HTTP_REFERER

6.主机地址HTTP_HOST

右侧添加规则,请求查看入站规则一栏有三个模板信息:空白规则、请求阻止和重写映射规则。选择一个空白规则即可,一个规则通常包含匹配URL,条件,服务器变量、操作四大部分。

 

1.      匹配URL: 是指请求的URL满足设定的条件才会继续走下边的过滤条件,相当于一个粗尺度的过滤;URL过滤支持正则表达式、通配符语法以及完全匹配三种模式。

2.      条件:当请求信息满足匹配URL信息时,会进入到条件进行判断;这里的条件判断支持全部匹配和任意匹配两种模式;全部相当于逻辑与;任意相当于逻辑或。

3.      操作:当满足设定的条件后,针对该请求进行的操作,目前支持重写、无操作、重定向、自定义响应、中止请求几种,可以通过无操作设置白名单,通过自定义响应进行请求拦截。

【备注】:在操作一栏下有停止后续处理规则复选,如果选中,表示为当前请求信息满足步骤2的条件时,会终止后续规则的处理;如果没有匹配到当前url或者匹配到url但是条件并不满足时还会继续走后续规则的处理。

设置白名单

GS产品的一些入口信息并不需要进行过滤,此时我们需要设置白名单,即符合白名单规则的请求信息不予拦截,白名单信息可以通过设置操作为无操作进行处理,然后停止后续处理务必选中。

步骤:

1.      添加规则,选择空白规则,设定规则名称,然后依次设置匹配URL,条件以及操作三项。

2.设定规则的匹配URL,选择与模式匹配,语法使用正则表达式,模式选为.*,即所有的url都进行条件过滤。

3. 设定规则的条件,第二部已经设置了匹配URL,当URL满足匹配模式时, 设定需要设置白名单的相关信息,一般是一个入口地址,不含有相应的referer信息,

选择全部匹配,根据HTTP_REFERER条件过滤,选择与模式匹配,条件设置为^\s*$:

4.对应的操作选为无,即走正常的流程,停止后续处理务必选中,否则后边针对referer的过滤条件可能把白名单信息拦截掉,务必选择停止后续处理

 

根据Referer设置合法请求

第三节设置了系统正常访问的白名单信息;还有一种就是带referer信息的正常的web访问,这种访问也属于合法的信息,因此需要再增加一种白名单规则。

步骤:

1.      新建一个规则,选择空白规则。

2.      匹配URL选为与模式匹配,使用正则表达式,模式为.*。

3.      设定过滤条件,选择为任意匹配,添加新项根据HTTP_REFERER过滤,分别增加以下几个模式,均选为与模式匹配。

http://localhost/cwbase.*

http://127.0.0.1/cwbase.*

http://服务器IP/cwbase.*

4.      设定操作结果为无,同样务必选择停止后续处理规则。

根据Referer拦截非法请求

根据http请求的Referer信息可以过滤该请求是否为合法的信息,从而进行盗链拦截。

设置方法和白名单类似,主要在条件的筛选以及动作的执行不同。

步骤:

1.      新建一个规则,选择空白规则。

2.      设定规则的URL匹配信息,同样选为正则语法,与模式匹配形式,模式为.*

3.      设定条件,这里条件可以忽略,因为上述方案分别设定了针对web以及WinForm的白名单请求;web访问带有合法referer信息的请求;走到该分支的是不满足以上条件的访问请求,直接返回401错误即可,也可以进行定制。

4.      操作一栏选择自定义响应,状态码401即可

总结

3,4,5小节分别设置了入口白名单、正常访问白名单以及拦截非法请求三种情况,请务必按照这三个顺序依次设置,如下图结构:

快速导入规则

第3,4,5小节通过界面自行添加了规则,项目可以使用以下模板直接快速导入规则,无需手动添加。

1.      服务端bscw_local下级下web.config文件

2.      找到</system.webServer>节点,在该节点内添加如下配置节即可导入规则,注意替换IP地址。

 

附规则配置节:(务必修改模板的IP地址为实际服务器IP地址)

<rewrite>
    <rules>
        <clear />
        <rule name="Allow" enabled="true" stopProcessing="true">
            <match url=".*" />
            <conditions logicalGrouping="MatchAll" trackAllCaptures="false">
                <add input="{HTTP_REFERER}" pattern="^\s*$" />
            </conditions>
            <action type="None" />
        </rule>
        <rule name="AllowWithRefer" enabled="true" stopProcessing="true">
            <match url=".*" negate="false" />
            <conditions logicalGrouping="MatchAny" trackAllCaptures="false">
                <add input="{HTTP_REFERER}" pattern="http://localhost/cwbase.*" />
                <add input="{HTTP_REFERER}" pattern="http://127.0.0.1/cwbase.*" />
                <add input="{HTTP_REFERER}" pattern="http://xx.xx.xx.xx/cwbase.*" />
            </conditions>
            <action type="None" />
        </rule>
        <rule name="NotBelong" enabled="true" stopProcessing="true">
            <match url=".*" />
            <conditions logicalGrouping="MatchAll" trackAllCaptures="false" />
            <action type="CustomResponse" statusCode="401" subStatusCode="40" statusReason="Not find" statusDescription="Not find" />
        </rule>
    </rules>
</rewrite>

 

猜你喜欢

转载自blog.csdn.net/ilqgffvramusm2864/article/details/99620783