Расшифровка .ASPXAUTH Cookie с защитой = проверка

В течение некоторого времени я пытался расшифровать файл cookie ASP .ASPXAUTH и расшифровать его с помощью 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

Теперь, когда я знаю, что могу получить данные, я удалил строку «protection =» validation «» из моего Web.config, и я попытался расшифровать ее с помощью 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 (), ничего не работает. Я нашел здесь сообщение stackoverflow и начал использовать вариации ключа / iv, которые были сделаны с помощью sha256, но это тоже не работает.

Кто-нибудь знает, что я должен делать?

Я не знаю, как шифрование выполняется в .NET AuthCookies, но я могу попытаться ответить.

Предполагая, что шифрование происходит в режиме AES CBC-IV, со случайным образом генерируемым IVs, вам нужно сначала узнать, где находится 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-тег, который вы должны проверить перед попыткой дешифрования, но есть много других вещей, которые могут пойти не так, как реализовать собственный криптографический код.

Я понимаю, что это возможно было невозможно для ОП, но для других людей, направляющихся по этому маршруту, это простая альтернатива.

  1. Создайте веб-службу .net с помощью метода, такого как:

    public FormsAuthenticationTicket DecryptFormsAuthCookie (строковый билет)
    {
    return FormsAuthentication.Decrypt (билет);
    }

  2. Передача cookie на веб-службу с PHP:

    $ authCookie = $ _COOKIE ['. ASPXAUTH'];
    $ soapClient = новый SoapClient ("http: // localhost /Service1.svc?wsdl");
    $ params = array (
    "билет" => $ authCookie
    );
    $ result = $ soapClient-> DecryptFormsAuthCookie ($ params);

Я знаю, какая боль заключается в расшифровке в PHP чего-то зашифрованного в .NET и наоборот.

Мне пришлось в конечном итоге кодировать алгоритм Rijndael (переводил его с другого языка).

Вот ссылка на исходный код алгоритма: http://pastebin.com/EnCJBLSY

В конце исходного кода есть пример использования.

Но на .NET вы должны использовать нулевое заполнение при шифровании. Также проверьте его в режиме ECB, я не уверен, работает ли CBC.

Удачи и надеюсь, что это поможет

edit: алгоритм возвращает шестнадцатеричную строку при шифровании, а также ожидает шестнадцатеричную строку при расшифровке.