Padding Oracle
CBC - Cipher Block Chaining
U CBC modu, prethodni enkriptovani blok se koristi kao IV za XOR sa sledećim blokom:
![](https://book.hacktricks.xyz/~gitbook/image?url=https%3A%2F%2Fdefuse.ca%2Fimages%2Fcbc_encryption.png&width=768&dpr=4&quality=100&sign=b64f8495&sv=1)
Da bi se dekriptovao CBC, vrše se suprotne operacije:
![](https://book.hacktricks.xyz/~gitbook/image?url=https%3A%2F%2Fdefuse.ca%2Fimages%2Fcbc_decryption.png&width=768&dpr=4&quality=100&sign=c360e6cd&sv=1)
Primetite kako je potrebno koristiti ključ za enkripciju i IV.
Message Padding
Kako se enkripcija vrši u fiksnim veličinama blokova, obično je potrebno paddovanje u poslednjem bloku da bi se završila njegova dužina.
Obično se koristi PKCS7, koji generiše padding ponavljajući broj bajtova potrebnih da se završi blok. Na primer, ako poslednjem bloku nedostaje 3 bajta, padding će biti \x03\x03\x03
.
Pogledajmo više primera sa 2 bloka dužine 8 bajtova:
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 |
Primetite kako je u poslednjem primeru poslednji blok bio pun, pa je generisan još jedan samo sa paddingom.
Padding Oracle
Kada aplikacija dekriptuje enkriptovane podatke, prvo će dekriptovati podatke; zatim će ukloniti padding. Tokom čišćenja paddinga, ako nevalidan padding izazove uočljivo ponašanje, imate padding oracle ranjivost. Uočljivo ponašanje može biti greška, nedostatak rezultata, ili sporiji odgovor.
Ako primetite ovo ponašanje, možete dekriptuju enkriptovane podatke i čak enkriptovati bilo koji čist tekst.
How to exploit
Možete koristiti https://github.com/AonCyberLabs/PadBuster da iskoristite ovu vrstu ranjivosti ili samo uradite
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 punjenju, ali takođe možete naznačiti poruku o grešci koristeći -error parametar.
Teorija
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 chain dok ne dekriptujete ceo enkriptovani tekst.
Otkrivanje ranjivosti
Registrujte se i otvorite nalog i prijavite se sa tim nalogom. Ako se prijavljujete 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-ujete 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.
Reference
Last updated