问题描述

  • 安全扫描过程中,安全人员测试使用 MOVE 方法请求服务,服务仍能正常响应请求,此配置不满足安全检测要求。

问题定位

  • 正常情况下 MOVE 方法请求无法通过 Nginx,请求进入应用服务器。Nginx 配置有限制请求方法,不允许的 MOVE 请求,应该直接返回 405。
1
2
3
if ($request_method !~ ^(GET|POST|PUT|HEAD|OPTIONS)$ ) {
    return 405;
}
  • 且与开发员沟通后确定,MOVE 方法在应用侧也无法正常响应
  • 但实际请求测试发现,服务确实能正常响应
1
2
3
$ curl https://XXX.XXXX.XXX -I -X MOVE
HTTP/2 200
server: Tengine
  • 通过绑定 hosts,绕过 CDN 直接请求 Nginx 服务器发现,Nginx 是能限制 MOVE 方法的,MOVE 方法返回 405
1
2
3
4
5
6
7
# 绑定 hosts,绕过 cdn
$ cat <<EOF >>/etc/hosts
1.116.X.XXX(IP)    XXX.XXXX.XXX(域名)
EOF
# 请求能够被限制住
$ curl https://XXX.XXXXX.XXXXX -I -X MOVE
HTTP/1.1 405 Not Allowed
  • 经过测试发现,MOVE 方法在阿里云 CDN 回源过程中,会将请求方法转为 GET 方法回源。且与阿里云技术人员沟通过后确认确实会存在此问题,但是短期内没有解决方案。
  • 此问题实际不影响服务安全,但客户那边要求处理,最后通过 CDN EdgeScript(边缘脚本)解决此问题

问题处理

  • 问题出在 cdn 回源这一步,因此在 cdn 回源之前进行拦截可解决这个问题,而阿里云提供的边缘脚本功能刚好能处理此问题。
  • EdgeScript 模拟环境添加规则
  • 使用如下代码模板,并配置启用状态为开启,并发布到测试环境
1
2
3
4
5
# req_method
concat('req_method: ', req_method())
if not(req_method('re:(GET|POST|PUT|HEAD|OPTIONS)')) {
    exit(405, 'not allowed')
}
  • 使用调试工具测试规则是否符合预期
  • 工具要求获取 Proxy IP
  • 测试规则

    • 测试 GET 请求,返回 301,正常响应
    • 测试 DELETE 请求(规则内配置为不允许,CDN 提供的测试方法内不包含 MOVE),返回 405,请求被限制
  • 发布至生产环境

    • 注:发布后将在正式环境生效,请评估后再发布
  • 查看生产环境配置确认已生效
  • 去掉 hosts 内绕过 CDN 的配置,测试限制是否生效
1
2
3
4
5
6
7
8
# MOVE 方法已被显示
$ curl http://XXXX.XXXXX.XXXXX -X MOVE -I
HTTP/1.1 405 Method Not Allowed
Server: Tengine
# GET 方法正常响应
$ curl http://XXXX.XXXXX.XXXXX -X GET -I
HTTP/1.1 301 Moved Permanently
Server: Tengine

参考

  • EdgeScript概述:https://help.aliyun.com/document_detail/126565.html
  • EdgeScript内置函数库:https://help.aliyun.com/document_detail/126869.html