12

かなり長い間、ASP .ASPXAUTH cookie を解読し、PHP を使用して解読しようとしてきました。私の理由は非常に大きく、これを行う必要があります。代替手段はありません。これまでの PHP では、この Cookie からデータを読み取ることができましたが、暗号化されている間は読み取れないようです。とにかく、ここに行きます...

まず、サーバーの Web.config ファイルを変更する必要があります (保護を検証に設定する必要があります)。

    <authentication mode="None">
        <forms name=".ASPXAUTH" protection="Validation" cookieless="UseCookies" timeout="10080" enableCrossAppRedirects="true"/>
    </authentication>

次に、同じドメインの PHP スクリプトで、次のようにしてデータを読み取ることができます。これは非常に基本的な例ですが、その証拠です。

$authCookie = $_COOKIE['_ASPXAUTH'];
echo 'ASPXAUTH: '.$authCookie.'<br />'."\n";//This outputs your plaintext hex cookie
$packed = pack("H*",$authCookie);
$packed_exp = explode("\0",$packed);//This will separate your data using NULL
$random_bytes = array_shift($packed_exp);//This will shift off the random bytes
echo print_r($packed_exp,TRUE); //This will return your cookies data without the random bytes

これにより、Cookie、または少なくとも暗号化されていないデータが分解されます。

http://i.stack.imgur.com/stisu.jpg

データを取得できることがわかったので、Web.config から 'protection="validation"' 文字列を削除し、PHP mcrypt を使用して復号化を試みました。私は数え切れないほどの方法を試しましたが、ここに有望な例があります(失敗します)...

define('ASP_DECRYPT_KEY','0BC95D748C57F6162519C165E0C5DEB69EA1145676F453AB93DA9645B067DFB8');//This is a decryption key found in my Machine.config file (please note this is forged for example)
$iv = mcrypt_create_iv(mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_CBC), MCRYPT_RAND);
$decrypted = mcrypt_decrypt(MCRYPT_RIJNDAEL_128, ASP_DECRYPT_KEY, $authCookie, MCRYPT_MODE_CBC, $iv);//$authCookie is the pack()'d cookie data

ただし、これは失敗します。16バイトですべてゼロのIVのバリエーションを試しました。さまざまな Rijndael サイズ (128 対 256) を試しました。base64_decode()ing を試しましたが、何も機能していないようです。このスタックオーバーフローの投稿を見つけて、 sha256を使用して作成された key/iv のバリエーションを使用し始めましたが、実際には機能していません。

誰が私が何をすべきか手がかりを持っていますか?

4

3 に答える 3

5

.NET AuthCookies で暗号化がどのように行われるかはわかりませんが、答えてみることはできます。

ランダムに生成された IV を使用して AES CBC-IV モードで暗号化が行われると仮定すると、最初に IV の場所を見つける必要があります。

ランダムな IV を生成しているため (これは正しくありません)、表示されているコード スニペットは機能しません。そうは言っても、IV を間違えたとしても、CBC モードでは、復号化された暗号文の最初の 16 バイトのみが「文字化け」し、残りは適切に復号化されます。残りを正しく行う。実際には、ランダムな IV を使用する場合、暗号文の先頭に追加される可能性が非常に高くなります。これが正しいかどうかを確認するには、len(ciphertext) = len(plaintext) + 16 かどうかを確認してみてください。これは、最初の 16 バイトが IV である可能性が高いことを意味します (したがって、暗号化を試みる前に暗号文から削除する必要があります)。解読します)。

また、コード スニペットでは、キーを ascii 文字列として使用しているようですが、バイト配列である必要があります。試す:

define('ASP_DECRYPT_KEY',hex2bin('0BC95D748C57F6162519C165E0C5DEB69EA1145676F453AB93DA9645B067DFB8'));

また、これは 32 バイトのキーのようですので、AES-256 を使用する必要があります。authcookie がどのように見えるかはわかりませんが、base64 でエンコードされている場合は、明らかに最初にデコードする必要もあります。

お役に立てれば!

注: ただし、重要な製品コードに対してこれを行うことはお勧めしません。ここで行っているように、独自の復号化ルーチンを実装しようとすると、うまくいかないことがたくさんあるからです。特に、復号化を試みる前に確認しなければならない MAC タグがどこかにあるはずですが、独自の暗号を実装するとうまくいかないことが他にもたくさんあります。

于 2012-09-12T09:57:27.193 に答える
1

OPにはこれが不可能だったかもしれないことは理解していますが、このルートを下る他の人々にとっては、ここが簡単な代替手段です.

  1. 次のような方法で .net Web サービスを作成します。

    public FormsAuthenticationTicket DecryptFormsAuthCookie(string ticket)
    {
    return FormsAuthentication.Decrypt(ticket);
    }

  2. PHP から Web サービスに Cookie を渡します。

    $authCookie = $_COOKIE['.ASPXAUTH'];
    $soapClient = new SoapClient("http:// localhost/Service1.svc?wsdl");
    $params= array(
    "ticket" => $authCookie
    );
    $result = $soapClient->DecryptFormsAuthCookie($params);

于 2013-06-11T16:15:24.807 に答える
-1

.NET で暗号化されたものを PHP で復号化したり、その逆を行ったりするのがどれほど面倒なことかはわかっています。

最終的には、Rijndael アルゴリズム (別の言語から翻訳したもの) を自分でコーディングする必要がありました。

アルゴリズムのソース コードへのリンクは次のとおりです: http://pastebin.com/EnCJBLSY

ソースコードの最後に使用例があります。

ただし、.NET では、暗号化するときにゼロ パディングを使用する必要があります。また、ECB モードでテストします。CBC が機能するかどうかはわかりません。

頑張って、それが役立つことを願っています

編集:アルゴリズムは、暗号化時に 16 進数文字列を返し、復号化時にも 16 進数文字列を期待します。

于 2012-09-11T18:15:16.180 に答える