WebSurfer's Home

トップ > Blog 1   |   ログイン
APMLフィルター

パラメータ d の値を復号

by WebSurfer 2013年4月12日 15:15

WebResource.axd や ScriptResource.axd のクエリ文字列のパラメータ d の値を復号化する方法を備忘録として書いておきます。

パラメータ d の値を復号

利用目的は、WebResource.axd や ScriptResource.axd に指定されているリソースを特定するためです。クエリ文字列のパラメータ d にはリソースが指定されています。しかし、パラメータ d は暗号化されているため、リソースを特定するためには復号しなければなりません。

内容は、先の記事「WebResource.axd の HTTP 404 エラー」で紹介したページのコードとほとんど同じですが、リンク切れになると困るので、主要な部分のみ抜き出しました。

上の画像を表示したコードは以下の通りです。このページを運用環境に含めたり、一般に公開したりすると、セキュリティ上の問題が生ずる恐れがありますので注意してください。

<%@ Page Language="C#" %>
<%@ Import Namespace="System.Web.Configuration" %>
<%@ Import Namespace="System.Reflection" %>
<%@ Import Namespace="System.Text.RegularExpressions" %>
<%@ Import Namespace="System.Text" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<script runat="server">
  protected void Button1_Click(object sender, EventArgs e)
  {
    string input = TextBox1.Text;
    if (string.IsNullOrEmpty(input))
    {
      Label1.Text = string.Empty;
      Label2.Text = string.Empty;
      return;
    }

    string pattern = "d=(?<param>[^&]+)&";
    Match match = Regex.Match(input, pattern);
    if (!match.Success)
    {
      Label1.Text = string.Empty;
      Label2.Text = string.Empty;
      return;
    }
    GroupCollection groups = match.Groups;
    string data = groups["param"].Value;        

    byte[] encryptedData =
        HttpServerUtility.UrlTokenDecode(data);
    if (encryptedData == null)
    {
      Label1.Text = data;
      Label2.BackColor = System.Drawing.Color.Red;
      Label2.Text = "無効なパラメータ";
      return;
    }
        
    Type machineKeySection = typeof(MachineKeySection);
    Type[] paramTypes = new Type[] { typeof(bool), 
                                     typeof(byte[]), 
                                     typeof(byte[]), 
                                     typeof(int), 
                                     typeof(int) };
    MethodInfo methodInfo = machineKeySection.GetMethod(
            "EncryptOrDecryptData",
            BindingFlags.Static | BindingFlags.NonPublic,
            null,
            paramTypes,
            null);

    try
    {
      byte[] decryptedData = (byte[])methodInfo.Invoke(
                null,
                new object[] { false, 
                               encryptedData, 
                               null, 
                               0, 
                               encryptedData.Length });

      string decrypted = Encoding.UTF8.GetString(decryptedData);
      TextBox1.Text = string.Empty;
      Label1.Text = data;
      Label2.BackColor = System.Drawing.Color.Lime;
      Label2.Text = decrypted;
    }
    catch (TargetInvocationException)
    {
      TextBox1.Text = string.Empty;
      Label1.Text = data;
      Label2.BackColor = System.Drawing.Color.Red;
      Label2.Text = "復号に失敗";
    }
  }
</script>

<html xmlns="http://www.w3.org/1999/xhtml" >
<head id="Head1" runat="server">
  <title>d パラメータを復号</title>    
</head>
<body>
  <form id="form1" runat="server">
  <div>
    URL をコピー&ペースト
    <asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
    <asp:Button ID="Button1" 
      runat="server" Text="復号" OnClick="Button1_Click" />
    <hr />
    <asp:Label ID="Label1" runat="server"></asp:Label>
    <br />
    <asp:Label ID="Label2" runat="server"></asp:Label>
  </div>
  </form>
</body>
</html>

Tags:

ASP.NET

WebResource.axd の HTTP 404 エラー

by WebSurfer 2013年1月26日 17:09

WebResource.axd の HTTP 404 エラーのトラブルシューティングにつきいろいろ調べたので、今後役に立つかもしれない情報を備忘録として書いておきます。

まず、トラブルシューティングの情報で、ググって探した中でよさそうだと思ったページを以下に書いておきます。

Troubleshooting WebResource.axd

Web Resources Troubleshooting

前者のページでは、以下の事項がエラーの原因として挙げられています。自分もそう思います。

  1. Missing compression exclusion
  2. Slight error with compression module
  3. Missing MachineKey / ValidationKey
  4. Bad IIS setup, specifically the Application extension mapping

ただし、MSDN フォーラムで、.Net Framework 4 関連のアップデートを、すべてアンインストールしてから 再インストールしたら問題が解決したという話がありましたので、Windows Update の失敗(結果として MachineKey の設定が壊れる?)も原因として考えた方がよさそうです。

上記の 4 に関連して、"Verify that file exists" のチェックを外すよう、上に紹介したページに書かれています。その理由は、チェックを入れると iis は事前にファイルシステムに当該ファイルが存在するか確認するが、WebResource.axd というファイルはファイルシステムに存在しないのでエラーになる(結果 HTTP 404 を返す)ということだそうです。そのことは以下のページに詳しく書いてあります。

The Verify That File Exists Setting

なお、上記は iis6 の場合で、iis7 には "Verify that file exists" というチェックボックスは無いです。それに代わるものは以下のページを見てください。

Tip / Trick: how to turn off "verify file exists" in IIS7

iis7 マネージャーのハンドラマッピングの設定で、[要求のマップ先が次の場合のみハンドラを呼び出す(I)]にチェックを入れて、[ファイル(F)]を選択することが、iis6 で "Verify that file exists" にチェックを入れるのと同じことになるそうです。なので、下の画像のようにチェックを外す(resourceType="Unspecified" に設定する)必要があります。

HTTP ハンドラの設定

ただ、デフォルトで間違いなく設定される(チェックは外れている)はずなので、自分でいじったりしなければ、これが 404 エラーの原因とは考えにくいですが。

404 エラーを返すのが特定の WebResource.axd のみの場合、その WebResource.axd に指定されているリソース(ファイル)を特定したい場合があると思います。

WebResource.axd のクエリ文字列のパラメータ d には、HTTP ハンドラが取得すべきファイルが指定されています。しかし、パラメータ d は暗号化されているため、そのまま見てもどのファイルを取得しようとしているかは分かりません。

パラメータ d の詳細については MSDN マガジンの ASP.NET AJAX アプリケーションの国際化 の「動作のしくみ」のセクションを見てください。

このページに "System.Web.UI.Page クラスの内部静的メソッド DecryptString および EncryptString を使用して、ページでこれらの文字列を暗号化および復号化できます" と書いてありますが、自分が調べた限りでは、Page クラスにはそのようなメソッドは公開されていません。

WebResource.axd のパラメータ d の値を復号する方法は、以下のページが参考になると思います。

Debugging ASP.NET 2.0 Web Resources:Decrypting the URL and Getting the Resource Name

そのページの下の方に "I am attaching a standalone page that you can drop in your application’s root and request it." とありますが、その a standalone page をクリックすると WebResources.aspx というソースファイルを入手できます。

入手できたら WebResources.aspx を問題の起こっている Web アプリケーションのルート直下に配置して使ってみてください。当方で検証した限りでは問題なく復号できました。

Tags: ,

ASP.NET

About this blog

2010年5月にこのブログを立ち上げました。主に ASP.NET Web アプリ関係の記事です。

Calendar

<<  2024年4月  >>
31123456
78910111213
14151617181920
21222324252627
2829301234
567891011

View posts in large calendar