# Padding Oracle
{% hint style="success" %}
Learn & practice AWS Hacking:[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)\
Learn & practice GCP Hacking: [**HackTricks Training GCP Red Team Expert (GRTE)**](https://training.hacktricks.xyz/courses/grte)
Support HackTricks
* Check the [**subscription plans**](https://github.com/sponsors/carlospolop)!
* **Join the** π¬ [**Discord group**](https://discord.gg/hRep4RUj7f) or the [**telegram group**](https://t.me/peass) or **follow** us on **Twitter** π¦ [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
* **Share hacking tricks by submitting PRs to the** [**HackTricks**](https://github.com/carlospolop/hacktricks) and [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
{% endhint %}
## CBC - Cipher Block Chaining
In CBC mode the **previous encrypted block is used as IV** to XOR with the next block:
![https://defuse.ca/images/cbc\_encryption.png](https://defuse.ca/images/cbc\_encryption.png)
To decrypt CBC the **opposite** **operations** are done:
![https://defuse.ca/images/cbc\_decryption.png](https://defuse.ca/images/cbc\_decryption.png)
Notice how it's needed to use an **encryption** **key** and an **IV**.
## Message Padding
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**.
## Padding Oracle
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**.
### How to exploit
You could use [https://github.com/AonCyberLabs/PadBuster](https://github.com/AonCyberLabs/PadBuster) to exploit this kind of vulnerability or just do
```
sudo apt-get install padbuster
```
Π©ΠΎΠ± ΠΏΠ΅ΡΠ΅Π²ΡΡΠΈΡΠΈ, ΡΠΈ Π²ΡΠ°Π·Π»ΠΈΠ²ΠΈΠΉ ΠΊΡΠΊΡ ΡΠ°ΠΉΡΡ, Π²ΠΈ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΡΠΏΡΠΎΠ±ΡΠ²Π°ΡΠΈ:
```bash
perl ./padBuster.pl http://10.10.10.10/index.php "RVJDQrwUdTRWJUVUeBKkEA==" 8 -encoding 0 -cookies "login=RVJDQrwUdTRWJUVUeBKkEA=="
```
**ΠΠΎΠ΄ΡΠ²Π°Π½Π½Ρ 0** ΠΎΠ·Π½Π°ΡΠ°Ρ, ΡΠΎ **base64** Π²ΠΈΠΊΠΎΡΠΈΡΡΠΎΠ²ΡΡΡΡΡΡ (Π°Π»Π΅ Π΄ΠΎΡΡΡΠΏΠ½Ρ ΠΉ ΡΠ½ΡΡ, ΠΏΠ΅ΡΠ΅Π²ΡΡΡΠ΅ ΠΌΠ΅Π½Ρ Π΄ΠΎΠΏΠΎΠΌΠΎΠ³ΠΈ).
ΠΠΈ ΡΠ°ΠΊΠΎΠΆ ΠΌΠΎΠΆΠ΅ΡΠ΅ **Π·Π»ΠΎΠ²ΠΆΠΈΠ²Π°ΡΠΈ ΡΡΡΡ Π²ΡΠ°Π·Π»ΠΈΠ²ΡΡΡΡ Π΄Π»Ρ ΡΠΈΡΡΡΠ²Π°Π½Π½Ρ Π½ΠΎΠ²ΠΈΡ
Π΄Π°Π½ΠΈΡ
. ΠΠ°ΠΏΡΠΈΠΊΠ»Π°Π΄, ΡΡΠ²ΡΡΡ, ΡΠΎ Π²ΠΌΡΡΡ cookie Ρ "**_**user=MyUsername**_**", ΡΠΎΠ΄Ρ Π²ΠΈ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π·ΠΌΡΠ½ΠΈΡΠΈ ΠΉΠΎΠ³ΠΎ Π½Π° "\_user=administrator\_" Ρ ΠΏΡΠ΄Π²ΠΈΡΠΈΡΠΈ ΠΏΡΠΈΠ²ΡΠ»Π΅Ρ Π² Π΄ΠΎΠ΄Π°ΡΠΊΡ. ΠΠΈ ΡΠ°ΠΊΠΎΠΆ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π·ΡΠΎΠ±ΠΈΡΠΈ ΡΠ΅, Π²ΠΈΠΊΠΎΡΠΈΡΡΠΎΠ²ΡΡΡΠΈ `paduster`, Π²ΠΊΠ°Π·ΡΡΡΠΈ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡ -plaintext**:
```bash
perl ./padBuster.pl http://10.10.10.10/index.php "RVJDQrwUdTRWJUVUeBKkEA==" 8 -encoding 0 -cookies "login=RVJDQrwUdTRWJUVUeBKkEA==" -plaintext "user=administrator"
```
Π―ΠΊΡΠΎ ΡΠ°ΠΉΡ Π²ΡΠ°Π·Π»ΠΈΠ²ΠΈΠΉ, `padbuster` Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ½ΠΎ ΡΠΏΡΠΎΠ±ΡΡ Π·Π½Π°ΠΉΡΠΈ, ΠΊΠΎΠ»ΠΈ Π²ΠΈΠ½ΠΈΠΊΠ°Ρ ΠΏΠΎΠΌΠΈΠ»ΠΊΠ° Π·Π°ΠΏΠΎΠ²Π½Π΅Π½Π½Ρ, Π°Π»Π΅ Π²ΠΈ ΡΠ°ΠΊΠΎΠΆ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π²ΠΊΠ°Π·Π°ΡΠΈ ΠΏΠΎΠ²ΡΠ΄ΠΎΠΌΠ»Π΅Π½Π½Ρ ΠΏΡΠΎ ΠΏΠΎΠΌΠΈΠ»ΠΊΡ, Π²ΠΈΠΊΠΎΡΠΈΡΡΠΎΠ²ΡΡΡΠΈ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡ **-error**.
```bash
perl ./padBuster.pl http://10.10.10.10/index.php "" 8 -encoding 0 -cookies "hcon=RVJDQrwUdTRWJUVUeBKkEA==" -error "Invalid padding"
```
### Π’Π΅ΠΎΡΡΡ
Π£ **ΡΠ΅Π·ΡΠΌΠ΅**, Π²ΠΈ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΠΏΠΎΡΠ°ΡΠΈ ΡΠΎΠ·ΡΠΈΡΡΠΎΠ²ΡΠ²Π°ΡΠΈ Π·Π°ΡΠΈΡΡΠΎΠ²Π°Π½Ρ Π΄Π°Π½Ρ, Π²Π³Π°Π΄ΡΡΡΠΈ ΠΏΡΠ°Π²ΠΈΠ»ΡΠ½Ρ Π·Π½Π°ΡΠ΅Π½Π½Ρ, ΡΠΊΡ ΠΌΠΎΠΆΠ½Π° Π²ΠΈΠΊΠΎΡΠΈΡΡΠΎΠ²ΡΠ²Π°ΡΠΈ Π΄Π»Ρ ΡΡΠ²ΠΎΡΠ΅Π½Π½Ρ Π²ΡΡΡ
**ΡΡΠ·Π½ΠΈΡ
Π·Π°ΠΏΠΎΠ²Π½Π΅Π½Ρ**. ΠΠΎΡΡΠΌ Π°ΡΠ°ΠΊΠ° Π½Π° Π·Π°ΠΏΠΎΠ²Π½Π΅Π½Π½Ρ Oracle ΠΏΠΎΡΠ½Π΅ ΡΠΎΠ·ΡΠΈΡΡΠΎΠ²ΡΠ²Π°ΡΠΈ Π±Π°ΠΉΡΠΈ Π· ΠΊΡΠ½ΡΡ Π½Π° ΠΏΠΎΡΠ°ΡΠΎΠΊ, Π²Π³Π°Π΄ΡΡΡΠΈ, ΡΠΊΠ΅ Π±ΡΠ΄Π΅ ΠΏΡΠ°Π²ΠΈΠ»ΡΠ½Π΅ Π·Π½Π°ΡΠ΅Π½Π½Ρ, ΡΠΎ **ΡΡΠ²ΠΎΡΡΡ Π·Π°ΠΏΠΎΠ²Π½Π΅Π½Π½Ρ 1, 2, 3 ΡΠΎΡΠΎ**.
![](<../.gitbook/assets/image (561).png>)
Π£ΡΠ²ΡΡΡ, ΡΠΎ Ρ Π²Π°Ρ Ρ Π΄Π΅ΡΠΊΠΈΠΉ Π·Π°ΡΠΈΡΡΠΎΠ²Π°Π½ΠΈΠΉ ΡΠ΅ΠΊΡΡ, ΡΠΊΠΈΠΉ Π·Π°ΠΉΠΌΠ°Ρ **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.
### ΠΠΎΡΠΈΠ»Π°Π½Π½Ρ
* [https://en.wikipedia.org/wiki/Block\_cipher\_mode\_of\_operation](https://en.wikipedia.org/wiki/Block\_cipher\_mode\_of\_operation)
{% hint style="success" %}
Learn & practice AWS Hacking:[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)\
Learn & practice GCP Hacking: [**HackTricks Training GCP Red Team Expert (GRTE)**](https://training.hacktricks.xyz/courses/grte)
Support HackTricks
* Check the [**subscription plans**](https://github.com/sponsors/carlospolop)!
* **Join the** π¬ [**Discord group**](https://discord.gg/hRep4RUj7f) or the [**telegram group**](https://t.me/peass) or **follow** us on **Twitter** π¦ [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
* **Share hacking tricks by submitting PRs to the** [**HackTricks**](https://github.com/carlospolop/hacktricks) and [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
{% endhint %}