Em quais cenários o Apache permitiria a passagem de um HTTP_HOST incorreto?

1

Alguém conseguiu passar uma variável de servidor HTTP_HOST indefinida para o script do meu aplicativo, acionando uma série de erros. Estou bastante perturbado, mas não consigo replicar esse comportamento. Meu servidor httpd usa hospedagem virtual baseada em nome com os seguintes parâmetros:

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>

Eu tentei replicar o pedido usando o wget com o seguinte:

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.

E, como esperado, um erro 404 não encontrado é entregue. Eu me pergunto como alguém pode desencadear um sucesso de 200 com um HTTP_HOST indefinido. O ServerAlias no Apache depende do HTTP_HOST? Ou isso pode ser um bug do servidor que alguém está tentando explorar?

ATUALIZAÇÃO:

Esta é a saída de 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
    
por Question Overflow 30.07.2014 / 05:17

1 resposta

1

Sim, o ServerAlias funciona exatamente com a variável HTTP_HOST (mais corretamente, com o cabeçalho Host: http da solicitação, que também será mapeado para HTTP_HOST ).

Se não houver Host: http header E o request_uri também contiver um host http (por exemplo, GET http://example.com/path/to HTTP/1.1 ), ele também será usado como HTTP_HOST. Isso acontece normalmente no caso de proxies apenas.

Seu exemplo é ruim, Host: não pode conter um URL, apenas um nome de host. Se alguém der aqui uma URL (provavelmente por uma ferramenta http ruim), ela será interpretada como um nome de host inválido / inexistente, e é isso que acontece no seu caso.

Praticamente: Embora possamos encontrar e analisar as partes relevantes do código-fonte (público) do servidor web apache, não acho que essas coisas difíceis sejam necessárias. O melhor que você pode fazer é jogar com seu próprio apache com alguns telnet 127.0.0.1 80 ou comandos similares. Dê diferentes cabeçalhos GET / url, Host: ao seu apache virtualhosted e veja o que acontece. Foi o que fiz com muitas vezes quando precisei depurar as configurações do virtualhosted do apache. Uma minimalexample de consulta http baseada em telnet está aqui:

$ 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>
    
por 30.07.2014 / 07:13