为什么有些 Web 服务器仍然在 HTTP 响应标头中提供有关供应商和版本的信息

信息安全 网络服务器 指纹识别
2021-09-03 19:43:28

我认为在安全领域,一个众所周知的事实是让 Web 服务器供应商(例如 Apache)和版本对外部可见并不是一个好主意,因为这可用于针对特定服务器发起有针对性的攻击执行。

我启动了一个 Apache 2.4 Docker 容器,看看是否仍然如此——是的,确实如此。

我想了一下。拥有一个 Web 服务器可以实现的标准,该标准定义了一个使用语义版本控制进行版本控制的标准功能集,这不是很好吗?

这样,应用程序仍然可以处理不同的服务器版本(这似乎是我想从外部查看版本的唯一原因)——但至少可以隐藏 Web 服务器的供应商。这至少是攻击者必须处理的另一个障碍。

你怎么认为?

4个回答

是的,理论上通过广告供应商和横幅中的版本使攻击者的工作更容易,但只是一点点。

即使你不做广告,也可以从应用程序的行为中弄清楚。以网络扫描工具nmap为例:

Nmap 提供了许多用于探测计算机网络的功能,包括主机发现以及服务和操作系统检测。这些功能可以通过提供更高级服务检测、漏洞检测和其他功能的脚本进行扩展。

来源:维基百科

在使用其他扫描方法之一发现 TCP 和/或 UDP 端口后,版本检测会询问这些端口以确定更多关于实际运行的内容。nmap-service-probes 数据库包含用于查询各种服务和匹配表达式以识别和解析响应的探针。

来源:nmap 文档

基本上,nmap 将首先尝试确定它是否是 apache / nginx / IIS 等,它将通过发送一个特定的数据包来完成,它知道不同的 Web 服务器将响应不同的数据包。然后,一旦它知道它是 apache,它就会发送针对在一个版本和另一个版本之间发生变化的行为的数据包,可能是由于错误修复或新功能。

正如@paj28 在评论中指出的那样,nmap 非常擅长检测供应商,但是在版本中遇到问题,当 nmap 显示详细的版本信息时,这可能是因为有一个横幅。当然,如果你想破解,为什么还要费心去弄清楚版本呢?一旦你知道它是 apache,为什么不直接运行 metasploit 中的所有 apache 漏洞利用脚本,看看它们是否存在?

所以是的,理论上可以为“这是所有 Web 服务器的行为方式”编写规范,但这意味着您不允许 Web 服务器进行创新或修复错误。此外,Web 服务器将希望通过其他服务器没有的功能来区分自己。

正如@TripeHound 所指出的,版本横幅可以被认为是安全的胜利,因为它们允许系统管理员轻松清点他们的系统并保持最新状态。


TL;DR:横幅与否,您可以弄清楚您正在与之交谈的网络服务器和操作系统。


Nmap 示例

由于这篇文章很受欢迎,我将添加一些示例:

Apache httpd 将版本信息放在 HTTP 标头中:

HTTP/1.1 200 OK
Date: Thu, 17 Oct 2019 14:26:10 GMT
Server: Apache/2.4.6 (CentOS)

不出所料,nmap 选择了这个:

 ~ nmap 192.168.56.107 -p 80 -A --version-all

Starting Nmap 7.60 ( https://nmap.org ) at 2019-10-17 07:58 EDT
Nmap scan report for 192.168.56.107
Host is up (0.0020s latency).

PORT   STATE SERVICE VERSION
80/tcp open  http    Apache httpd 2.4.6 ((CentOS))
| http-methods:
|_  Potentially risky methods: TRACE
|_http-server-header: Apache/2.4.6 (CentOS)
|_http-title: Apache HTTP Server Test Page powered by CentOS

Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 14.23 seconds

如果我们尝试一些更棘手的事情,Apache Tomcat 不会给出明显的横幅:

HTTP/1.1 200 
Accept-Ranges: bytes
ETag: W/"1896-1527518937672"
Last-Modified: Mon, 28 May 2018 14:48:57 GMT
Content-Type: text/html
Content-Length: 1896
Date: Thu, 17 Oct 2019 14:35:05 GMT
Connection: close

<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
   "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
    <title>Apache Tomcat</title>
</head>
...

我们看到 nmap 得到了供应商的权利,但没有猜测版本:

~ nmap -A -p 8080 192.168.56.1

Starting Nmap 7.60 ( https://nmap.org ) at 2019-10-17 10:34 EDT
Nmap scan report for 192.168.56.1
Host is up (0.0013s latency).

PORT     STATE SERVICE VERSION
8080/tcp open  http    Apache Tomcat
| http-methods:
|_  Potentially risky methods: PUT DELETE
|_http-open-proxy: Proxy might be redirecting requests
|_http-title: Apache Tomcat

Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 21.71 seconds

攻击者根本不在乎。当您拥有一个受欢迎的网站时,您会发现机器人在每个可能的路径上探测每个(易受攻击的)phpmyadmin 版本,即使您的网站根本不使用数据库。以同样的方式,他们可能会探测每个版本(例如 apache)中的安全漏洞。躺在或省略Server标题不会给你带来太多的安全感。

但是当您是管理员时,您可以使用Server标头快速识别,如果服务器仍未打补丁,可能会阻止您忘记您尚未更新。

当然,您的担忧是有道理的,例如,当某人正在收集信息并可能手动整理漏洞时,当他们知道正确的版本时,这将起作用,但在大多数情况下,这只是默默无闻的安全性。重要的一点是,您应该确保保持软件更新,因此您无需担心知道您运行最新版本的攻击者。

从历史上看,许多服务器返回这样的标头:

服务器:Apache/2.4.1 (Unix) mod_php/1.2 mod_ssl/0.9

这确实提供了比您想要的更多的信息,因此大多数服务器现在默认使用这样的标头:

服务器:阿帕奇

事实上,大多数 Web 服务器都很难关闭此标头。原因?营销。他们希望出现在最常见的 Web 服务器是什么的调查中。

关于指纹,许多工具可以相当可靠地确定 Apache、NGINX 和 IIS 等。但对服务器的版本进行指纹识别要困难得多,开源工具做得不好,而且任何粒度都不可能。

如前所述,留下它不是安全问题,它对于某些客户端程序是有用的信息。举个curl例子:它使用Server标头值来检查是否可以启用 HTTP 管道:

取自https://serverfault.com/a/596560/347610

[curl 在详细模式下运行时显示此消息-v]:

* Server Apache/... is not blacklisted

这是来自 curl 的内部消息。似乎是与流水线相关的 curl 功能的一部分。

另见https://daniel.haxx.se/blog/2013/03/26/better-pipelining-in-libcurl-7-30-0/

服务器黑名单 [注意:“基于 Server 标头”],允许应用程序指定不应尝试 HTTP 管道的服务器列表 - 现实世界的测试证明,某些服务器已损坏,无法播放游戏

因此,为什么它仍然默认启用,并且完全无害(只需让您的服务器保持最新状态)。它以某种方式是服务器的User-Agent标头版本。