hacktricks/pentesting-web/unicode-injection/unicode-normalization.md

9 KiB
Raw Blame History

Unicode Normalizasyonu

AWS hacklemeyi sıfırdan kahramana öğrenin htARTE (HackTricks AWS Red Team Expert) ile!

HackTricks'ı desteklemenin diğer yolları:

Bu, şu özetin bir özeti: https://appcheck-ng.com/unicode-normalization-vulnerabilities-the-special-k-polyglot/. Daha fazla ayrıntı için bakın (resimler oradan alınmıştır).

Unicode ve Normalizasyonun Anlaşılması

Unicode normalizasyonu, karakterlerin farklı ikili temsillerinin aynı ikili değere standart hale getirildiği bir süreçtir. Bu süreç, programlama ve veri işleme süreçlerinde dizilerle uğraşırken hayati öneme sahiptir. Unicode standardı iki tür karakter eşdeğerliği tanımlar:

  1. Kanonik Eşdeğerlik: Karakterler, yazıldığında veya görüntülendiğinde aynı görünüme ve anlama sahipse kanonik olarak eşdeğer kabul edilir.
  2. Uyumluluk Eşdeğerlik: Karakterler aynı soyut karakteri temsil edebilir ancak farklı şekilde görüntülenebilirler.

Dört Unicode normalizasyon algoritması vardır: NFC, NFD, NFKC ve NFKD. Her algoritma, kanonik ve uyumluluk normalizasyon tekniklerini farklı şekilde kullanır. Daha derinlemesine anlamak için bu teknikleri Unicode.org üzerinde keşfedebilirsiniz.

Unicode Kodlaması Hakkında Ana Noktalar

Unicode kodlamasını anlamak, farklı sistemler veya diller arasındaki etkileşim sorunlarıyla uğraşırken özellikle önemlidir. İşte ana noktalar:

  • Kod Noktaları ve Karakterler: Unicode'da, her karakter veya sembol, "kod noktası" olarak bilinen bir sayısal değerle ilişkilendirilir.
  • Bayt Temsili: Kod noktası (veya karakter), bellekte bir veya daha fazla baytla temsil edilir. Örneğin, İngilizce konuşan ülkelerde yaygın olan LATIN-1 karakterleri bir bayt kullanılarak temsil edilir. Ancak, daha büyük bir karakter kümesine sahip diller, temsil için daha fazla bayt gerektirir.
  • Kodlama: Bu terim, karakterlerin bir dizi bayta nasıl dönüştürüldüğünü ifade eder. UTF-8, ASCII karakterlerinin bir bayt kullanılarak temsil edildiği yaygın bir kodlama standardıdır ve diğer karakterler için dört bayta kadar kullanılır.
  • Veri İşleme: Veri işleyen sistemler, bayt akışını doğru şekilde karakterlere dönüştürmek için kullanılan kodlamayı bilmelidir.
  • UTF Çeşitleri: UTF-8'in yanı sıra, UTF-16 (en az 2 bayt, en fazla 4 bayt) ve UTF-32 (tüm karakterler için 4 bayt kullanımı) gibi diğer kodlama standartları bulunmaktadır.

Bu kavramları etkili bir şekilde anlamak, Unicode'ın karmaşıklığından ve çeşitli kodlama yöntemlerinden kaynaklanabilecek potansiyel sorunları etkili bir şekilde ele almak için önemlidir.

İki farklı karakteri temsil eden iki farklı baytın Unicode'u nasıl normalize ettiğine dair bir örnek:

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

Unicode eşdeğer karakterlerin bir listesine buradan ulaşabilirsiniz: https://appcheck-ng.com/wp-content/uploads/unicode_normalization.html ve https://0xacb.com/normalization_table

Keşfetme

Eğer bir web uygulamasında geriye yansıtılan bir değer bulabilirseniz, 'KELVİN İŞARETİ' (U+0212A) gönderebilirsiniz ki bu da "K" olarak normalize edilir (bu şekilde gönderebilirsiniz %e2%84%aa). Eğer geriye bir "K" yansıtılıyorsa, bir tür Unicode normalizasyonu gerçekleştiriliyor demektir.

Diğer örnek: %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 unicode'den sonra Leonishan haline gelir.

Zayıf Örnekler

SQL Injection filtresi atlatma

Kullanıcı girdisiyle SQL sorguları oluşturmak için karakter ' kullanan bir web sayfasını hayal edin. Bu web sitesi, güvenlik önlemi olarak, kullanıcı girdisindeki tüm ' karakterlerini siler, ancak bu silme işleminden sonra ve sorgunun oluşturulmadan önce, kullanıcı girdisini Unicode kullanarak normalize eder.

Bu durumda, kötü niyetli bir kullanıcı, ' (0x27)'ye eşdeğer farklı bir Unicode karakteri ekleyebilir, örneğin %ef%bc%87, girdi normalize edildiğinde tek tırnak oluşturulur ve bir SQL Injection açığı ortaya çıkar:

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

Bazı ilginç Unicode karakterler

  • 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 şablonu

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

XSS (Cross Site Scripting)

Web uygulamasını kandırmak ve XSS açığını sömürmek için aşağıdaki karakterlerden birini kullanabilirsiniz:

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

Örneğin, ilk Unicode karakteri %e2%89%ae veya %u226e olarak gönderilebilir.

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

Regex Fuzzing

Arka uç, kullanıcı girişini bir regex ile kontrol ederken, girişin regex için normalize edildiği ancak kullanıldığı yer için normalize edilmediği olabilir. Örneğin, bir Açık Yönlendirme veya SSRF'de regex, gönderilen URL'yi normalize edebilir ancak olduğu gibi erişebilir.

recollapse aracı, arka ucu fuzzlemek için girişin varyasyonlarını oluşturmayı sağlar. Daha fazla bilgi için github ve bu gönderiye bakın.

Referanslar

Sıfırdan başlayarak AWS hacklemeyi htARTE (HackTricks AWS Red Team Expert) ile öğrenin!

HackTricks'ı desteklemenin diğer yolları: