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
Da biste testirali da li je kolačić sajta ranjiv, možete pokušati:
Encoding 0 znači da se koristi base64 (ali su dostupni i drugi, proverite meni pomoći).
Takođe možete iskoristiti ovu ranjivost da enkriptujete nove podatke. Na primer, zamislite da je sadržaj kolačića "user=MyUsername", tada ga možete promeniti u "_user=administrator_" i eskalirati privilegije unutar aplikacije. Takođe to možete uraditi koristeći paduster
specifikujući -plaintext parametar:
Ako je sajt ranjiv, padbuster
će automatski pokušati da pronađe kada se javlja greška u dodavanju, ali takođe možete naznačiti poruku o grešci koristeći -error parametar.
U kratko, možete početi dekriptovanje enkriptovanih podataka pogađanjem ispravnih vrednosti koje se mogu koristiti za kreiranje svih različitih popuna. Tada će napad na oracle za popunjavanje početi dekriptovanje bajtova od kraja ka početku pogađajući koja će biti ispravna vrednost koja stvara popunu od 1, 2, 3, itd.
Zamislite da imate neki enkriptovani tekst koji zauzima 2 bloka formirana bajtovima od E0 do E15. Da biste dekriptovali poslednji blok (E8 do E15), ceo blok prolazi kroz "dekriptovanje blok šifre" generišući intermedijarne bajtove I0 do I15. Na kraju, svaki intermedijarni bajt se XOR-uje sa prethodnim enkriptovanim bajtovima (E0 do E7). Tako:
C15 = D(E15) ^ E7 = I15 ^ E7
C14 = I14 ^ E6
C13 = I13 ^ E5
C12 = I12 ^ E4
...
Sada, moguće je modifikovati E7
dok C15
ne bude 0x01
, što će takođe biti ispravna popuna. Dakle, u ovom slučaju: \x01 = I15 ^ E'7
Dakle, pronalaženjem E'7, moguće je izračunati I15: I15 = 0x01 ^ E'7
Što nam omogućava da izračunamo C15: C15 = E7 ^ I15 = E7 ^ \x01 ^ E'7
Znajući C15, sada je moguće izračunati C14, ali ovaj put brute-forcing popunu \x02\x02
.
Ovaj BF je jednako složen kao prethodni jer je moguće izračunati E''15
čija je vrednost 0x02: E''7 = \x02 ^ I15
tako da je samo potrebno pronaći E'14
koja generiše C14
jednaku 0x02
.
Zatim, uradite iste korake da dekriptujete C14: C14 = E6 ^ I14 = E6 ^ \x02 ^ E''6
Pratite ovaj lanac dok ne dekriptujete ceo enkriptovani tekst.
Registrujte se i otvorite nalog i prijavite se sa ovim nalogom. Ako se prijavite više puta i uvek dobijate isti kolačić, verovatno postoji nešto pogrešno u aplikaciji. Kolačić koji se vraća treba da bude jedinstven svaki put kada se prijavite. Ako je kolačić uvek isti, verovatno će uvek biti važeći i neće biti načina da se on nevaži.
Sada, ako pokušate da modifikujete kolačić, možete videti da dobijate grešku iz aplikacije. Ali ako BF popunu (koristeći padbuster na primer) uspete da dobijete drugi kolačić važeći za drugog korisnika. Ovaj scenario je veoma verovatno ranjiv na padbuster.
Učite i vežbajte AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Učite i vežbajte GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)