本文主要记录我们的讨论过程及结论,具体测试代码就不贴了。


一、背景

最近研发让我开一下服务器的put、delete方法,被我以不安全的http方法给拒绝了。

研发表示我很无理,put怎么就是不安全的了,在他看来,put和post只是语义上的不同。如果put是不安全的方法,那么post也是不安全的方法了。

网上的说法也是分为两派,一派说这些都是不安全的方法,要关掉;另一派说它们只是语义上的区别,不存在安不安全


二、一探究竟

经过我和研发各自编写测试用例来论证后,我明白了为什么会有这样的分歧:我是从nginx作为web服务器的角度来看问题的,研发是从java代码上来看问题的。


1、为什么说POST和PUT只是语义上的区别?

在研发的代码里,终端(浏览器或客户端)过来的流量,最终通过java的注解,携带参数进入到了研发写了一个方法里来了。比如研发对某个自定义方法使用PUT的注解,那么终端通过PUT方法传递的参数就会进入到这个自定义方法中。有点编程经验的话,就会知道,到了你写的方法里,这些参数就随便你玩了。

对于PUT、POST,研发都可以通过添加不同注解的方式,得到传递的参数,然后进行操作。所以研发会认为他们只是语义上的区别。


2、为什么说PUT、DELETE是不安全的方法?

对于nginx,可以使用HttpDavModule编译nginx(./configure --with-http_dav_module),开启PUT、DELETE等方法。开启后,恶意攻击者就可以直接将病毒文件等传到nginx服务器上,所以PUT等方法对nginx来说是不安全


3、上面两个问题是否矛盾?

并不矛盾。

假如研发人员打包一个jar包,这时客户端直接访问这个jar包起的服务,那么put传递过来的所有参数,是可以由研发人员编写的代码控制的。只要控制得没有猫病,那么就是安全的。假如开发的是一个tomcat容器部署的工程,参数也是一样可以由研发的代码控制的。

同时,用nginx也可以反向代理put方法(不用HttpDavModule),所以只要后端服务对put服务做好控制,nginx不需要做任何更改,也就实现了对put方法的支持。

但nginx不能单独开启put等,因为研发的代码不能对nginx做控制。


三、结论

后端服务可开启put方法,只需要后端服务对put传递的参数做好控制,并实现put方法即可。

nginx不可开启put方法,这是一种危险的方法。

才疏学浅,如果分析得不对,请各位大佬指正~~~

转载:

关于http的PUT、DELETE等方法到底安不安全的讨论_CHEndorid的博客-CSDN博客_put和delete安全问题

四、案例

【低危】不安全的HTTP方法

【1】漏洞名称:不安全的HTTP方法

【2】漏洞描述:不安全的HTTP方法一般包括:TRACE、PUT、DELETE、COPY 等。其中最常见的为TRACE方法可以回显服务器收到的请求,主要用于测试或诊断,恶意攻击者可以利用该方法进行跨站跟踪攻击(即XST攻击),从而进行网站钓鱼、盗取管理员cookie等。 其他说明方式如图所示:

 【3】检测案例:

步骤1:Burpsuite捉包修改方法为OPTIONS:

现象:出现 Allow:POST、GET、DELETE、OPTIONS、PUT、HEAD等

在8月5日处理的案例中,客户先是对IIS进行了加固,但复核发现问题依然存在。在与客户沟通的过程中,我发现实际环境除了使用IIS之外,还利用Nginx进行了反向代理,因此我建议客户对Nginx也进行加固处理,加固后问题顺利解决。

【4】修复方案(转自网络

一、Apache
使用Apache的重写规则来禁用Options方法和Trace方法

在Apache配置文件httpd-conf中【vhosts-conf】添加以下代码:

单独禁用Trace方法:

RewriteEngine On
RewriteCond %{REQUEST_METHOD} ^(TRACE|TRACK)
RewriteRule .* - [F]

 单独禁用Options方法:

RewriteEngine On
RewriteCond %{REQUEST_METHOD} ^(OPTIONS)
RewriteRule .* - [F]

二、Nginx
在你要屏蔽的虚拟主机的server段里加入下面代码:

if ($request_method !~* GET|POST) {
            return 403;
        }

重启nginx,这样就屏蔽GET、POST、之外的HTTP方法

三、Tomcat
web.xml(url下禁用的请求方式)

<security-constraint>  
        <web-resource-collection>  
            <url-pattern>/*</url-pattern>  
            <http-method>PUT</http-method>  
            <http-method>DELETE</http-method>  
            <http-method>HEAD</http-method>  
            <http-method>OPTIONS</http-method>  
            <http-method>TRACE</http-method>  
        </web-resource-collection>  
        <auth-constraint>  
        </auth-constraint>  
    </security-constraint>

四、IIS
1、禁用WebDAV功能
2、web.config
在<configuration>节点下添加如下代码:

<system.webServer>
    <security>
        <requestFiltering>
            <verbs allowUnlisted="false">
                <add verb="GET" allowed="true"/>
                <add verb="POST" allowed="true"/>
                <add verb="HEAD" allowed="true"/>
            </verbs>
        </requestFiltering>
    </security>
</system.webServer>

转载:

【低危】不安全的HTTP方法 - Lee#J1Feng - 博客园

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐