码迷,mamicode.com
首页 > Web开发 > 详细

HTTP响应消息头泄露信息的处理

时间:2015-04-11 06:46:02      阅读:1019      评论:0      收藏:0      [点我收藏+]

标签:http 信息

    一些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/下载安装。

 

本文出自 “天高任鸟飞,海阔凭鱼跃” 博客,请务必保留此出处http://xjlegend.blog.51cto.com/59163/1631074

HTTP响应消息头泄露信息的处理

标签:http 信息

原文地址:http://xjlegend.blog.51cto.com/59163/1631074

(1)
(1)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!