nginx $ host变量可能包含斜杠吗?

时间:2014-05-13 12:26:38

标签: security nginx http-headers header-injection

我有以下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是否可以防止这种攻击?

1 个答案:

答案 0 :(得分:1)

看起来nginx已经强制执行至少部分restrictions on valid host names,但如果你想确定,你可以随时使用nginx rewrite module来过滤主机名,如: / p>

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

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

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