Unicode Normalization
Це резюме: https://appcheck-ng.com/unicode-normalization-vulnerabilities-the-special-k-polyglot/. Перегляньте для отримання додаткових деталей (зображення взяті звідти).
Розуміння Юнікоду та Нормалізації
Нормалізація Юнікоду - це процес, який забезпечує стандартизацію різних двійкових представлень символів до одного і того ж самого двійкового значення. Цей процес є важливим при роботі з рядками в програмуванні та обробці даних. Стандарт Юнікоду визначає два типи еквівалентності символів:
Канонічна Еквівалентність: Символи вважаються канонічно еквівалентними, якщо вони мають однаковий вигляд і значення при друку або відображенні.
Сумісна Еквівалентність: Слабший вид еквівалентності, де символи можуть представляти той самий абстрактний символ, але відображатися по-різному.
Існує чотири алгоритми нормалізації Юнікоду: NFC, NFD, NFKC та NFKD. Кожен алгоритм використовує канонічні та сумісні техніки нормалізації по-різному. Для більш глибокого розуміння ви можете дослідити ці техніки на Unicode.org.
Ключові моменти кодування Юнікоду
Розуміння кодування Юнікоду є ключовим, особливо при вирішенні проблем взаємодії між різними системами або мовами. Ось основні моменти:
Кодові точки та символи: У Юнікоді кожному символу або символу призначається числове значення, відоме як "кодова точка".
Представлення байтів: Кодова точка (або символ) представлена одним або кількома байтами в пам'яті. Наприклад, символи LATIN-1 (поширені в англомовних країнах) представлені за допомогою одного байта. Однак мови з більшим набором символів потребують більше байтів для представлення.
Кодування: Цей термін вказує на те, як символи перетворюються в послідовність байтів. UTF-8 є поширеним стандартом кодування, де символи ASCII представлені одним байтом, а до чотирьох байтів для інших символів.
Обробка даних: Системи, що обробляють дані, повинні знати кодування, щоб правильно перетворити потік байтів у символи.
Варіанти UTF: Окрім UTF-8, існують інші стандарти кодування, такі як UTF-16 (використання мінімуму 2 байтів, до 4) та UTF-32 (використання 4 байтів для всіх символів).
Важливо розуміти ці концепції для ефективної роботи з потенційними проблемами, що виникають від складності Юнікоду та його різних методів кодування.
Приклад того, як Юнікод нормалізує два різні байти, що представляють один і той самий символ:
Список еквівалентних символів Юнікоду можна знайти тут: 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%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
Шаблон sqlmap
XSS (Cross Site Scripting)
Ви можете використати один з наступних символів, щоб обманути веб-додаток та використати XSS:
Зверніть увагу, що, наприклад, перший запропонований символ Unicode може бути відправлений як: %e2%89%ae
або як %u226e
Fuzzing Regexes
Коли задній кінець перевіряє введення користувача за допомогою регулярного виразу, можливо, що вхідні дані нормалізуються для регулярного виразу, але не для того, де вони використовуються. Наприклад, в випадку відкритого перенаправлення або SSRF регулярний вираз може нормалізувати відправлений URL, а потім доступати до нього як є.
Інструмент recollapse дозволяє генерувати варіації введення для тестування заднього кінця. Для отримання додаткової інформації перевірте github та цей пост.
References
Last updated