1. 程式人生 > >Web應用安全之Response Header裡的敏感資訊

Web應用安全之Response Header裡的敏感資訊

                             目錄

Web應用安全之Response Header

前言

1.1  那些敏感的header

1.2 刪除敏感的header

1.2.1 刪除server欄位

1.2.2 刪除X-Powered-By欄位

1.2.3 刪除 X-AspNet-Version欄位

1.2.4 刪除X-AspNetMvc-Version

前言

通過對Web伺服器的Banner抓取(分析response header),我們能得到關於Web伺服器、應用框架、程式語言等資訊。

下圖是某網站的http 響應頭。

1.1  那些敏感的HEADER

在上圖中圈出的部分,我們關注以下幾個欄位(針對asp.net應用常見的,並非全部):

Serverweb伺服器的版本。通常我們會看到 “Microsoft-IIS/7.5”, “nginx/1.0.11” 和 “Apache”這樣的欄位。

X-Powered-Byweb應用框架資訊。常見例子,“ASP.NET”, “PHP/5.2.17” 和“UrlRewriter.NET 2.0.0”。

X-AspNet-Version:asp.net版本,只有asp.net站點有這樣的header

X-AspNetMvc-Version:asp.net mvc 版本使用asp.net mvc框架會有此欄位。

通常情況下這些資訊並不會直接帶來危險,但是如果某一天IIS的某個版本爆了一個0day漏洞,那麼攻擊者會根據響應頭在很短的時間內找到大批的IIS站點進行攻擊。另外攻擊者會根據蒐集到的資訊結合已有漏洞進行推論和嘗試,正確的資訊會加快攻擊者找到漏洞的步伐。

1.2 刪除敏感的HEADER

接下來以我本地的asp.net mvcz站點為例,講解如何刪除響應頭中的敏感欄位。

1.2.1 刪除SERVER欄位

這裡需要用到IIS擴充套件工具Url Scan,關於Url Scan的安裝和配置項說明見之前的博文《URL Scan簡介》。

開啟URL Scan的配置檔案(C:\Windows\System32\inetsrv\urlscan\UrlScan.ini),找到“RemoveServerHeader”,將值設定為1。配置之前:

配置之後:

注意了在II8以上的版本 UrlScan 好像不能使用了,但是移除這個server去更簡單了,code 如下:以下code我在win10 上成功測試過

 public override void Init()
        {
            base.Init();
            PreSendRequestHeaders += (sender, args) => HttpContext.Current.Response.Headers.Remove("Server");
        }

1.2.2 刪除X-POWERED-BY欄位

開啟IIS管理器,切換到站點檢視,開啟“HTTP響應標頭”。

在這裡刪除X-Powered-By欄位。

1.2.3 刪除 X-ASPNET-VERSION欄位

開啟站點下的web.config,做如下配置:

<system.web>

  <httpRuntime enableVersionHeader="false/>

</system.web>

1.2.4 刪除X-ASPNETMVC-VERSION

開啟Global.asax檔案,在Application_Start函式中新增如下程式碼:

MvcHandler.DisableMvcResponseHeader = true;

最後的結果:

Net中我們為了安全或其他原因起見 可能需要修改我們的標頭報文等

以下方法我們通過使用HTTP Module來使用程式設計的方式來去除或修改它

首先我們自定義一個類CustomServerHeaderModule繼承自IHttpModule 併為PreSendRequestHeaders事件建立事件處理程式

程式碼如下:

<pre name="code" class="csharp">using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
 
namespaceCloud.ApiWeb.Models
{
    publicclassCustomServerHeaderModule : IHttpModule
    {
        publicvoidInit(HttpApplication context)
        {
            context.PreSendRequestHeaders += OnPreSendRequestHeaders;
        }
        publicvoidDispose()
        {
        }
        voidOnPreSendRequestHeaders(objectsender, EventArgs e)
        {
            //移除Server標頭
            //HttpContext.Current.Response.Headers.Remove("Server");
            //重新設定Server標頭
            HttpContext.Current.Response.Headers.Set("Server","Windows Server 2012");
        }
    }
}

是今天發生的一起靈異現象,原本寫好的 HTTP Handler 在 IIS 6.0 和 IIS 7.0 都相安無事,但是今天部署到 IIS 6.0 時,卻發生了 "This operation requires IIS integrated pipeline mode" 的錯誤,但查遍了 Web.config 的設定,也沒有什麼問題。

後來想到之前有在 Handler 中做了一個寫入 HTTP Header 的動作,當時我用的是 context.Response.Headers.Add(),後來改用了 context.Response.AddHeader() 後,問題就消失了。

我很納悶這個問題的原因,用了 Reflector 去 trace 了一下 System.Web.dll 中的程式碼,在 HttpResponse 類別找到了這段:

找到了這段:

	public NameValueCollection Headers
	{
	    get
	    {
	        if (!(this._wr is IIS7WorkerRequest))
	        {
	            throw new PlatformNotSupportedException(SR.GetString("Requires_Iis_Integrated_Mode"));
	        }
	        if (this._headers == null)
	        {
	            this._headers = new HttpHeaderCollection(this._wr, this, 0x10);
	        }
	        return this._headers;
	    }
	}
17 喵的咧 ... 會檢查目前的 HttpWorkerRequest 是不是 IIS 7 的,如果不是,就會擲出這個例外,
18 但在 MSDN Library 中卻也沒看到這方面的說明,所以 ...
    <modules runAllManagedModulesForAllRequests="true"></modules> 

總結以下以ii8以後的版本應如下

Server和X-AspNetMvc-Version 需要code 來移除

  public override void Init()
        {
            base.Init();
            PreSendRequestHeaders += (sender, args) => HttpContext.Current.Response.Headers.Remove("Server");
        }
        protected void Application_Start()
        {
            MvcHandler.DisableMvcResponseHeader = true;
        }

X-Powered-By 和 X-AspNet-Version 需要跑配置檔案來移除

<system.web>
    <compilation debug="true" targetFramework="4.6.1" />
    <httpRuntime targetFramework="4.6.1" maxQueryStringLength="2097151" enableVersionHeader="false" />
  </system.web>
  <system.webServer>
        <httpProtocol>
            <customHeaders>
                <remove name="X-Powered-By" />
            </customHeaders>
        </httpProtocol>
  </system.webServer>