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.

Ключові моменти кодування Юнікоду

Розуміння кодування Юнікоду є ключовим, особливо при вирішенні проблем взаємодії між різними системами або мовами. Ось основні моменти:

  • Кодові точки та символи: У Юнікоді кожному символу або символу призначається числове значення, відоме як "кодова точка".

  • Представлення байтів: Кодова точка (або символ) представлена одним або кількома байтами в пам'яті. Наприклад, символи LATIN-1 (поширені в англомовних країнах) представлені за допомогою одного байта. Однак мови з більшим набором символів потребують більше байтів для представлення.

  • Кодування: Цей термін вказує на те, як символи перетворюються в послідовність байтів. UTF-8 є поширеним стандартом кодування, де символи ASCII представлені одним байтом, а до чотирьох байтів для інших символів.

  • Обробка даних: Системи, що обробляють дані, повинні знати кодування, щоб правильно перетворити потік байтів у символи.

  • Варіанти UTF: Окрім UTF-8, існують інші стандарти кодування, такі як UTF-16 (використання мінімуму 2 байтів, до 4) та UTF-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

Виявлення

Якщо ви можете знайти у веб-додатку значення, яке повертається назад, ви можете спробувати відправити 'ЗНАК КЕЛЬВІНА' (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

XSS (Cross Site Scripting)

Ви можете використати один з наступних символів, щоб обманути веб-додаток та використати XSS:

Зверніть увагу, що, наприклад, перший запропонований символ Unicode може бути відправлений як: %e2%89%ae або як %u226e

Fuzzing Regexes

Коли задній кінець перевіряє введення користувача за допомогою регулярного виразу, можливо, що вхідні дані нормалізуються для регулярного виразу, але не для того, де вони використовуються. Наприклад, в випадку відкритого перенаправлення або SSRF регулярний вираз може нормалізувати відправлений URL, а потім доступати до нього як є.

Інструмент recollapse дозволяє генерувати варіації введення для тестування заднього кінця. Для отримання додаткової інформації перевірте github та цей пост.

References

Вивчайте хакінг AWS від нуля до героя з htARTE (HackTricks AWS Red Team Expert)!

Інші способи підтримки HackTricks:

Last updated