首先您需要更改您的服务器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,或至少是未加密的数据:
现在我知道我可以获取数据,我从我的Web.config中删除了’protection =“验证”’字符串,我试图使用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
然而这失败了.我已经尝试了IV的变化,所有零@ 16个字节.我尝试了不同的Rijndael大小(128对256).我已经尝试过base64_decode()ing,似乎没有任何工作.我发现这个stackoverflow post here,并开始使用使用sha256使用的键/ iv的变体,但这也不是真的有效.
有人有线索我应该做什么?
假设加密发生在AES CBC-IV模式下,随机生成IV,您需要首先找出IV在哪里.
您显示的代码片段无法正常工作,因为您将生成随机的IV(将不正确).话虽如此,即使你的IV错误,在CBC模式下,你将只有前16个字节的解密密文“乱码”,其余的将正确解密 – 你可以使用这个作为一个测试来知道你是否正确地休息.在实践中,当使用随机IVs时,它很可能是密文之前的.为了检查这是否正确,可以尝试检查len(ciphertext)= len(明文)16.这意味着最可能的前16个字节是你的IV(因此它应该在尝试解密之前从密文中删除它).
同样在你的代码片段中,似乎你使用的是ascii-string,而它应该是一个字节数组.尝试:
define('ASP_DECRYPT_KEY',hex2bin('0BC95D748C57F6162519C165E0C5DEB69EA1145676F453AB93DA9645B067DFB8'));
此外,这似乎是一个32字节的密钥,所以你需要使用AES-256.我不知道authcookie是怎么样的,但是如果它是base64编码的,那么你还需要先解码它,这显然是很重要的.
希望这可以帮助!
注意:我不建议在重要的生产代码中执行此操作,因为如果您尝试实现即使是您自己的解密程序,也可能出现许多问题.特别是,我猜测应该有一个MAC标签,你必须在尝试解密之前检查一下,但还有许多其他的事情可能会错误地实现你自己的加密.