Exploiting __VIEWSTATE without knowing the secrets
Підказка щодо багів у винагороду: зареєструйтеся на Intigriti, преміальній платформі для пошуку багів, створеній хакерами для хакерів! Приєднуйтесь до нас на https://go.intigriti.com/hacktricks сьогодні, і почніть заробляти винагороди до $100,000!
Що таке ViewState
ViewState служить основним механізмом в ASP.NET для збереження даних сторінки та елементів управління на веб-сторінках. Під час рендерингу HTML сторінки поточний стан сторінки та значення, які потрібно зберегти під час повторного відправлення, серіалізуються в рядки, закодовані в base64. Ці рядки потім поміщаються в приховані поля ViewState.
Інформацію ViewState можна характеризувати наступними властивостями або їх комбінаціями:
Base64:
Цей формат використовується, коли як
EnableViewStateMac
, так іViewStateEncryptionMode
встановлені в значення false.Base64 + MAC (Message Authentication Code) Enabled:
Активація MAC досягається шляхом встановлення атрибуту
EnableViewStateMac
в значення true. Це забезпечує перевірку цілісності даних ViewState.Base64 + Encrypted:
Шифрування застосовується, коли атрибут
ViewStateEncryptionMode
встановлений в значення true, забезпечуючи конфіденційність даних ViewState.
Тестові випадки
Зображення - це таблиця, що деталізує різні конфігурації ViewState в ASP.NET на основі версії .NET framework. Ось підсумок вмісту:
Для будь-якої версії .NET, коли обидва MAC та Шифрування вимкнені, MachineKey не потрібний, тому немає застосовного методу для його ідентифікації.
Для версій нижче 4.5, якщо MAC увімкнено, але Шифрування ні, потрібен MachineKey. Метод ідентифікації MachineKey називається "Blacklist3r."
Для версій нижче 4.5, незалежно від того, чи MAC увімкнено чи вимкнено, якщо Шифрування увімкнено, потрібен MachineKey. Ідентифікація MachineKey - завдання для "Blacklist3r - майбутній розвиток."
Для версій 4.5 і вище, всі комбінації MAC та Шифрування (чи обидва true, чи одне true, а інше false) потребують MachineKey. MachineKey можна ідентифікувати за допомогою "Blacklist3r."
Тестовий випадок: 1 – EnableViewStateMac=false та viewStateEncryptionMode=false
Також можливо повністю вимкнути ViewStateMAC, встановивши ключ реєстру AspNetEnforceViewStateMac
на нуль в:
Визначення атрибутів ViewState
Ви можете спробувати визначити, чи захищений параметр ViewState за допомогою MAC, захопивши запит, що містить цей параметр за допомогою BurpSuite. Якщо MAC не використовується для захисту параметра, ви можете використати його за допомогою YSoSerial.Net
Тестовий випадок 1.5 - Як тестовий випадок 1, але параметр ViewState cookie не відправляється сервером
Розробники можуть видалити ViewState з частини запиту HTTP (користувач не отримає це печиво). Можна припустити, що якщо ViewState відсутній, їхня реалізація захищена від будь-яких потенційних вразливостей, що виникають з десеріалізацією ViewState. Однак це не так. Якщо ми додаємо параметр ViewState до тіла запиту і відправляємо наш серіалізований навантаження, створений за допомогою ysoserial, ми все ще зможемо досягти виконання коду, як показано в Випадок 1.
Тестовий випадок: 2 - .Net < 4.5 та EnableViewStateMac=true & ViewStateEncryptionMode=false
Для увімкнення ViewState MAC для конкретної сторінки нам потрібно внести наступні зміни у конкретний файл aspx:
Ми також можемо зробити це для загального застосування, встановивши його в файлі web.config, як показано нижче:
Якщо параметр захищений MAC, щоб успішно виконати атаку, спочатку нам потрібен використаний ключ.
Ви можете спробувати використати Blacklist3r(AspDotNetWrapper.exe) , щоб знайти використаний ключ.
Badsecrets - це ще один інструмент, який може ідентифікувати відомі machineKeys. Він написаний на Python, тому, на відміну від Blacklist3r, він не має залежності від Windows. Для .NET viewstates існує утиліта "python blacklist3r", яка є найшвидшим способом використання його.
Можна постачати його або безпосередньо з viewstate та генератором:
Або він може підключитися безпосередньо до цільового URL та спробувати вирізати viewstate з HTML:
Для пошуку вразливих viewstates в масштабі, разом з переліком піддоменів, можна використовувати модуль badsecrets
BBOT.
Якщо ви маєте щастя і ключ знайдено, ви можете продовжити атаку, використовуючи YSoSerial.Net:
У випадках, коли параметр _VIEWSTATEGENERATOR
не відправляється сервером, вам не потрібно надавати параметр --generator
, але ці:
Тестовий випадок: 3 - .Net < 4.5 та EnableViewStateMac=true/false та ViewStateEncryptionMode=true
У цьому випадку невідомо, чи захищений параметр за допомогою MAC. Тоді значення, ймовірно, зашифроване, і вам потрібен Machine Key для шифрування вашого навантаження, щоб використати уразливість.
У цьому випадку Blacklist3r модуль знаходиться в стадії розробки...
До .NET 4.5, ASP.NET може приймати незашифрований параметр __VIEWSTATE від користувачів, навіть якщо ViewStateEncryptionMode
встановлено на Always. ASP.NET лише перевіряє наявність параметра __VIEWSTATEENCRYPTED
у запиті. Якщо ви видалите цей параметр і надішлете незашифроване навантаження, воно все одно буде оброблено.
Отже, якщо зловмисники знайдуть спосіб отримати Machinekey через іншу уразливість, наприклад, обхід файлів, YSoSerial.Net команда, використана в Випадку 2, може бути використана для виконання RCE за допомогою уразливості десеріалізації ViewState.
Видаліть параметр
__VIEWSTATEENCRYPTED
з запиту, щоб використати уразливість десеріалізації ViewState, інакше буде повернута помилка перевірки MAC Viewstate, і експлойт не вдасться.
Тестовий випадок: 4 - .Net >= 4.5 та EnableViewStateMac=true/false та ViewStateEncryptionMode=true/false, крім обох атрибутів, що встановлені на false
Ми можемо змусити використання ASP.NET framework, вказавши нижченаведений параметр у файлі web.config, як показано нижче.
Альтернативно, це можна зробити, вказавши нижченаведену опцію всередині параметра machineKey
файлу web.config.
Як і раніше значення зашифроване. Тоді, щоб надіслати дійсний політ, зловмиснику потрібен ключ.
Ви можете спробувати використати Blacklist3r(AspDotNetWrapper.exe) , щоб знайти використовуваний ключ:
Для отримання більш детального опису для IISDirPath та TargetPagePath дивіться тут
Або, з Badsecrets (зі значенням генератора):
Після того, як ідентифіковано дійсний ключ машини, наступним кроком є генерація серіалізованого навантаження за допомогою YSoSerial.Net
Якщо у вас є значення __VIEWSTATEGENERATOR
, ви можете спробувати використати параметр --generator
з цим значенням та пропустити параметри --path
та --apppath
Успішна експлуатація уразливості десеріалізації ViewState призведе до відправлення запиту на сервер, який контролюється зловмисником, і який включає ім'я користувача. Цей вид експлойту демонструється у доказовому концепції (PoC), яку можна знайти за ресурсом під назвою "Exploiting ViewState Deserialization using Blacklist3r and YsoSerial.NET". Для отримання додаткових відомостей про те, як працює процес експлуатації та як використовувати інструменти, такі як Blacklist3r для ідентифікації MachineKey, ви можете переглянути наданий PoC of Successful Exploitation.
Тестовий випадок 6 – Використання ViewStateUserKeys
Властивість ViewStateUserKey може бути використана для захисту від атаки CSRF. Якщо такий ключ був визначений у додатку і ми намагаємося згенерувати навантаження ViewState за методами, які обговорювалися до цього часу, навантаження не буде оброблено додатком. Вам потрібно використовувати ще один параметр, щоб правильно створити навантаження:
Результат успішної експлуатації
Для всіх випробувань, якщо пакунок ViewState YSoSerial.Net працює успішно, сервер відповідає "500 Internal server error" з вмістом відповіді "The state information is invalid for this page and might be corrupted" і ми отримуємо запит OOB.
Перевірте додаткову інформацію тут
Посилання
Підказка щодо багів: зареєструйтесь на Intigriti, преміальній платформі для пошуку багів, створеній хакерами для хакерів! Приєднуйтесь до нас на https://go.intigriti.com/hacktricks сьогодні, і почніть заробляти винагороди до $100,000!
Last updated