Padding Oracle
CBC - Cipher Block Chaining
У режимі CBC попередній зашифрований блок використовується як IV для операції XOR з наступним блоком:
Для розшифрування CBC виконуються протилежні операції:
Зверніть увагу, що потрібно використовувати ключ шифрування та IV.
Доповнення повідомлення
Оскільки шифрування виконується у фіксованих блоках фіксованого розміру, доповнення зазвичай потрібне в останньому блоку, щоб завершити його довжину.
Зазвичай використовується PKCS7, яке генерує доповнення, повторюючи кількість байтів, необхідних для завершення блоку. Наприклад, якщо в останньому блоці не вистачає 3 байтів, доповнення буде \x03\x03\x03
.
Давайте розглянемо ще приклади з 2 блоками довжиною 8 байтів:
байт #0 | байт #1 | байт #2 | байт #3 | байт #4 | байт #5 | байт #6 | байт #7 | байт #0 | байт #1 | байт #2 | байт #3 | байт #4 | байт #5 | байт #6 | байт #7 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
P | A | S | S | W | O | R | D | 1 | 2 | 3 | 4 | 5 | 6 | 0x02 | 0x02 |
P | A | S | S | W | O | R | D | 1 | 2 | 3 | 4 | 5 | 0x03 | 0x03 | 0x03 |
P | A | S | S | W | O | R | D | 1 | 2 | 3 | 0x05 | 0x05 | 0x05 | 0x05 | 0x05 |
P | A | S | S | W | O | R | D | 0x08 | 0x08 | 0x08 | 0x08 | 0x08 | 0x08 | 0x08 | 0x08 |
Зверніть увагу, що в останньому прикладі останній блок був повним, тому був згенерований ще один лише з доповненням.
Oracle доповнення
Коли додаток розшифровує зашифровані дані, він спочатку розшифровує дані; потім він видаляє доповнення. Під час очищення доповнення, якщо недійсне доповнення викликає виявну поведінку, у вас є уразливість Oracle доповнення. Виявна поведінка може бути помилкою, відсутністю результатів або повільною відповіддю.
Якщо ви виявите цю поведінку, ви можете розшифрувати зашифровані дані та навіть зашифрувати будь-який чистий текст.
Як експлуатувати
Ви можете використовувати https://github.com/AonCyberLabs/PadBuster, щоб експлуатувати цей вид уразливості або просто виконати
Для перевірки на вразливість куки сайту ви можете спробувати:
Кодування 0 означає, що використовується base64 (але доступні й інші, перевірте меню довідки).
Ви також можете зловживати цією вразливістю для шифрування нових даних. Наприклад, уявіть, що вміст куки - "user=MyUsername", тоді ви можете змінити його на "_user=administrator_" та підняти привілеї всередині додатку. Ви також можете зробити це, використовуючи padbuster
, вказавши параметр -plaintext.
Якщо сайт вразливий, padbuster
автоматично спробує знайти помилку у доповненні, але ви також можете вказати повідомлення про помилку, використовуючи параметр -error.
Теорія
У короткому вигляді, ви можете почати розшифровувати зашифровані дані, вгадуючи правильні значення, які можуть бути використані для створення всіх різних додаткових байтів. Потім атака на оракула додаткових байтів почне розшифровувати байти з кінця до початку, вгадуючи, яке буде правильне значення, що створює додатковий байт 1, 2, 3 і т.д.
Уявіть, що у вас є зашифрований текст, який займає 2 блоки, утворені байтами від E0 до E15. Для розшифрування останнього блоку (E8 до E15), весь блок проходить через "розшифрування блоку шифру" і генерує проміжні байти I0 до I15. Нарешті, кожен проміжний байт XORed з попередніми зашифрованими байтами (E0 до E7). Таким чином:
C15 = D(E15) ^ E7 = I15 ^ E7
C14 = I14 ^ E6
C13 = I13 ^ E5
C12 = I12 ^ E4
...
Тепер можна змінити E7
до тих пір, поки C15
не буде 0x01
, що також буде правильним додатковим байтом. Таким чином, у цьому випадку: \x01 = I15 ^ E'7
Таким чином, знаходячи E'7, можна обчислити I15: I15 = 0x01 ^ E'7
Це дозволяє нам обчислити C15: C15 = E7 ^ I15 = E7 ^ \x01 ^ E'7
Знаючи C15, тепер можна обчислити C14, але цього разу методом грубої сили додаткового байту \x02\x02
.
Ця BF така ж складна, як і попередня, оскільки можливо обчислити значення E''15
, яке дорівнює 0x02: E''7 = \x02 ^ I15
, тому потрібно лише знайти E'14
, який генерує C14
, рівний 0x02
.
Потім виконайте ті самі кроки для розшифрування C14: C14 = E6 ^ I14 = E6 ^ \x02 ^ E''6
Слідуйте цьому ланцюжку, поки не розшифруєте весь зашифрований текст.
Виявлення вразливості
Зареєструйте обліковий запис та увійдіть за цим обліковим записом. Якщо ви увійдете багато разів і завжди отримуєте той самий кукі, ймовірно, в програмі є щось не так. Куки, які надсилаються назад, повинні бути унікальними кожного разу, коли ви увійдете. Якщо куки завжди однакові, вони, ймовірно, завжди будуть дійсними, і немає способу їх інвалідувати.
Тепер, якщо ви спробуєте змінити куки, ви побачите, що отримаєте помилку від програми. Але якщо ви використовуєте BF для додаткового байту (наприклад, використовуючи padbuster), ви зможете отримати інший куки, дійсний для іншого користувача. Цей сценарій ймовірно дуже вразливий до padbuster.
Посилання
Last updated