如果 HEADER 中不存在 Web 服务器,有没有办法检测它?

信息安全 网络服务器 http 检测
2021-08-20 02:31:55

我正在尝试检测特定网站使用的网络服务器。比如是否是 nginX、Apache、Tomcat 等等。

我通常使用Live HTTP HeadersFirefox 插件。问题是网站有时会隐藏它们的后端。当 Web 服务器不存在于 HEADER 中时,是否有办法检测它们?

编辑 1:来自与任何答案
都不匹配的网站的示例输出:@Question Overflow

HTTP/1.1 200 OK
Date: Mon, 29 Sep 2014 10:43:29 GMT
Content-Type: text/html
Transfer-Encoding: chunked
X-Powered-By: VideoHosting Framework/1.0.1
Cache-Control: no-cache, must-revalidate, no-cache="Set-Cookie", private
Content-Encoding: gzip
Vary: Accept-Encoding
Server: Videohost/1.0.1

我什至尝试httprint在 linux 上使用,但它ICMP request timeout在我测试的每个网站上都有。

编辑 2:
上面的 HEADER 与我确信它使用 nginX 的网站非常相似。如果我们删除上面 HEADER 中不存在的那些部分(Connection等等Pragma),它会变得非常类似于 nginX。我想Server是在最后,response因为他们自己定制了它。由于那个 nginX 将它附加到Response数据包的末尾。

HTTP/1.1 200 OK
Server: nginx
Date: Mon, 29 Sep 2014 12:51:37 GMT
Content-Type: text/html
Transfer-Encoding: chunked
Connection: keep-alive
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma: no-cache
Content-Encoding: gzip

OWASP 应该用这个更新它的列表,对于 nginX 也是如此。;-)

3个回答

如果网站不使用自定义构建的服务器来修改 HTTP 标头,您可以通过检查HTTP 响应字段中的排列顺序来尝试。来自OWASP

Apache 1.3.23 服务器:

HTTP/1.1 200 OK 
Date: ...
Server: ...
Last-Modified: ...
ETag: ...
Accept-Ranges: bytes 
Content-Length: ...
Connection: ...
Content-Type: text/HTML 

微软 IIS 5.0 服务器:

HTTP/1.1 200 OK 
Server: ...
Expires: ...
Date: ...
Content-Type: text/HTML 
Accept-Ranges: bytes 
Last-Modified: ...
ETag: ...
Content-Length: ...

网景企业 4.1 服务器:

HTTP/1.1 200 OK 
Server: ...
Date: ...
Content-type: text/HTML 
Last-modified: ...
Content-length: ...
Accept-ranges: bytes 
Connection: ...

SunONE 6.1 服务器:

HTTP/1.1 200 OK
Server: ...
Date: ...
Content-length: ...
Content-type: text/html
Date: ...
Last-Modified: ...
Accept-Ranges: bytes
Connection: ...

为了进一步确认,您可以发送格式错误的请求,例如GET / HTTP/3.0,以引发非标准响应。例子:

Apache 1.3.23 和 SunONE 6.1 服务器:

HTTP/1.1 400 Bad Request

微软 IIS 5.0 服务器:

HTTP/1.1 200 OK 

网景企业 4.1 服务器:

HTTP/1.1 505 HTTP Version Not Supported

由于上述信息已经过时,您可能需要安装一个像httpprint这样的渗透测试工具来进行自动 Web 服务器指纹识别

Web 服务器可以混淆其签名或将自己伪装成另一台服务器。如果必须的话,请用少许盐来获取信息。

您可以尝试查看是否可以让服务器显示本机错误页面。错误页面可以由 Web 开发人员自定义,但如果不是,它们通常会显示有关 Web 服务器的大量信息。

例如,这是在 Unix 上运行的 Apache 2.2.4的404 Not Found错误页面:

<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>404 Not Found</title>
</head><body>
<h1>Not Found</h1>
<p>The requested URL /server-status was not found on this server.</p>
<hr>
<address>Apache/2.2.4 (Unix) mod_antiloris/0.4 Server at example.com Port 3128</address>
</body></html>

这是同一服务器发送的400 Bad Request错误页面(通过发送仅使用 telnet 组成的 HTTP 请求获得):GET / HTTP/1.1

<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>400 Bad Request</title>
</head><body>
<h1>Bad Request</h1>
<p>Your browser sent a request that this server could not understand.<br />
</p>
<hr>
<address>Apache/2.2.4 (Unix) mod_antiloris/0.4 Server at 203.0.113.113 Port 3128</address>
</body></html>

为什么不直接使用nmap来检测正在使用的 Web 服务器软件呢?