一些Web服务器存在版本漏洞,就是说有些版本有漏洞,而有些版本没有。
在访问Web服务器时,返回的HTTP响应消息头(Response Header)中通常包含Server版本以及其他一些信息。这些头信息可用于网站统计分析,比如某些爬虫类搜索引擎,当然也包括攻击者进行社会工程信息收集。
事实上,有些头信息完全可以去掉或隐藏,而不影响系统正常访问,同时也节省了少许传输字节。
隐藏服务器在HTTP响应消息头中的不必要信息,是为了防止服务器的版本信息泄露,可做为提高站点安全的一项初步防护措施。
一、如何查看HTTP响应消息头
Windows/Linux下使用curl小工具可获取响应头信息。Linux发行版光盘中一般都自带curl包,只要安装即可;Windows可从http://curl.haxx.se/网站下载应版本,无需安装即可直接运行。
当然,也可用telnet命令HEAD方法直接获取响应头信息,如
$ telnet www.xxx.xxxx 80
输入以下命令(其中,“HEAD”必须大写)并按两次回车即能获取响应头信息。
HEAD / HTTP/1.0
在浏览器中也可以查看响应消息头,例如IE通过打开“开发人员工具”功能进行分类查看,Google Chrome可通过打开“审查元素”功能来查看,firefox里需要安装上firebug这个插件。当然,众多的HTTP抓包分析工具(如HttpWatch、Fiddler2)也具备这个功能。
这里以curl小工具为例。
示例:360搜索网站
$ curl -I http://www.so.com
HTTP/1.1 302 Moved Temporarily
Date: Sun, 05 Apr 2015 08:10:37 GMT
Content-Type: text/html
Content-Length: 154
Connection: keep-alive
Location: http://www.haosou.com/
该网站重定向至www.haosou.com,继续跟踪
$ curl -I http://www.haosou.com
HTTP/1.1 200 OK
Date: Sun, 05 Apr 2015 08:11:12 GMT
Content-Type: text/html
Connection: close
Vary: Accept-Encoding
Set-Cookie: GUID=DazCGzqNk4eim3qSM6w7RMLQeTaQ6WbBYM0SxmC0+lVAiVnzCpxKhihMu6boXYSBZAYymholrHXSVpYClYE=|a|1428221472.4039;expires=Tue, 04-Apr-17 08:11:12 GMT;path=/
Set-Cookie: _S=6ooi1qd05hbnhp59r64v0dohb6; expires=Sun, 05-Apr-2015 08:21:12 GMT; 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
Set-Cookie: QiHooGUID=A64C6CE468ACF3992B3A429E5E92EE6D.1428221472406; expires=Tue, 04-Apr-2017 08:11:12 GMT; path=/
Set-Cookie: QiHooGUID=D441EB2BD049F9D4AD196BA8977E9217.1428221472406; expires=Tue, 04-Apr-2017 08:11:12 GMT; path=/
Set-Cookie: so_paper_xmon=0; expires=Sat, 04-Apr-2015 08:11:12 GMT; path=/
可以看到,已经隐藏了Server头,Set-Cookie头中有用的信息是QiHooGUID,显然进行过修改。已经无法从头信息中分析猜测服务器软件部署情况。
$ curl -k -I https://mail.google.com
HTTP/1.1 200 OK
Cache-Control: private, max-age=604800
Expires: Sat, 28 Mar 2015 05:05:05 GMT
Date: Sat, 28 Mar 2015 05:05:05 GMT
Refresh: 0;URL=https://mail.google.com/mail/
Content-Type: text/html; charset=ISO-8859-1
Content-Length: 234
X-Content-Type-Options: nosniff
X-Frame-Options: SAMEORIGIN
X-XSS-Protection: 1; mode=block
Server: GSE
Alternate-Protocol: 443:quic,p=0.5
利用Tomcat建立的网站就显示了一些信息:
Server: Apache-Coyote/1.1
如果是IIS服务器,还可能会有X-Powered-By, X-AspNet-Version, and X-AspNetMvc-Version等信息。
Server: Microsoft-IIS/6.0
Server: Microsoft-IIS/7.0
Server Microsoft-IIS/7.5
X-Powered-By: ASP.NET
X-AspNet-Version 4.0.303319
X-AspNet-Version: 2.0.50727
X-AspNet-Version: 1.1.4322
X-AspNetMvc-Version: 1.0
X-AspNetMvc-Version 3.0
二、如何防止服务器HTTP响应消息头中的信息泄露呢
为了隐藏这些不必要的头信息,有各种可能的方法:
1.如果是经源代码编译而来的,可改源代码中的版本信息,具有一定的难度;
2.通过配置对版本信息进行修改或者不显示,达到以假乱真的目的,比较简单;
3.在服务器前加上反向代理软件,过滤掉这些会显示服务器版本信息的头,有些复杂。
以下主要就第2种方法,分别介绍一下常用的Web服务器如何去掉或修改Server头信息。
(一)Apache Web服务器版本号隐藏
找到配置文件apache2.conf或httpd.conf,修改其中的标记为:
ServerTokens ProductOnly
ServerSignature Off
重启apache服务
# curl -I localhost
HTTP/1.1 200 OK
Server: Apache
Accept-Ranges: bytes
Content-Length: 97
Connection: close
Content-Type: text/html
(二)Nginx服务器版本号隐藏
$ curl -I localhost
HTTP/1.1 200 OK
Server: nginx/1.6.2
Date: Sun, 05 Apr 2015 13:56:34 GMT
Content-Type: text/html
Content-Length: 612
Last-Modified: Tue, 24 Mar 2015 10:45:23 GMT
Connection: keep-alive
ETag: "5511417c-264"
Accept-Ranges: bytes
修改nginx.conf
在其中的http节加上server_tokens off;
如下:
http {
……省略配置
sendfile on;
tcp_nopush on;
keepalive_timeout 65;
tcp_nodelay on;
server_tokens off;
…….省略配置
}
重启Nginx后测试如下
$ curl -I localhost
HTTP/1.1 200 OK
Server: nginx
Date: Sun, 05 Apr 2015 13:56:34 GMT
Content-Type: text/html
Content-Length: 612
Last-Modified: Tue, 24 Mar 2015 10:50:36 GMT
Connection: keep-alive
ETag: "5511417c-264"
Accept-Ranges: bytes
彻底的办法是重新编译Nginx,直接修改代码版本号,或另行增加第三方模块HttpHeadersMore,可将Server头返回信息进行修改,或者直接去掉。
详情可参见http://wiki.nginx.org/NginxHttpHeadersMoreModule
(三) Apache+PHP隐藏PHP版本
避免http头部信息中返回“X-Powered-By: PHP/x.x.xx”字符串
修改php.ini文件:
将expose_php On
改成
expose_php Off
重启Apache后,php版本在HTTP头中隐藏了。
(四) Apache Tomcat
修改Apache Tomcat服务器返回的Server头内容Apache-Coyote/1.1
找到server.xml配置文件,路径如下:CATALINA_HOME/conf/server.xml
找到内容:
<Connection port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443"/>
修改为:
<Connection port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443"
server="VPS"/>
则用户看到的Server显示为VPS,类似如下:
Server: VPS
(五) IIS 5.1/6.0/7.0隐藏Server头
微软的系统,是没办法修改源代码重新编译的。
方法一
安装UrlScan3.1,利用UrlScan 3.1的特性,修改配置文件C:\Windows\System32\inetsrv\UrlScan\UrlScan.ini文件如下
RemoveServerHeader=1 ; If 1, remove the 'Server' header from
; response. The default is 0.
或者
RemoveServerHeader=0 ; 改成1以后不显示Server
AlternateServerName= ;如果RemoveServerHeader=0可以自己定义
即将原来的RemoveServerHeader=0改为1,并重启系统即可。
方法二
安装ServerMask小软件。这是一款可以替换或者删除服务器http头的工具。
可从http://www.port80software.com/下载安装。