Virtualhost

在什麼情況下 Apache 會允許不匹配的 HTTP_HOST 通過?

  • July 30, 2014

有人設法將未定義的HTTP_HOST伺服器變數傳遞給我的應用程序腳本,從而觸發了一系列錯誤。我很不安,但無法複製這種行為。我的 httpd 伺服器使用具有以下參數的基於名稱的虛擬主機:

ServerName example.com:80
UseCanonicalName On

<VirtualHost *:80>
 ServerName example.com
 ServerAlias ftp.example.com service.example.com
 ErrorDocument 404 /error/404.html.var
...
</VirtualHost>

<VirtualHost *:80>
 ServerName notfound.example.com
 ServerAlias *
 RedirectMatch 404 ^/(?!error)
 ErrorDocument 404 /error/404.html.var
</VirtualHost>

我嘗試使用 wget 複製請求,其中包含以下內容:

wget -dS --header='Host: ' http://example.com/?x0a/x04/x0a/x04/x06/x08/x09/...
--2014-07-30 03:00:00--  http://example.com/?x0a/x04/x0a/x04/x06/x08/x09/...
Connecting to example.com:80... connected.
---request begin---
GET / HTTP/1.1
Accept: */*
Host: 
Connection: Keep-Alive

---request end---
...
HTTP request sent, awaiting response... 
---response begin--
 HTTP/1.1 404 Not Found
 Date: Wed, 29 Jul 2014 03:00:00 GMT
 Server: Apache
 Accept-Ranges: bytes
 Keep-Alive: timeout=5, max=100
 Connection: Keep-Alive
 Transfer-Encoding: chunked
 Content-Type: text/html; charset=UTF-8
 Content-Language: en
---response end---
...
2014-07-29 03:00:00 ERROR 404: Not Found.

正如預期的那樣,一個 404 not found 錯誤被傳遞。我想知道如何使用未定義的 HTTP_HOST 觸發 200 成功。Apache 中的 ServerAlias 是否完全依賴 HTTP_HOST?或者這可能是某人試圖利用的伺服器錯誤?

更新:

這是來自的輸出httpd -S

VirtualHost configuration:
*:80                   is a NameVirtualHost
        default server example.com (/etc/httpd/conf/httpd.conf:410)
        port 80 namevhost example.com (/etc/httpd/conf/httpd.conf:410)
                alias localhost
                alias xxx.xxx.xxx.xxx
                alias ftp.example.com
                alias service.example.com
        port 80 namevhost notfound.example.com (/etc/httpd/conf/httpd.conf:491)
                wild alias *
ServerRoot: "/etc/httpd"
Main DocumentRoot: "/var/www/html"
Main ErrorLog: "/etc/httpd/logs/error_log"
Mutex default: dir="/run/httpd/" mechanism=default 
Mutex rewrite-map: using_defaults
Mutex ssl-stapling: using_defaults
Mutex proxy: using_defaults
Mutex ssl-cache: using_defaults
PidFile: "/run/httpd/httpd.pid"
Define: DUMP_VHOSTS
Define: DUMP_RUN_CFG
User: name="apache" id=48 not_used
Group: name="apache" id=48 not_used

是的,ServerAlias 與HTTP_HOST變數完全一致(更準確地說,使用Host:請求的 http 標頭,它也將被映射到HTTP_HOST)。

如果沒有Host:http 頭,並且 request_uri 也包含一個 http 主機(即GET http://example.com/path/to HTTP/1.1),它也將用作 HTTP_HOST。這通常僅在代理的情況下發生。

您的範例很糟糕, Host: 不能包含 url,只能包含主機名。如果有人在此處提供了一個 url(可能是由錯誤的 http 工具提供),它將被解釋為無效/不存在的主機名,這就是您的情況。

實際:雖然我們可以找到並分析 apache webserver 的(公共)原始碼的相關部分,但我認為不需要這麼難的東西。您能做的最好的事情就是使用一些telnet 127.0.0.1 80或類似的命令來使用您自己的 apache。為您的虛擬主機 apache 提供不同的 GET /url, Host: 標頭,看看會發生什麼。當我需要調試虛擬主機的 apache 配置時,我經常這樣做。一個基於 telnet 的 http 查詢 minimumexample 在這裡:

$ telnet 127.0.0.1 80
GET /test/url.html HTTP/1.1
Host: myapache.mydomain.com
Connection: close

(me: until this you need to type in, don't forget the multiple enter at the end)
200 HTTP/1.1 OK (<- me: from here is coming the reply of the server!)
Content-type: html/html

<html> 
...
</html>

引用自:https://serverfault.com/questions/616483