【问题标题】:Could the nginx $host variable contain slashes?nginx $host 变量可以包含斜杠吗?
【发布时间】:2023-04-11 12:45:01
【问题描述】:

我有以下 nginx 配置:

server
{
    listen 80 default;
    listen [::]:80 default_server ipv6only=on;
    server_name _;

    root /home/user/websites/$host;
    index index.html;
}

这简化了配置(根据我的需要),如果我想为新域或子域提供服务,我只需创建文件夹 /home/user/websites/sub.domain.tld/

我的问题是,通过这种设置,恶意用户是否可以发送错误的Host 标头并遍历目录结构?

我尝试了以下方法:

$ curl --header "Host: ../testing" ip.address

nginx 按预期返回400 Bad Request。有没有其他方法可以规避这种情况,或者 nginx 是否可以防止这种攻击?

【问题讨论】:

标签: security nginx http-headers header-injection


【解决方案1】:

看起来 nginx 至少已经强制执行了一些 restrictions on valid host names,但如果您想确定,您可以随时使用 nginx rewrite module 自己过滤主机名,如下所示:

if ($host !~ "^[a-z0-9\-]+([.][a-z0-9\-]+)+$") {
    return 400;
}

这应该(假设我做对了;我自己并没有实际使用过 nginx)返回 400 错误,除非主机名由两个或多个以句点分隔的段组成,每个段由一个或多个 ASCII 小写字母组成,数字或连字符。特别是,它应该拒绝任何包含斜杠或其他意外标点符号(如反斜杠)的“主机名”,以及任何以句点开头的主机名。

(请注意,此正则表达式将接受 IPv4 地址,但会拒绝 IPv6 地址。如果只是为了提供更好的错误消息,您可能希望单独处理这些情况。或者可能不会——没有人再使用 HTTP/0.9。)

【讨论】:

  • 感谢您的建议。如果其他人想知道,我认为答案应该包括 Alexey 的源代码链接,以展示 nginx 在幕后实际在做什么(而不是希望 nginx 正确实现标准)。 github.com/nginx/nginx/blob/master/src/http/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-03-03
  • 1970-01-01
  • 2013-04-21
  • 2015-11-08
  • 2011-02-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多