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,似乎没有任何效果。我在这里找到了这个 stackoverflow 帖子并开始使用使用 sha256 制作的 key/iv 的变体,但这也不是真的有效。

有人知道我应该怎么做吗?

4

3 回答 3

5

我不知道 .NET AuthCookies 是如何加密的,但我可以尝试回答。

假设加密发生在 AES CBC-IV 模式下,使用随机生成的 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 服务:

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

  2. 从 PHP 将 cookie 传递给 Web 服务:

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

于 2013-06-11T16:15:24.807 回答
-1

我知道用 PHP 解密在 .NET 中加密的东西是多么痛苦,反之亦然。

我最终不得不自己编写 Rijndael 算法(从另一种语言翻译过来)。

这里是算法源代码的链接:http: //pastebin.com/EnCJBLSY

在源代码的末尾有一些使用示例。

但是在 .NET 上,加密时应该使用零填充。也用ECB模式测试它,我不确定CBC是否有效。

祝你好运,希望它有所帮助

编辑:算法在加密时返回十六进制字符串,并且在解密时也期望十六进制字符串。

于 2012-09-11T18:15:16.180 回答