很长一段时间以来,我一直在尝试破解ASP .ASPXAUTH cookie并使用PHP解密它。我的理由是巨大的,我需要这样做,没有其他选择。到目前为止,在PHP中我成功地设法从这个cookie中读取数据,但是在加密时我似乎无法做到这一点。无论如何,这里...... ...
首先,您需要更改服务器Web.config文件(保护需要设置为Validation):
<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,或者至少是未加密的数据:
既然我知道我可以获取数据,我从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 vs 256)。我试过base64_decode()ing,似乎没什么用。我发现了这个stackoverflow post here,并开始使用使用sha256制作的键/ iv的变体,但这也不是真的有效。
任何人都知道我应该做什么?
答案 0 :(得分:5)
我不知道如何在.NET AuthCookies中进行加密,但我可以尝试回答。
假设加密发生在AES CBC-IV模式下,随机生成的IV,您需要先找出IV的位置。
您显示的代码段无法正常工作,因为您正在生成随机IV(这将是不正确的)。话虽这么说,即使你得到IV错误,在CBC模式下你只会让你解密的密文的前16个字节“乱码”,其余的将正确解密 - 你可以用它作为测试来知道你是不是正确地做其余的事。在使用随机IV时,实际上它很可能是在密文之前。要检查这是否正确,您可以尝试检查len(密文)= len(明文)+ 16.这意味着前16个字节很可能是您的IV(因此在尝试之前应将其从密文中删除)解密它。)
同样在你的代码片段中,你似乎使用了密钥作为ascii-string,而它应该是一个字节数组。尝试:
define('ASP_DECRYPT_KEY',hex2bin('0BC95D748C57F6162519C165E0C5DEB69EA1145676F453AB93DA9645B067DFB8'));
此外,这似乎是一个32字节的密钥,因此您需要使用AES-256。我不知道authcookie是怎么样的,但是如果它是base64编码的,你还需要先解码它。
希望这有帮助!
注意:我不建议对重要的生产代码执行此操作 - 但是,如果您尝试实现自己的解密例程,那么有很多事情可能会出错。特别是,我猜想在尝试解密之前,某些地方应该有必须检查的MAC标记,但是还有很多其他的事情可能会在实现你自己的加密时出错。
答案 1 :(得分:1)
我知道OP可能无法做到这一点,但是对于其他人来说这是一个简单的选择。
使用以下方法创建.net Web服务:
public FormsAuthenticationTicket DecryptFormsAuthCookie(string ticket)
{
return FormsAuthentication.Decrypt(ticket);
}
从PHP传递cookie到Web服务:
$ authCookie = $ _COOKIE ['。ASPXAUTH'];
$ soapClient = new SoapClient(“http:// localhost
/Service1.svc?wsdl”);
$ params = array(
“ticket”=&gt; $ authCookie
);
$ result = $ soapClient-&gt; DecryptFormsAuthCookie($ params);
答案 2 :(得分:-1)
我知道用PHP解密的东西在.NET中解密是多么痛苦,反之亦然。
我不得不自己编写Rijndael算法(用其他语言翻译)。
以下是算法源代码的链接:http://pastebin.com/EnCJBLSY
在源代码的末尾有一些用法示例。
但是在.NET上,加密时应该使用零填充。还用ECB模式测试它,我不确定CBC是否有效。
祝你好运,希望有所帮助
编辑:算法在加密时返回十六进制字符串,并在解密时也需要十六进制字符串。