我该如何查找正在运行的Apache版本,而不需要访问命令行界面?

81

我需要找到一个包含版本信息的文件或者一种通过网络轮询并获取版本信息的方法。服务器托管在一个不允许我使用命令行访问的主机上,尽管我可以通过FTP浏览安装位置。

我已经尝试了HEAD,但是没有返回版本号。

如果我尝试一个不存在的页面来获取404,请求被拦截,返回一个没有服务器信息的默认页面。我猜这说明服务器安全性很高。

仍然没有更近一步。

我按照建议放了一个PHP文件,但是我无法访问它,也不能确定用什么URL路径加载它。无论如何,我得到了大量的访问拒绝消息和相同的默认404页面。我对服务器的强大保护感到安心。


你能在服务器上的脚本中运行shell命令吗? - workmad3
好问题,不知道。我会试试。 - Simon
你可以从http://phpshell.sourceforge.net/安装PHPShell,这将让你四处探索。 - Paul Dixon
11个回答

138

这个方法

连接主机上的80端口并将其发送

HEAD / HTTP/1.0

这需要跟着两个回车换行符

你会得到类似这样的东西

HTTP/1.1 200 OK
Date: Fri, 03 Oct 2008 12:39:43 GMT
Server: Apache/2.2.9 (Ubuntu) DAV/2 SVN/1.5.0 PHP/5.2.6-1ubuntu4 with Suhosin-Patch mod_perl/2.0.4 Perl/v5.10.0
Last-Modified: Thu, 02 Aug 2007 20:50:09 GMT
ETag: "438118-197-436bd96872240"
Accept-Ranges: bytes
Content-Length: 407
Connection: close
Content-Type: text/html; charset=UTF-8

你可以从"Server:"头中提取Apache版本号。

常用工具

你可以使用随Perl的LWP库一起安装的HEAD实用程序,例如:

HEAD http://your.webserver.com/

或者使用curl实用程序,例如:

 curl --head http://your.webserver.com/

您还可以使用浏览器扩展程序,例如Live HTTP HeadersFirebug(适用于Firefox),或Fiddler(适用于IE)来查看服务器标头。

被Windows卡住了吗?

最后,如果您使用的是Windows,并且没有其他可用工具,请打开命令提示符(开始菜单->运行,键入“cmd”并按回车键),然后键入以下内容:

telnet your.webserver.com 80

然后输入(小心,您的字符不会回显)

HEAD / HTTP/1.0

按回车键两次,您将看到服务器头信息。

其他方法

正如cfeduke和Veynom所提到的,服务器可能被设置为在Server:标头中返回有限的信息。尝试上传一个包含此信息的PHP脚本到您的主机。

<?php phpinfo() ?>

使用网络浏览器请求页面,您应该能够看到报告的Apache版本。

您还可以尝试使用PHPShell进行探索,尝试执行类似以下命令:

/usr/sbin/apache2 -V

9
非常接近了。然而服务器只显示“Apache”,没有任何版本细节。 - Simon
7
此外,在Windows 7上使用命令提示符时,需要注意必须启用telnet功能:开始 > 控制面板 > 程序和功能 > 打开或关闭Windows功能 > 确保已勾选“Telnet客户端” > 点击确定。 - user110857
在“被Windows卡住了?”中,我尝试发送HEAD但它显示HTTP/1.1 503 Service Temporarily Unavailable - emeraldhieu
它只是说服务器:Apache。 - AturSams
curl --head http://your.webserver.com/ 命令可以获取与浏览器网络日志中响应头完全相同的信息。 - FLAW
显示剩余2条评论

45

httpd -v 命令可以获得正在运行的Apache服务器的版本信息(如果您有SSH / shell访问权限)。

输出应该类似于这样:

Server version: Apache/2.2.3
Server built:   Oct 20 2011 17:00:12

如建议所述,您还可以执行apachectl -v,这将给出相同的输出,但将受到更多Linux版本的支持。


15
在Ubuntu上,二进制文件被称为apache2而不是httpd - Janus Troelsen
1
+1 - phpinfo() 和curl无法为我使用的共享主机提供足够的信息。这个可以。 - jontyc
1
OP正在寻求非shell解决方案 :) 既然已经发布了,我建议使用'apachectl'以获得更大的平台独立性。 - Konzulic

5

很少情况下,一个已硬化的HTTP服务器被配置为不提供服务器信息或提供误导性的服务器信息。在这种情况下,如果服务器启用了PHP,您可以添加以下内容:

<?php phpinfo(); ?>

在文件中浏览并查找该内容
_SERVER["SERVER_SOFTWARE"]

条目。这也容易受到加固缺乏信息/误导的影响,尽管我想象中它不经常被改变,因为此方法首先需要访问机器以创建PHP文件。


我的硬化服务器也有“Apache” $_SERVER["SERVER_SOFTWARE"] - PaulH

5

警告,有些Apache服务器在使用HEAD请求时不会始终发送其版本号,例如此情况:

HTTP/1.1 200 OK
Date: Fri, 03 Oct 2008 13:09:45 GMT
Server: Apache
X-Powered-By: PHP/5.2.6RC4-pl0-gentoo
Set-Cookie: PHPSESSID=a97a60f86539b5502ad1109f6759585c; path=/
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
Connection: close
Content-Type: text/html



Connection to host lost.

如果已安装PHP,则可以使用phpinfo命令查看信息:
<?php phpinfo(); ?>

2
phpinfo()并不总是透露Apache版本,至少在使用CGI/FastCGI时不会。 - Simon East

4

Apache服务器发布的版本信息级别可以通过其配置中的ServerTokens设置进行配置。

我认为还有一个设置可以控制版本是否出现在服务器错误页面上,尽管我不能立刻想起它是什么。如果您没有直接访问服务器,并且服务器管理员胜任并且不希望您知道他们正在运行的版本...我认为您可能会SOL


1

通过端口80 Telnet到主机。

输入:

get / http1.1
::enter::
::enter::

这有点像HTTP请求,但是不是有效的,因此它会给你返回500错误,可能会提供你需要的信息。末尾的空行很重要,否则它会看起来停滞不前。


1

只需使用以下类似的代码 - 字符串应该已经存在:

<?php
   if(isset($_SERVER['SERVER_SOFTWARE'])){
      echo $_SERVER['SERVER_SOFTWARE'];
   }
?>

0
如果他们启用了错误页面,您可以访问一个不存在的页面并查看 404 页面底部。

如果主机启用了自定义的404处理程序,则此方法将无效,例如http://www.microsoft.com/this_is_a_made_up_page。 - ConroyP

0
在默认安装中,调用一个不存在的页面会得到一个带有版本号结尾的错误信息:
Object not found!
所请求的 URL 在此服务器上未找到。如果您手动输入了 URL,请检查拼写并重试。
如果您认为这是服务器错误,请联系网站管理员。
Error 404
localhost
10/03/08 14:41:45
Apache/2.2.8 (Win32) DAV/2 mod_ssl/2.2.8 OpenSSL/0.9.8g mod_autoindex_color PHP/5.2.5

0

你最好的选择是通过PHP实现:由于你的Apache可能配置了ServerTokens Prod和ServerSignature Off,因此无法信任来自客户端的所有版本请求。请参见:http://www.petefreitag.com/item/419.cfm


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接