为什么要禁止除GET和POST之外的HTTP方法?
字数 1444 2025-08-18 11:37:19
HTTP不安全方法漏洞分析与防护指南
一、HTTP请求方法概述
HTTP协议定义了多种请求方法,根据版本不同有所区别:
HTTP 1.0定义的方法:
- GET:请求指定的资源
- POST:向指定资源提交数据进行处理请求
- HEAD:与GET相同,但只返回头部信息
HTTP 1.1新增的方法:
- OPTIONS:返回服务器支持的HTTP方法
- PUT:向指定位置上传最新内容
- DELETE:请求服务器删除指定资源
- TRACE:回显服务器收到的请求,用于测试或诊断
- CONNECT:HTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器
二、不安全HTTP方法的风险分析
1. OPTIONS方法风险
- 暴露服务器信息:会返回服务器支持的HTTP方法、中间件版本等敏感信息
- 攻击面扩大:为攻击者提供服务器能力信息,便于针对性攻击
2. PUT方法风险
- 文件上传漏洞:允许客户端向服务器上传文件
- WebShell上传:可被用于上传恶意脚本文件(如JSP、PHP等)
- 无验证机制:默认不包含身份验证,容易滥用
3. DELETE方法风险
- 资源删除:允许删除服务器上的文件
- 数据破坏:可导致网站关键文件被删除,服务中断
4. TRACE方法风险
- 跨站追踪攻击(XST):可能被用于窃取Cookie等敏感信息
- 反射型XSS:在某些情况下可被利用进行跨站脚本攻击
5. CONNECT方法风险
- 代理滥用:可能被用于建立隧道连接,绕过安全控制
三、漏洞验证与利用实例
测试环境搭建
- 操作系统:Windows 10 64位
- Web服务器:Tomcat 7.0.72
- 测试工具:curl 7.49
关键配置修改
Tomcat默认配置中,web.xml文件的org.apache.catalina.servlets.DefaultServlet的readonly参数默认为true,需改为false以演示漏洞:
<init-param>
<param-name>readonly</param-name>
<param-value>false</param-value>
</init-param>
漏洞利用步骤
-
PUT上传文件测试
curl -X PUT http://127.0.0.1:8080/examples/test.txt -d "test content" -
DELETE删除文件测试
curl -X DELETE http://127.0.0.1:8080/examples/test.txt -
绕过限制上传JSP文件
- 直接上传.jsp文件会被JspServlet处理而失败
- 利用特殊后缀绕过检测(CVE-2017-12615):
curl -X PUT http://127.0.0.1:8080/examples/shell.jsp%20 -d "<% out.println("Hello JSP"); %>" - 其他绕过方法:
shell.jsp::$DATAshell.jsp/
-
OPTIONS方法信息收集
curl -X OPTIONS http://127.0.0.1:8080/ -v
四、防护措施
1. 禁用不必要的HTTP方法
Tomcat配置方法:
在web.xml中添加以下配置:
<security-constraint>
<web-resource-collection>
<url-pattern>/*</url-pattern>
<http-method>PUT</http-method>
<http-method>DELETE</http-method>
<http-method>OPTIONS</http-method>
<http-method>TRACE</http-method>
<http-method>CONNECT</http-method>
</web-resource-collection>
<auth-constraint></auth-constraint>
</security-constraint>
Nginx配置方法:
if ($request_method !~ ^(GET|HEAD|POST)$ ) {
return 405;
}
Apache配置方法:
<Location "/">
<LimitExcept GET POST>
Deny from all
</LimitExcept>
</Location>
2. 保持DefaultServlet的readonly为true
确保Tomcat配置中:
<init-param>
<param-name>readonly</param-name>
<param-value>true</param-value>
</init-param>
3. 定期安全扫描
使用工具检查服务器开放的HTTP方法:
curl -X OPTIONS http://example.com/ -v
nmap --script http-methods.nse example.com
4. 应用防火墙规则
在WAF中添加规则,拦截异常的HTTP方法请求。
五、自查指南
-
OPTIONS方法测试
curl -X OPTIONS http://yourwebsite.com/ -v检查返回的
Allow头部是否包含不必要的方法 -
PUT/DELETE方法测试
- 测试PUT上传:
curl -X PUT http://yourwebsite.com/testfile -d "test" - 测试DELETE删除:
curl -X DELETE http://yourwebsite.com/existingfile
- 测试PUT上传:
-
全面方法测试
对每个目录测试所有HTTP方法,确认是否被禁用
六、总结建议
- 最小化原则:只开放业务必需的HTTP方法(通常只需GET和POST)
- 默认安全:新部署环境应默认禁用非常用方法
- 持续监控:定期检查服务器配置和开放的方法
- 分层防御:在网络层、主机层和应用层同时实施防护
- 及时更新:保持中间件版本最新,修复已知漏洞
通过以上措施,可有效降低因不安全HTTP方法导致的安全风险,保护Web服务器免受攻击。