2017-05-09 138 views
1

環境:4.6.2(Webフォームを使用して)潜在的に危険なRequest.Path値がクライアントから検出された

Windows Serverの:

は8.5

.NET FrameworkのバージョンのIIS 2012 R2

問題:

を次例外が報告されている:私たちのログに示さ

BASE EXCEPTION: System.Web.HttpException (0x80004005): A potentially dangerous Request.Path value was detected from the client (?). 
    at System.Web.HttpRequest.ValidateInputIfRequiredByConfig() 
    at System.Web.HttpApplication.PipelineStepManager.ValidateHelper(HttpContext context) 

BASE EXCEPTION HRESUT: -2147467259 

EXCEPTION: System.Web.HttpException (0x80004005): A potentially dangerous Request.Path value was detected from the client (?). 
    at System.Web.HttpRequest.ValidateInputIfRequiredByConfig() 
    at System.Web.HttpApplication.PipelineStepManager.ValidateHelper(HttpContext context) 

その他の情報:

PATH_INFO 
/cities/index.aspx?locid=4163 
---- 
QUERY_STRING 
---- 
REMOTE_ADDR 
66.249.65.204 
---- 
REMOTE_HOST 
66.249.65.204 
---- 
REQUEST_METHOD 
GET 
---- 
SCRIPT_NAME 
/cities/index.aspx?locid=4163 
---- 
URL 
/cities/index.aspx?locid=4163 
---- 
HTTP_FROM 
googlebot(at)googlebot.com 
---- 
HTTP_USER_AGENT 
Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html) 

私は理解していないことは、私はカットし、私のブラウザでパスを貼り付けた場合、ページがうまくレンダリングされていると間違いなく。

質問:

  1. はなぜGooglebotが、ページをクロールするときは、このエラーが発生しない、まだ私は、ブラウザのパスを入力したときにエラーが発生していませんか? (私はそれが存在するにもかかわらず、エラーログにはクエリ文字列の値が表示されないことが奇妙なことがわかります)。
  2. なぜ "?"潜在的に危険と考えられる人物?

パスが実際に有効なときにこの特定の「エラー」がどのように発生しているかを理解しようとしているので、アドバイスをいただければ幸いです。

ありがとうございます。

答えて

0

クエリ文字列は、私たちのログには何も表示されなかった理由は私に夜が明けました。 「?」をエンコードするリクエスト「(%3fが)、例えば、上述の例外が発生する原因となる。

/cities/index.aspx%3flocid=4163 

エンコード%の3Fは、パスの一部として解釈され、それゆえの例外」潜在的に危険なRequest.Path値でした

ブラウザに上記のURLを入力したときに例外が発生し、ログにクエリー文字列が含まれていないため、すべてが正常に機能していると仮定できます。リクエスタは、それらが存在してはならないときに?をエンコードしており、基本的にはURLのクエースリング部分を破壊しています。

また、h ave requestValidationMode = "2.0" system.webでは、しかし、requestPathInvalidCharacters(httpRuntime)設定を使用しないでください。

1

Asp.net 4.0以降では、厳密な検証が導入されています。あなたが見ているエラーは、その一部である可能性があります。 XSS攻撃の原因となる可能性のある特定の危険な文字がURLにあります。その中には?があります。次のように残りの文字は、次のとおりです。

< > * % & : \ ? 

はおそらく

を次のように web configに以下の構成を設定することで、あなたはこれらの文字はあなたのURLに許可、または少なくとも特定の文字ことができる2つのソリューション

  1. があるかもしれません

    <system.web> <httpRuntime requestPathInvalidCharacters="&lt;,&gt;,*,%,&amp;,:,\,?" /> </system.web>

  2. 次に、戻ってasp.net 2.0にロールバックすることができます設定

    <system.web> <httpRuntime requestValidationMode="2.0" /> </system.web>

0

あなた(またはペンタスター)がURLのala https://domain.tld/<foobarhttps://domain.tld/</にアクセスする場合も同じことが起こります。

カスタムエラーページが有効になっていても、IISによってレンダリングされたエラーページが返されます。また、Application_Errorでエラーを記録すると、ログにスキャナ/ボット/

これは、単純な回避策として、Global.asax.csのApplication_ErrorでHttpException例外を処理することがわかりました。このようにして、requestValidationModeで微調整する必要はありません。

  1. アプリケーションのルートで以下のページを作成します。

    • 400.html - IIS
    • 400.aspx用 - ASP.NET
    • 404.htmlため - IISのために
    • 404.aspx - IIS
    • 500.aspxのための - - ASPのためのASP.NET
    • 500.htmlため。 NET

      .htmlファイルは、このALAコンテンツを持っている:

      <!DOCTYPE html> 
      <html lang="en"> 
      <head> 
          <meta charset="utf-8" /> 
          <title>400 Bad request</title> 
      </head> 
      <body> 
          <h1>400 Bad request</h1> 
      </body> 
      </html> 
      

      .aspxファイルは、このALAコンテンツがあります。

      <%@ Page Language="C#" %> 
      <% 
          Response.StatusCode = 400; 
          Server.Transfer("~/400.html"); 
      %> 
      

      をあなたが設定していることを確認してください.aspxファイル内の適切な応答ステータスコード。

  2. 設定ASP。以下のようにNETのカスタムエラー:以下のように

    <customErrors mode="RemoteOnly" redirectMode="ResponseRewrite" defaultRedirect="~/500.aspx"> 
        <error statusCode="400" redirect="~/400.aspx"/> 
        <error statusCode="404" redirect="~/404.aspx"/> 
        <error statusCode="500" redirect="~/500.aspx"/> 
    </customErrors> 
    
  3. 設定IISのカスタムエラー:適宜

    <httpErrors errorMode="DetailedLocalOnly"> 
    <remove statusCode="400"/> 
    <error statusCode="400" path="400.html" responseMode="File"/> 
    <remove statusCode="404"/> 
    <error statusCode="404" path="404.html" responseMode="File"/> 
    <remove statusCode="500"/> 
    <error statusCode="500" path="500.html" responseMode="File"/> 
    </httpErrors> 
    
  4. 調整Global.asax.cs:

    protected void Application_Error(object sender, EventArgs e) 
    { 
        var lastError = Server.GetLastError(); 
        Server.ClearError(); 
    
        if (lastError.GetType() == typeof(HttpException)) 
        { 
         Response.StatusCode = 400; 
         Server.Transfer("400.html"); 
        } 
        else 
        { 
         Response.StatusCode = 500; 
         Server.Transfer("500.html"); 
    
         // logging 
        } 
    } 
    

はどのようにセットアップカスタムエラーページとエラーハンドラの詳細についてhttps://msdn.microsoft.com/en-us/library/bb397417.aspxに完全な物語のためhttp://benfoster.io/blog/aspnet-mvc-custom-error-pagesを参照してください。

関連する問題