首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用protection=validation解密.ASPXAUTH Cookie

用protection=validation解密.ASPXAUTH Cookie
EN

Stack Overflow用户
提问于 2012-08-29 02:53:24
回答 2查看 4.9K关注 0票数 12

很长一段时间以来,我一直在尝试破译ASP cookie,并使用.ASPXAUTH解密它。我的理由很多,我需要这样做,没有其他选择。到目前为止,在PHP中,我已经成功地从这个cookie中读取了数据,但在加密的情况下,我似乎无法做到这一点。不管怎样,它开始了.

首先,您需要更改服务器的Web.config文件(需要将保护设置为验证):

代码语言:javascript
复制
    <authentication mode="None">
        <forms name=".ASPXAUTH" protection="Validation" cookieless="UseCookies" timeout="10080" enableCrossAppRedirects="true"/>
    </authentication>

然后在同一个域上的PHP脚本中,您可以执行以下操作来读取数据,这是一个非常基本的示例,但这是证明:

代码语言:javascript
复制
$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,或者至少是未加密的数据:

现在我知道我可以获得数据了,我从我的Web.config中删除了“protection=”validation“”字符串,并尝试使用PHP mcrypt解密它。我已经尝试了无数的方法,但这里有一个很有希望的例子(失败了)……

代码语言:javascript
复制
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(),似乎什么都不起作用。我已经找到了这个stackoverflow post here,并开始使用使用sha256制作的key/iv的变体,但这也不是真正有效。

有谁知道我该怎么做吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-09-12 17:57:27

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

假设加密是在AES CBC-IV模式下进行的,使用随机生成的IV,您需要首先找出IV在哪里。

您显示的代码片段无法工作,因为您正在生成一个随机IV (这将是不正确的)。也就是说,即使你弄错了IV,在CBC模式下,你只会有解密密文的前16个字节“乱码”,其余的会正确解密-你可以用这个作为测试,看看你是否正确地做了其余的事情。在实践中,当使用随机In时,它很可能被放在密文前面。要检查这是否正确,您可以尝试检查len(密文)=len(明文)+ 16。这意味着最有可能的前16个字节是您的IV (因此在尝试解密之前应将其从密文中删除)。

同样在您的代码片段中,您似乎将键用作ascii-string,而它应该是一个字节数组。尝试:

代码语言:javascript
复制
define('ASP_DECRYPT_KEY',hex2bin('0BC95D748C57F6162519C165E0C5DEB69EA1145676F453AB93DA9645B067DFB8'));

此外,这似乎是一个32字节的密钥,因此您需要使用AES-256。我不知道authcookie是什么样子的,但如果它是base64编码的,显然你还需要首先解码它。

希望这能有所帮助!

注意:我不会对重要的产品代码进行重新注释--因为如果你尝试实现你自己的解密例程,就像你在这里做的那样,有很多事情可能会出错。特别是,我猜应该有一个MAC标签,你必须在尝试解密之前检查它,但还有许多其他事情可能会在实现你自己的加密时出错。

票数 5
EN

Stack Overflow用户

发布于 2013-06-12 00:15:25

我知道这对于OP来说可能是不可能的,但对于其他人来说,这里是一个简单的替代方案。

  1. 使用如下方法创建.net web服务:

公共FormsAuthenticationTicket票证(String DecryptFormsAuthCookie)

{

return FormsAuthentication.Decrypt(工单);

}

  • 将cookie从PHP传递到web服务:

$authCookie = $_COOKIE'.ASPXAUTH';

$soapClient =新的SoapClient(“http://localhost/Service1.svc?wsdl"”);

$params=数组(

"ticket“=> $authCookie

);

$result = $soapClient->DecryptFormsAuthCookie($params);

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12165619

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档