Padding Oracle
Last updated
Last updated
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
In CBC mode the previous encrypted block is used as IV to XOR with the next block:
To decrypt CBC the opposite operations are done:
Notice how it's needed to use an encryption key and an IV.
As the encryption is performed in fixed size blocks, padding is usually needed in the last block to complete its length.
Usually PKCS7 is used, which generates a padding repeating the number of bytes needed to complete the block. For example, if the last block is missing 3 bytes, the padding will be \x03\x03\x03
.
Let's look at more examples with a 2 blocks of length 8bytes:
byte #0 | byte #1 | byte #2 | byte #3 | byte #4 | byte #5 | byte #6 | byte #7 | byte #0 | byte #1 | byte #2 | byte #3 | byte #4 | byte #5 | byte #6 | byte #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 |
Note how in the last example the last block was full so another one was generated only with padding.
When an application decrypts encrypted data, it will first decrypt the data; then it will remove the padding. During the cleanup of the padding, if an invalid padding triggers a detectable behaviour, you have a padding oracle vulnerability. The detectable behaviour can be an error, a lack of results, or a slower response.
If you detect this behaviour, you can decrypt the encrypted data and even encrypt any cleartext.
You could use https://github.com/AonCyberLabs/PadBuster to exploit this kind of vulnerability or just do
Щоб перевірити, чи вразливий кукі сайту, ви можете спробувати:
Кодування 0 означає, що base64 використовується (але доступні й інші, перевірте меню допомоги).
Ви також можете зловживати цією вразливістю для шифрування нових даних. Наприклад, уявіть, що вміст cookie є "user=MyUsername", тоді ви можете змінити його на "_user=administrator_" і підвищити привілеї в додатку. Ви також можете зробити це, використовуючи paduster
, вказуючи параметр -plaintext:
Якщо сайт вразливий, padbuster
автоматично спробує знайти, коли виникає помилка заповнення, але ви також можете вказати повідомлення про помилку, використовуючи параметр -error.
У резюме, ви можете почати розшифровувати зашифровані дані, вгадуючи правильні значення, які можна використовувати для створення всіх різних заповнень. Потім атака на заповнення Oracle почне розшифровувати байти з кінця на початок, вгадуючи, яке буде правильне значення, що створює заповнення 1, 2, 3 тощо.
Уявіть, що у вас є деякий зашифрований текст, який займає 2 блоки, сформовані байтами з E0 до E15. Щоб розшифрувати останній блок (E8 до E15), весь блок проходить через "дешифрування блочного шифру", генеруючи проміжні байти I0 до I15. Нарешті, кожен проміжний байт XOR'иться з попередніми зашифрованими байтами (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
Продовжуйте цю ланцюг, поки не розшифруєте весь зашифрований текст.
Зареєструйтеся та увійдіть з цим обліковим записом. Якщо ви входите багато разів і завжди отримуєте один і той же cookie, ймовірно, в додатку є щось неправильне. Cookie, що повертається, повинен бути унікальним щоразу, коли ви входите. Якщо cookie завжди один і той же, він, ймовірно, завжди буде дійсним, і не буде способу його анулювати.
Тепер, якщо ви спробуєте модифікувати cookie, ви побачите, що отримуєте помилку від програми. Але якщо ви BF заповнення (використовуючи padbuster, наприклад), ви зможете отримати інший cookie, дійсний для іншого користувача. Цей сценарій, ймовірно, вразливий до padbuster.
Вчіться та практикуйте AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Вчіться та практикуйте GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)