Расшифровка.Файл cookie ASPXAUTH С защитой= проверка


Уже довольно давно я пытаюсь расшифровать ASP.Файл cookie 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

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

У кого-нибудь есть подсказка, что мне делать?

Author: Community, 2012-08-28

3 answers

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

Предполагая, что шифрование происходит в режиме AES CBC-IV, со случайно сгенерированными капельницами, вам нужно сначала выяснить, где находится капельница.

Фрагмент кода, который вы показываете, не может работать, так как вы генерируете случайный IV (что будет неверно). При этом, даже если вы неправильно введете IV, в режиме CBC у вас будут "искажены" только первые 16 байтов вашего расшифрованного зашифрованного текста, а остальные будут расшифруйте правильно - вы можете использовать это в качестве теста, чтобы узнать, правильно ли вы делаете все остальное. На практике при использовании случайных капельниц очень вероятно, что они добавляются к зашифрованному тексту. Чтобы проверить, правильно ли это, вы можете попробовать проверить, является ли len(зашифрованный текст) = len(открытый текст) + 16. Это означало бы, что, скорее всего, первые 16 байт - это ваш IV (и поэтому его следует удалить из зашифрованного текста, прежде чем пытаться его расшифровать).

Также в вашем фрагменте кода, похоже, вы используете ключ в качестве ascii-строка, тогда как она должна быть массивом байтов. Попробуйте:

define('ASP_DECRYPT_KEY',hex2bin('0BC95D748C57F6162519C165E0C5DEB69EA1145676F453AB93DA9645B067DFB8'));

Кроме того, похоже, что это 32-байтовый ключ, поэтому вам нужно использовать AES-256. Я не знаю, как выглядит authcookie, но если он закодирован в base64, вам также, очевидно, сначала нужно его декодировать.

Надеюсь, это поможет!

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

 5
Author: addalbx, 2012-09-12 09:57:27

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

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

    Общедоступные формы проверки подлинности для расшифровки формыsauthcookie(строковый билет)
    {
    верните формы проверки подлинности.Расшифровать (билет);
    }

  2. Передать файл cookie веб-сервису с PHP:

    $Аутентификация= $_ КУКИ['.ASPXAUTH'];
    $SoapClient =новый SoapClient("http://localhost/Service1.svc?wsdl");
    $параметры=массив(
    "билет" => $AuthCookie
    );
    $результат =$SoapClient->decryptformsauthcookie($параметры);

 1
Author: Omiron, 2013-06-11 16:20:30

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

В итоге мне пришлось самому кодировать алгоритм Рейндаэля (перевел его с другого языка).

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

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

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

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

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

 -1
Author: cprogcr, 2012-09-11 18:26:20